Obsługa myszki PS/2

Zadanie: Układ ma odczytywać dane z dołączonej myszki. Myszka jest typu USB, ale na płytce znajduje się mikrokontroler dokonujący konwersji komunikacji HID USB na protokół PS/2 – który wykorzystujemy w ćwiczeniu. Jest to komunikacja szeregowa, synchroniczna. Może być ona dwukierunkowa, ale w ćwiczeniu wykorzystujemy tylko odczyt danych z myszki.
Działanie układu ma polegać na edycji 4 cyfr heksadecymalnych wyświetlanych na wyświetlaczu LED (po wczytaniu projektu do FPGA powinno się wyświetlić 0.000). Przesuwanie myszki w lewo i w prawo powinno odpowiednio przesuwać kropkę dziesiętną. Po dojściu do brzegowych wyświetlaczy kropka się zatrzymuje. Z kolei przesuwanie myszki do przodu i do tyłu powinno zmieniać cyfrę wyświetlaną na pozycji na której znajduje się kropka. Przesuwanie do przodu powinno zwiększać, a do tyłu zmniejszać wyświetlaną cyfrę. Przekroczenie wartości F powinno wyświetlić 0 i odwrotnie.
Dodatkowo naciśnięcie lewego przycisku myszki powinno wyłączać możliwość edycji – kropka gaśnie. Ponowne naciśnięcie lewego przycisku zapala kropkę na skrajnej lewej pozycji bez zmiany zawartości wyświetlaczy – edycja jest możliwa. Czułość ustawiania pozycji kropki powinna wynosić około 8mm na kropkę, czułość ustawiania wartości wyświetlanej powinna być 4 razy większa.

Uwaga: Jeżeli myszka USB nie jest podłączona - należy podłączyć ją do gniazda USB na płytce prototypowej BASYS 3. Można wykorzystywać wyłącznie myszki z rolką.

W tym ćwiczeniu nie korzystamy z sygnału „reset”. Należy używać wartości początkowych sygnałów i zmiennych.

 

Sygnały „ps2_clk_i” oraz „ps2_data_i” to interfejs myszki (po konwersji do standardu PS/2). Należy zrealizować wyłącznie jego odczyt (sygnały danych i zegara powinny mieć zdefiniowany kierunek in).


Rys.1  Transmisja pojedynczego bajtu za pośrednictwem interfejsu PS/2.

Dane z myszki wysyłane są szeregowo w następującej kolejności:

- 1 bit startu (zawsze 0);

- 8 bitów danych (najpierw najmniej znaczący bit);

- 1 bit parzystości (jeśli liczba jedynek jest parzysta, to bit parzystości = 1);

- 1 bit stopu (zawsze 1).

Bity danych są odczytywane podczas opadającego zbocza zegara.

Myszka wysyła dane jeżeli została poruszona, nastąpił ruch rolki lub zmiana stanu klawiszy. W pojedynczej transmisji myszka wysyła 4 bajty (jeden za drugim). Wysyła więc 44 zbocza opadające zegara. Znaczenie poszczególnych bitów takiego transferu jest następujące:

 

Stop

Parity

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

Start

1

P

Y overflow

X overflow

Y sign

X sign

1

Middle Button

Right Button

Left Button

0

1

P

X movement (bit0 = LSB)

0

1

P

Y movement (bit0 = LSB)

0

1

P

0

0

5th Button

4th Button

Z3
(MSB)

Z2

Z1

Z0

(LSB)

0

 

P – parzystość (można zignorować),

Button – 1 jeżeli naciśnięty, 0 jeżeli zwolniony,
X,Y movement – przesunięcie od ostatniego odczytu (kod U2),

X,Y sign – najstarszy bit przesunięcia (MSB),
X,Y overflow – przepełnienie (można zignorować),

Z3-Z0 – ruch rolki w kodzie U2 (zakres -8 do +7).

 

Szczegółowe informacje o działaniu interfejsu myszki PS/2 można znaleźć w poniższym linku: https://isdaman.com/alsos/hardware/mouse/ps2interface.htm

 

Szczegółowe informacje o działaniu interfejsu klawiatury PS/2 można znaleźć w poniższym linku: Informacje dodatkowe - odczyt klawiatury

 

Wskazówki:

W najprostszej implementacji bity startu, stopu i parzystości można zignorować.

Ponieważ myszka podaje przesunięcia od poprzedniego odczytu, należy zaimplementować akumulatory ruchu X i Y myszki. Rozdzielczość domyślna typowej myszki wynosi 800 DPI, co oznacza przesunięcie o wartość 32 na każdy milimetr ruchu myszki (w przybliżeniu).

Należy pamiętać, że wejście „ps2_clk_i” nie powinno pełnić funkcji wejścia zegarowego i w związku z tym nie powinno się podłączać tego wejścia do wejść zegarowych przerzutników. Wejście to należy próbkować tak jak wejście danych (pamiętając o wstępnej synchronizacji z lokalnym zegarem).

Jeżeli ktoś zdecyduje się jednak na potraktowanie „ps2_clk_i” jako zegara to należy pamiętać o prawidłowym przejściu sygnałów między domenami obu zegarów („ps2_clk_i” oraz „clk_i”). Należy także usunąć znak komentarza przy definicji zegara „ps2_clk_i” w pliku z ograniczeniami (.xdc). Sugestia: przejście pomiędzy domenami najlepiej jest zrealizować dopiero w multiplekserze sygnałów „digit_i” modułu DISPLAY (obsługującego wyświetlacz LED). Odbywa się wtedy ono bez udziału przerzutników (o ile w module DISPLAY nie zostały dodane jakieś nadmiarowe przerzutniki), więc nie wywołuje krytycznych ostrzeżeń syntezera, a także nie ma wpływu na działanie układu.

 

Należy wykonać symulację funkcjonalną oraz zweryfikować układ praktycznie poprzez zaprogramowanie płytki testowej.

 

Minimalne wymagania dotyczące symulacji i weryfikacji na płytce: wykonać symulację i weryfikację na płytce ruchów myszki wprowadzających na wyświetlacz 4 najmłodsze cyfry numeru indeksu studenta (lub jednego studenta z grupy) zaliczającego ćwiczenie. Dodatkowo weryfikacja na płytce powinna także zademonstrować włączanie i wyłączanie trybu edycji, prawidłowość ruchu kropki i prawidłowość zmiany cyfr w obie strony z przekraczaniem zakresu. Częstotliwość zegara „clk_i” w symulacji – 100 MHz. Częstotliwość zegara „ps2_clk_i” w symulacji – 30 kHz.

 

Fragment głównego pliku projektowego VHDL z deklaracją sygnałów:

 

entity top is

    Port ( clk_i : in STD_LOGIC;

           ps2_clk_i : in STD_LOGIC;

           ps2_data_i : in STD_LOGIC;

           led7_an_o : out STD_LOGIC_VECTOR (3 downto 0);

           led7_seg_o : out STD_LOGIC_VECTOR (7 downto 0));

end top;

 

Wyświetlacz LED
Rys.2 Opis podłączeń poszczególnych segmentów wyświetlacza. Przykład wyświetlenia cyfry '2'


Plik z ograniczeniami projektowymi dla płytki Basys 3 (układ FPGA xc7a35tcpg236-1):  iup8.xdc