CID Lab Lucrarea 5: Diferență între versiuni

De la WikiLabs
Jump to navigationJump to search
Fără descriere a modificării
Linia 8: Linia 8:
* [[Generator de impulsuri cu factor de umplere variabil]]
* [[Generator de impulsuri cu factor de umplere variabil]]


== Cerințe ==
== Exemplu ==


* Realizați un circuit care să aprindă un led cu o intensitate variabilă, controlată de o valoare setată cu ajutorul switch-urilor SW7-SW0, folosind un generator cu factor de umplere variabil.
Realizați un circuit care să aprindă LD7 cu o intensitate variabilă, controlată de o valoare setată cu ajutorul switch-urilor SW7-SW0, folosind un generator de semnal cu factor de umplere variabil, bazat pe un numărător de 8 biți. Numărătorul va fi descris ca modul Verilog separat, și va fi instanțiat în generatorul de semnal.
* Realizați un circuit care să stingă apoi să aprindă un led treptat, folosind un generator de factor de umplere variabil.


<!--
== Exercițiu ==
* Realizați un automat care să citească ''scancode''-urile 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 diferite, 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.
Realizați un circuit care instanțiază 8 generatoare de semnal cu factor de umplere variabilă pentru a forma o rampă de intensitate pe LD7-LD0, cu următoarele caracteristici:
* Intensitatea LD0, notată I<sub>LD0</sub> este determinată de SW7-SW0
* Intensitățile LD0-7 respectă una din următoarele relații (cadrul didactiv va atribui fiecăruia din studenți una din relațiile de mai jos):
*# I<sub>LD0</sub> &lt; I<sub>LD1</sub> &lt; I<sub>LD2</sub> &lt; I<sub>LD3</sub> &lt; I<sub>LD4</sub> &lt; I<sub>LD5</sub> &lt; I<sub>LD6</sub> &lt; I<sub>LD7</sub>
*# I<sub>LD0</sub> &gt; I<sub>LD1</sub> &lt; I<sub>LD2</sub> &lt; I<sub>LD3</sub> &lt; I<sub>LD4</sub> &lt; I<sub>LD5</sub> &lt; I<sub>LD6</sub> &lt; I<sub>LD7</sub>
*# I<sub>LD0</sub> &gt; I<sub>LD1</sub> &gt; I<sub>LD2</sub> &lt; I<sub>LD3</sub> &lt; I<sub>LD4</sub> &lt; I<sub>LD5</sub> &lt; I<sub>LD6</sub> &lt; I<sub>LD7</sub>
*# I<sub>LD0</sub> &gt; I<sub>LD1</sub> &gt; I<sub>LD2</sub> &gt; I<sub>LD3</sub> &lt; I<sub>LD4</sub> &lt; I<sub>LD5</sub> &lt; I<sub>LD6</sub> &lt; I<sub>LD7</sub>
*# I<sub>LD0</sub> &gt; I<sub>LD1</sub> &gt; I<sub>LD2</sub> &gt; I<sub>LD3</sub> &gt; I<sub>LD4</sub> &lt; I<sub>LD5</sub> &lt; I<sub>LD6</sub> &lt; I<sub>LD7</sub>
*# I<sub>LD0</sub> &gt; I<sub>LD1</sub> &gt; I<sub>LD2</sub> &gt; I<sub>LD3</sub> &gt; I<sub>LD4</sub> &gt; I<sub>LD5</sub> &lt; I<sub>LD6</sub> &lt; I<sub>LD7</sub>
*# I<sub>LD0</sub> &gt; I<sub>LD1</sub> &gt; I<sub>LD2</sub> &gt; I<sub>LD3</sub> &gt; I<sub>LD4</sub> &gt; I<sub>LD5</sub> &gt; I<sub>LD6</sub> &lt; I<sub>LD7</sub>
*# I<sub>LD0</sub> &gt; I<sub>LD1</sub> &gt; I<sub>LD2</sub> &gt; I<sub>LD3</sub> &gt; I<sub>LD4</sub> &gt; I<sub>LD5</sub> &gt; I<sub>LD6</sub> &gt; I<sub>LD7</sub>


<syntaxhighlight lang="Verilog">
== Exercițiu Bonus ==
net "ps2_clock" clock_dedicated_route = "false";
</syntaxhighlight>


'''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].
Realizați un circuit care să stingă apoi să aprindă un led treptat, folosind un generator de factor de umplere variabil.
 
'''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) ==
 
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 de la data 19 aprilie 2015 21:09

Noțiuni și cunoștințe necesare

Exemplu

Realizați un circuit care să aprindă LD7 cu o intensitate variabilă, controlată de o valoare setată cu ajutorul switch-urilor SW7-SW0, folosind un generator de semnal cu factor de umplere variabil, bazat pe un numărător de 8 biți. Numărătorul va fi descris ca modul Verilog separat, și va fi instanțiat în generatorul de semnal.

Exercițiu

Realizați un circuit care instanțiază 8 generatoare de semnal cu factor de umplere variabilă pentru a forma o rampă de intensitate pe LD7-LD0, cu următoarele caracteristici:

  • Intensitatea LD0, notată ILD0 este determinată de SW7-SW0
  • Intensitățile LD0-7 respectă una din următoarele relații (cadrul didactiv va atribui fiecăruia din studenți una din relațiile de mai jos):
    1. ILD0 < ILD1 < ILD2 < ILD3 < ILD4 < ILD5 < ILD6 < ILD7
    2. ILD0 > ILD1 < ILD2 < ILD3 < ILD4 < ILD5 < ILD6 < ILD7
    3. ILD0 > ILD1 > ILD2 < ILD3 < ILD4 < ILD5 < ILD6 < ILD7
    4. ILD0 > ILD1 > ILD2 > ILD3 < ILD4 < ILD5 < ILD6 < ILD7
    5. ILD0 > ILD1 > ILD2 > ILD3 > ILD4 < ILD5 < ILD6 < ILD7
    6. ILD0 > ILD1 > ILD2 > ILD3 > ILD4 > ILD5 < ILD6 < ILD7
    7. ILD0 > ILD1 > ILD2 > ILD3 > ILD4 > ILD5 > ILD6 < ILD7
    8. ILD0 > ILD1 > ILD2 > ILD3 > ILD4 > ILD5 > ILD6 > ILD7

Exercițiu Bonus

Realizați un circuit care să stingă apoi să aprindă un led treptat, folosind un generator de factor de umplere variabil.