Diferență între revizuiri ale paginii „CID Lab Lucrarea 6”

De la WikiLabs
Jump to navigationJump to search
 
(Nu s-au afișat 6 versiuni intermediare efectuate de un alt utilizator)
Linia 6: Linia 6:
 
* [[Introducere în sinteza pe FPGA. Xilinx ISE]]
 
* [[Introducere în sinteza pe FPGA. Xilinx ISE]]
 
* Utilizarea programului de sinteză [[Tutorial Xilinx ISE|Xilinx ISE]]
 
* Utilizarea programului de sinteză [[Tutorial Xilinx ISE|Xilinx ISE]]
* [[Memorii ROM]]
+
* [[Circuite secvențiale]]
* [[Circuite secvențiale]], [[Numărătorul]]
+
* [[Memorii RAM]]
* [[Automate]], [[Tastatura PS2]]
 
  
 
== Cerințe ==
 
== Cerințe ==
  
* Realizați un automat care să citească ''scancode''-urile trimise de către o tastatură PS2. Aceasta va avea următoarele porturi:
+
* Descrieți în Verilog o memorie RAM 16x4b cu un port de citire-scriere sincron.
** 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);
+
* Legați adresa și data de intrare la switch-uri.
** 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);
+
* Legati semnalul de activare a scrierii la unul din butoane (BTN0 ... BTN3).
** ps2_data - este portul de intrare de date pe care se primesc serial (bit cu bit), datele de la tastatură;
+
* Legați ieșirea la leduri.
** scancode - este portul de ieșire, de tip registru, care stochează ultimul ''scancode'' primit;
+
* Scrieți adresele 3 6 și 10 cu valorile 2, 1 și 0 apoi citiți-le în aceeași ordine.
** 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!!!''': 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, deoarece acest pin nu este specificat ca semnal dedicat de ceas.
+
<!--
 +
[[Fișier:lab5.png|thumb|Schema bloc a circuitului]]
  
<syntaxhighlight lang="Verilog">
+
* Descrieți în Verilog un divizor de frecvență care să genereze un ceas cu frecvența de 250Hz. Scrieți un modul de test pentru acest circuit în care semnalul de ceas descris în modulul de test să fie aibă exact perioada ceasului prezent pe placa de dezvoltare. Simulați circuitul în Modelsim.
net "ps2_clock" clock_dedicated_route = "false";
+
* Descrieți în Verilog un generator de impulsuri cu factor de umplere variabil folosind un registru de numărare de 8 biți. Scrieți un modul de test pentru acest circuit în care semnalul de ceas descris în modulul de test să fie aibă exact perioada ceasului prezent pe placa de dezvoltare. Simulați circuitul în Modelsim.
</syntaxhighlight>
+
* Folosind modulele anterioare și blocuri de instanțiere, descrieți în Verilog un circuit (numit Blinker) care să respecte schema din figură. Explicați funcționarea lui. Sintetizați circuitul legând ieșirile la leduri și configurați FPGA-ul.
 +
* Descrieți în Verilog un numărător pe 3 biți care odată ajuns la valoarea maximă, să se decrementeze până la 0, și ajuns la 0 să se incrementeze până la valoarea maximă.
 +
* Descrieți în Verilog un decodor cu intrarea pe 3 biți.
 +
* Folosind modulele anterioare și un divizor de frecvență cu frecvența de ieșire de 4Hz, descrieți în Verilog prin blocuri de instanțiere un modul care să afișeze pe leduri ieșirea decodată a numărătorului care va funcționa la frecvența dată de divizorul de frecvență. Sintetizați circuitul și configurați FPGA-ul.
  
'''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 [http://digilentinc.com/Data/Products/NEXYS2/Nexys2_rm.pdf].
+
'''Atenție:''' Ieșirea generatorului cu factor de umplere variabil este de 1 bit. Acesta trebuie multiplicat de 8 ori pentru a putea fi legat la ieșirea out a modulului Blinker.
  
'''Observație''': Pinii necesari pentru conexiunea la interfața PS2 pe placa de dezvoltare Nexys 2 sunt R12 pentru ''ps2_clock'' și P11 pentru ''ps2_data''.
+
== Cerințe suplimentare (opționale) ==
  
== Cerințe suplimentare (opționale) ==
+
Descrieți în Verilog un circuit care să afișeze pe toate ledurile, în același timp, repetitiv, codul morse pentru SOS (. . . - - - . . .). Acest circuit vă poate salva viața!
  
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.
+
-->

Versiunea curentă din 19 aprilie 2015 19:51

Noțiuni și cunoștințe necesare

Cerințe

  • Descrieți în Verilog o memorie RAM 16x4b cu un port de citire-scriere sincron.
  • Legați adresa și data de intrare la switch-uri.
  • Legati semnalul de activare a scrierii la unul din butoane (BTN0 ... BTN3).
  • Legați ieșirea la leduri.
  • Scrieți adresele 3 6 și 10 cu valorile 2, 1 și 0 apoi citiți-le în aceeași ordine.