DOKUMENTACJA PROJEKTU
Transkrypt
DOKUMENTACJA PROJEKTU
AKADEMIA GÓRNICZO-HUTNICZA w Krakowie KATEDRA ELEKTRONIKI DOKUMENTACJA PROJEKTU Projekt z przedmiotu Sprzętowa Implementacja Algorytmów: „Dekoder klawiatury na PS/2” Prowadzący: Dr inż. Paweł Russek Wykonali: Bogdan Tabor Piotr Stawiarski Elektronika, IV rok AGH ] 1 Wstęp teoretyczny Poniżej jest przedstawiony wtyk PS/2: Male Female (Plug) (Socket) 6-pin Mini-DIN (PS/2): 1 - Data 2 - Not Implemented 3 - Ground 4 - +5v 5 - Clock 6 - Not Implemented Przy czym częstotliwość przebiegu zegarowego z klawiatury zawiera się w przedziale 10-16.7 kHz. Naciśnięcie klawisza na klawiaturze lub też jego puszczenie jest sygnalizowane poprzez wysłanie do Hosta (w naszym przypadku komputer klasy PC) sekwencji odpowiednich ramek. Sekwencje te zostały przedstawione w dołączonej do dokumentacji tabeli. Zawiera ona pary MAKE CODE oraz BREAK CODE dla każdego klawisza. MAKE CODE to ramki wysyłane przy naciśnięciu klawisza a BREAK CODE przy jego puszczeniu. Poniżej przedstawiony jest sposób wysyłania ramki DATA do Host’a, w synchronizacji z opadającym zboczem zegara CLOCK (z klawiatury): Poniższe przebiegi obrazują wysłanie kodu klawisza „Q” (15h) (MC). Chan A odpowiada zegarowi z klawiatury natomiast Chan B przedstawia ramkę wysyłaną w synchronizacji z tym zegarem: --Należy zauważyć, że w przypadku przytrzymywania klawisza ciągle jest wysyłany jest jego MAKE CODE. 2. Opis układu zaimplementowanego w module XCV300PQ240. Głównym plikiem projektu jest little.bde, jest to tzw. top, zawiera on wszystkie pliki składające się na cały program. Little.bde posiada cztery wejścia, są to: KBDATA, KBCLK, CLK i RST. Dwa pierwsze wejścia to sygnały pochodzące wprost z klawiatury, która po naciśnięciu klawisza wysyła bity w ramce, transmisja ta jest synchronizowana jej własnym zegarem. Wyjściem elementu tworzą dwie magistrale wysyłające równolegle siedmiobitowe ramki sterujące wyświetlaczami segmentowymi oraz dziesięciobitowe wyjście LEDY, które ma za zadanie zapalać linijkę dziesięciu diod świecących. Pierwszy stopień to kbdecoder, jest to układ, który czyta szeregowo podawane bity z klawiatury, bity składane są w jedenastobitowe ramki. Z jedenastobitowej ramki osiem bitów, które tworzą właściwy kod klawisza, zostają równolegle wyprowadzane. Odczytywanie bitów z wejścia KBDATA jest synchronizowane zegarem generowanym także przez klawiaturę, podawanym na wejście KBCLK. RST : in STD_LOGIC; --sygnal zerujacy KBDATA : in STD_LOGIC; --dana wysylana z klawiatury KBCLK : in STD_LOGIC; --zewn. zegar z klawiatury DATA : out STD_LOGIC_VECTOR(7 downto 0) --8 bitowe dane wyslane z klaw. Drugi stopień: decision odbiera ośmiobitową ramkę DATAIN, sprawdza czy ramka jest różna od F0 lub E0, następnie w zależności od wyniku komparacji zapisuje ramkę do rejestru FRAME1 lub FRAME2. Jeżeli ramka jest równa E0 lub F0 zapisujemy ją do odpowiedniego rejestru Frame (traktujemy jako BREAK CODE), gdy jest różna do E0 i F0 (traktujemy jako MAKE CODE). Sygnał wyjściowy OK sygnalizuje ważność danych na wyjściach FRAME1, FRAME2, aktywny jest stanem wysokim. DATAIN : in STD_LOGIC_VECTOR(7 downto 0); --8 bitowe dane wyslane z klaw. FRAME_1 : inout STD_LOGIC_VECTOR(7 downto 0); FRAME_2 : inout STD_LOGIC_VECTOR(7 downto 0); OK : inout STD_LOGIC Oprócz tego do pamiętania ramki poprzedniej w przypasku otrzymywania BREAK CODE (2 – ie ramki) wykorzystywane są sygnały: signal WAIT_FOR : STD_LOGIC; signal TEMP : STD_LOGIC_VECTOR(7 downto 0); Trzeci blok ps22ascii posiada wejścia: CLK : in STD_LOGIC; FRAME1 : in STD_LOGIC_VECTOR(7 downto 0); FRAME2 : in STD_LOGIC_VECTOR(7 downto 0); OK : in STD_LOGIC; RST :in STD_LOGIC; oraz wyjścia: ASCIIO : out STD_LOGIC_VECTOR(3 downto 0); ASCIIY : out STD_LOGIC_VECTOR(3 downto 0); LEDY : out STD_LOGIC_VECTOR(9 downto 0) Na podstawie wejść FRAME1, FRAME2 i OK analizuje on swoją tablice przekodowań i na jej podstawie wysyła na swoje wyjścia ASCII,ASCII i LEDY odpowiedni ciąg binarny. Ramka standardu PS/2 zostaje zamieniona na kod ASCII, duże litery i cyfry w kodzie ASCII mają odpowiedniki w postaci liczb dwucyfrowych, więc można łatwo je wizualizować na wyświetlaczach segmentowych w jakie jest wyposażony zestaw uruchomieniowy. Przekodowanie nie jest jednak typowym zapisem kodu ASCII w postaci binarnej, każda z dwóch cyfr kodowana jest oddzielnie na czterech bitach, daje to w sumie 8 bitów, cztery starsze bity podawane są na wejście dekodera ascii2seg, a młodsze cztery bity na wejścia dekodera ascii2segy. Przekodowanie realizuje proces coder, którego część zamieszczona została poniżej: coder:process(CLK,RST,FRAME1,FRAME2,OK) begin if (RST='1') then ASCIIO <= "0000";-- enter your statements here -ASCIIY <= "0000"; LEDY <= "0000000000"; elsif (CLK'event and CLK='0') then --dane sa wysylane wraz z opadajacym zboczem KBCLK if(FRAME1=x"1C" and FRAME2=x"00" and OK='1') then --A ASCIIo <="0110"; ASCIIY <="0101"; --65 CZTERY BITY NA 6 I CZTERY BITY NA 5 LEDY <= "0000000000"; itd dekodujemy wszystkie klawisze liter i cyfr.…….. elsif(FRAME1=x"E0" or FRAME2=x"F0")then LEDY <="1111111111";--diody zapalone end if; end if; end process coder; Wykonanie instrukcji warunkowej if powoduje zdekodowanie ciągu wejściowego, fizyczne puszczenie klawisza klawiatury powoduje pojawienie się ramki F0 lub E0, zdarzenie to jest sygnalizowane zapaleniem linijki diodowej. Tym sposobem zostało rozróżnione wciśnięcie + trzymanie klawisza od wciśnięcia i puszczenia. Puszczenie sygnalizuje zapalenie się diod. Poniżej została zamieszczona tabela kodów ASCII . Symbol Kod Symbol Kod klawisza klawisza 0 48 C 67 1 49 D 68 2 50 E 69 3 51 F 70 4 52 G 71 5 53 H 72 6 54 I 73 7 55 J 74 8 56 K 75 9 57 L 76 A 65 M. 77 B 66 N 78 Symbol O P Q R S T V U W X Y Z Kod klawisza 79 80 81 82 83 84 85 86 87 88 89 90 Wyjścia SEGO i SEGY są podłączone do dekoderów sterujących wyświetlaczami segmentowymi, wyjście LEDY do linijki diodowej Ascii2seg i ascii2segy to bliźniacze dekodery zamieniające kody cyfr na sygnały sterujące pracą wyświetlaczy segmentowych. Na podstawie wejścia ASCIIY wyprowadza sekwencje bitów na wyjście SEGY. Zaimplementowane jest to w procesie coder1. entity ascii2segy is port( CLK : in STD_LOGIC; RST : in STD_LOGIC; ASCIIY : in STD_LOGIC_VECTOR(3 downto 0); SEGY : out STD_LOGIC_VECTOR(6 downto 0) ); end ascii2segy; architecture ascii2segy of ascii2segy is begin coder1:process(CLK,RST,ASCIIY) begin if (RST='1') then SEGY <= "0000000"; elsif (CLK'event and CLK='0') then if (ASCIIY="0001")then SEGY <= "0010010"; elsif (ASCIIY="0010")then SEGY <= "1011101"; ………. else --0 -SEGY <= "1110111"; end if; end if; --with ASCIIY select end process coder1; end ascii2segy; --1 --2 Sposób sterowania wyświetlaczem segmentowym został przedstawiony poniżej: Sygnał SEGY został doprowadzony do wejść S0-S6 tak, że najstarszy bit ramki na wyjściu SEGY odpowiada S0 itd. Drugi wyświetlacz segmentowy sterowany jest w identyczny sposób przez identyczny dekoder. NOTKA INFORMACYJNA FORMAT DANYCH Z KLAWIATURY: DEKODOWANIE ASCII KLAWISZY: Symbol 0 1 2 3 4 5 6 7 8 9 A B Kod klawisza 48 49 50 51 52 53 54 55 56 57 65 66 Symbol C D E F G H I J K L M. N Kod klawisza 67 68 69 70 71 72 73 74 75 76 77 78 Symbol O P Q R S T V U W X Y Z Kod klawisza 79 80 81 82 83 84 85 86 87 88 89 90 NA WYŚWIETLACZACH WYŚWIETLANY JEST KOD NACIŚNIETEGO KLAWISZA W ASCII. LINIJKA DIÓD GAŚNIE W MOMENCIE PUSZCZENIA KLAWISZA. IMPLEMENTACJA NA XSV300PQ240 BLOKI: Kbdecoder – „wyłapywanie” 8 bitów z ramki wysłanej przez klawiaturę Decision – rozpoznanie rodzaju ramek: czy otrzymujemy MAKE CODE (naciśnięcie klawisza) czy BREAK CODE (puszczenie klawisza). Ps22ascii – ramka standardu PS/2 zostaje zamieniona na kod ASCII Ascii2seg i Ascii2segy - dekodery zamieniające kody cyfr na sygnały sterujące pracą wyświetlaczy segmentowych SYGNAŁY: CLK - wejście, główny sygnał zegarowy RST - wejście, sygnał zerujący KBCLK - wejście, zegar z klawiatury (10-16.7 kHz) KBDATA - wejście, ramki wysyłane z klawiatury, synchronicznie z KBCLK SEGO(6:0) - wyjście, sterowanie pierwszym wyświetlaczem SEGY(6:0) - wyjście, sterowanie pierwszym wyświetlaczem LEDY(9:0) - wyjście, sterowanie linijką diód