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 |
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;
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