CID Lab Lucrarea 6
De la WikiLabs
Noțiuni și cunoștințe necesare
- Logică booleană și sisteme de numerație
- Sintaxă Verilog
- Utilizarea programului de simulare ModelSim
- Introducere în sinteza pe FPGA. Xilinx ISE
- Utilizarea programului de sinteză Xilinx ISE
- Memorii ROM
- Circuite secvențiale, Numărătorul
- Automate, Tastatura PS2
Cerințe
- Realizați un automat care să citească scancodes trimise de către o tastatură PS2. Aceasta va avea următoarele porturi:
- reset - intrarea de reset a circuitului care aduce automatul în starea inițială (atenție, datorită sincronizării dintre bitul de date și ceasul PS2, acest automat necesită un port de reset asincron pentru a funcționa corect);
- ps2_clock - este intrarea de ceas pe care funcționează automatul, și care este produs de către interfața PS2 (atenție, circuitul este sensibil la frontul negativ de ceas);
- ps2_data - este portul de intrare de date pe care se primesc serial (bit cu bit), datele de la tastatură;
- scancode - este portul de ieșire, de tip registru, care stochează ultimul scancode primit;
- valid_code - este o ieșire de un bit care specifică dacă conținutul registrului de ieșire scancode este valid (a fost completat cu toți cei 8 biți și valoarea checksum se potrivește);
- Automatul are următoarele stări:
- STATE_READ_START_BIT - în această stare automatul așteaptă bitul de start (0), iar când acesta este produs, automatul trece în starea STATE_READ_SCANCODE, ieșirea valid_code devine 0, iar registrul intern de calcul al checksum devine și el 0;
- STATE_READ_SCANCODE - în această stare automatul, folosind un numărător de 3 biți, citește bit cu bit scancode-ul primit de la tastatură și bitul citit se adună la checksum; când numărătorul ajunge la valoarea maximă, automatul trece în starea STATE_READ_CHECKSUM;
- STATE_READ_CHECKSUM - valoarea checksum prezentă de pe portul de date se compară cu valoarea calculată în prealabil pentru toți biții scancode-ului iar dacă cele două valori sunt egale, ieșirea valid_code devine 1; automatul trece în starea STATE_READ_STOP_BIT;
- STATE_READ_STOP_BIT - automatul trece în starea STATE_READ_START_BIT.
- Realizați o memorie ROM care să facă tranziția de la scancode la valoarea numerică a tastei de la 0 la 9; pentru orice altă tastă, această memorie va da valoarea 4'd10.
- Folosind modulele anterioare și un modul de control pentru afișajul cu 7 segmente, realizați un circuit care să afișeze tasta numerică apăsată pe afisaj (pentru orice altă tastă apasată, se va afișa caracterul E urmat de punct).
Atenție!!!: Deoarece aceast nu este semnal dedicat de ceas, pentru a putea folosi semnalul primit de la pinul de ceas al interfeței PS2 ca semnal de ceas pentru un modul, în fișierul de constrângeri trebuie adăugată următoarea linie, unde ps2_clock este portul de intrare legat la pinul respectiv:
net "ps2_clock" clock_dedicated_route = "false";
Observație: Documentația completă a interfeței PS2 pentru placa de dezvolatare Nexys 2, inclusiv scancode-urile tastelor, se găsesc în manualul de referință al plăcii [1].
Cerințe suplimentare (opționale)
Realizați un modul Verilog care să permită stocarea unor figuri de afișaj pe 7 segmente într-o memorie RAM, apoi să afișeze conținutul memoriei deplasându-se de la dreapta la stânga, pe afișajul cu 7 segmente.