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

De la WikiLabs
Jump to navigationJump to search
 
(Nu s-au afișat 10 versiuni intermediare efectuate de alți 2 utilizatori)
Linia 3: Linia 3:
 
* [[Introducere. Verilog HDL și ModelSim|Logică booleană și sisteme de numerație]]
 
* [[Introducere. Verilog HDL și ModelSim|Logică booleană și sisteme de numerație]]
 
* Sintaxă [[Verilog]]
 
* Sintaxă [[Verilog]]
* Utilizarea programului de simulare [[ModelSim]]
+
* [[Tutorial_Quartus_II| Utilizarea programului de sinteză Altera Quartus II]]
* [[Introducere în sinteza pe FPGA. Xilinx ISE]]
+
* [http://wiki.dcae.pub.ro/images/f/fc/Pinii_la_care_sunt_conectati_dispozitivele_I-O_pe_placa_experimentala_DE1.pdf Lista pinilor plăcii DE1]
* Utilizarea programului de sinteză [[Tutorial Xilinx ISE|Xilinx ISE]]
+
* [[Circuite secvențiale]], [[Numărătorul]]
* [[Memorii ROM]], [[Dispozitiv de IO: Afișajul cu 7 segmente]], [[Circuite secvențiale]], [[Numărătorul]]
+
* [[Generator de impulsuri cu factor de umplere variabil]]
* [[Memorii RAM]], [[Circuitul de debounce]]
 
  
== Cerințe ==
+
== Exemplu ==
  
[[Fișier:lab4.png|thumb|Schema bloc a circuitului]]
+
Realizați un circuit care să aprindă LEDG7 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.
  
* Descrieți în Verilog o memorie RAM 16x8 cu un port de citire-scriere sincron. Scrieți un modul de test pentru acest circuit scriind anumite adrese cu anumite valori si apoi citindu-le. Simulați memoria RAM în Modelsim.
+
== Exercițiu ==
* Modificați modulul de control pentru afișajul cu 7 segmente din lucrarea 3 de laborator, astfel încât acesta să afișeze simbolurile hexazecimale (A,b,C,d,E,F) pentru valorile 10 - 15.
 
* Scrieți un modul de test pentru circuitul de debounce. Simulați acest modul în Modelsim.
 
* Modificați numărătorul de la lucrarea 3 astfel încât să fie pe 4 biți, eliminați portul de reset și adăugați un port '''enable''' care să permită incrementarea doar când acesta este 1.
 
* Folosind modulele anterioare și blocuri de instanțiere, descrieți în Verilog un circuit (numit Top) în care să utilizați un numărător care să dea adresa memoriei, iar numărarea să se facă doar la apăsarea unui buton (folosiți pentru buton un modul de debounce). Legați ieșirea numărătorului la intrarea de adresă a memoriei și la intrarea modulului de control al afișajului (transcodor), portul de date de intrare la switch-uri, portul de date de ieșire la leduri, portul de write-enable (we) la unul din butoane. Sintetizați circuitul în Xilinx ISE și configurați placa de FPGA.
 
  
== Cerințe suplimentare (opționale) ==
+
Realizați un circuit care instanțiază 8 generatoare de semnal cu factor de umplere variabilă pentru a forma o rampă de intensitate pe LEDG7-LEDG0, cu următoarele caracteristici:
# Folosind modulul dezvoltat la exercițiul opțional 2 de la lucrarea 3, scrieți un modul care să afișeze prenumele vostru deplasându-se de la dreapta la stânga pe afișajul cu 7 segmente. Sintetizați circuitul și programați placa de FPGA.
+
* Intensitatea LEDG0, notată I<sub>LEDG0</sub> este determinată de SW7-SW0
# Realizați o memorie RAM 16x32 cu 2 porturi:
+
* Intensitățile LEDG0-7 respectă una din următoarele relații (cadrul didactic va atribui fiecăruia din studenți una din relațiile de mai jos):
#* un port de citire (portA)
+
*# I<sub>LEDG0</sub> &lt; I<sub>LEDG1</sub> &lt; I<sub>LEDG2</sub> &lt; I<sub>LEDG3</sub> &lt; I<sub>LEDG4</sub> &lt; I<sub>LEDG5</sub> &lt; I<sub>LEDG6</sub> &lt; I<sub>LEDG7</sub>
#* un port de citire-scriere asincronă (portB)
+
*# I<sub>LEDG0</sub> &gt; I<sub>LEDG1</sub> &lt; I<sub>LEDG2</sub> &lt; I<sub>LEDG3</sub> &lt; I<sub>LEDG4</sub> &lt; I<sub>LEDG5</sub> &lt; I<sub>LEDG6</sub> &lt; I<sub>LEDG7</sub>
#: Folosind un modul similar celui dezvoltat la punctul opțional 2 de la lucrarea 2, implementați următoarele operații conform unui cod de operație primit ca intrare:
+
*# I<sub>LEDG0</sub> &gt; I<sub>LEDG1</sub> &gt; I<sub>LEDG2</sub> &lt; I<sub>LEDG3</sub> &lt; I<sub>LEDG4</sub> &lt; I<sub>LEDG5</sub> &lt; I<sub>LEDG6</sub> &lt; I<sub>LEDG7</sub>
#* 4'd0 - nop - nu se efectuează scriere;
+
*# I<sub>LEDG0</sub> &gt; I<sub>LEDG1</sub> &gt; I<sub>LEDG2</sub> &gt; I<sub>LEDG3</sub> &lt; I<sub>LEDG4</sub> &lt; I<sub>LEDG5</sub> &lt; I<sub>LEDG6</sub> &lt; I<sub>LEDG7</sub>
#* 4'd1 - const0 - valoarea primită ca adresă pe portul A se încarcă în memorie, folosind portul B;
+
*# I<sub>LEDG0</sub> &gt; I<sub>LEDG1</sub> &gt; I<sub>LEDG2</sub> &gt; I<sub>LEDG3</sub> &gt; I<sub>LEDG4</sub> &lt; I<sub>LEDG5</sub> &lt; I<sub>LEDG6</sub> &lt; I<sub>LEDG7</sub>
#* 4'd2 - const1 - valoarea primită ca adresă pe portul A se încarcă în memorie, folosind portul B, shiftând la stânga conținutul memoriei de la adresa respectivă;
+
*# I<sub>LEDG0</sub> &gt; I<sub>LEDG1</sub> &gt; I<sub>LEDG2</sub> &gt; I<sub>LEDG3</sub> &gt; I<sub>LEDG4</sub> &gt; I<sub>LEDG5</sub> &lt; I<sub>LEDG6</sub> &lt; I<sub>LEDG7</sub>
#* 4'd3 - add - se adună valorile de la locațiile specificate de adresele porturilor A și B și se scriu în memorie folosind portul B;
+
*# I<sub>LEDG0</sub> &gt; I<sub>LEDG1</sub> &gt; I<sub>LEDG2</sub> &gt; I<sub>LEDG3</sub> &gt; I<sub>LEDG4</sub> &gt; I<sub>LEDG5</sub> &gt; I<sub>LEDG6</sub> &lt; I<sub>LEDG7</sub>
#* 4'd4 - sub - se scad valorile de la locațiile specificate de adresele porturilor A și B și se scriu în memorie folosind portul B;
+
*# I<sub>LEDG0</sub> &gt; I<sub>LEDG1</sub> &gt; I<sub>LEDG2</sub> &gt; I<sub>LEDG3</sub> &gt; I<sub>LEDG4</sub> &gt; I<sub>LEDG5</sub> &gt; I<sub>LEDG6</sub> &gt; I<sub>LEDG7</sub>
#* 4'd5 - mul - se înmulțesc valorile de la locațiile specificate de adresele porturilor A și B și se scriu în memorie folosind portul B;
+
 
#* 4'd6 - lshift - se shiftează la stânga valorea de la locația specificată de adresa portului B cu cea de la locația specificată de adresa portului A și se scrie în memorie folosind portul B;
+
== Exercițiu Bonus ==
#* 4'd7 - rshift - se shiftează la dreapta valorea de la locația specificată de adresa portului B cu cea de la locația specificată de adresa portului A și se scrie în memorie folosind portul B;
+
 
#: Simulați modulul în Modelsim generând ca test o secvență de operații.
+
Realizați un circuit care să stingă apoi să aprindă un led treptat, folosind un generator de factor de umplere variabil.

Versiunea curentă din 21 aprilie 2017 12:05

Noțiuni și cunoștințe necesare

Exemplu

Realizați un circuit care să aprindă LEDG7 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 LEDG7-LEDG0, cu următoarele caracteristici:

  • Intensitatea LEDG0, notată ILEDG0 este determinată de SW7-SW0
  • Intensitățile LEDG0-7 respectă una din următoarele relații (cadrul didactic va atribui fiecăruia din studenți una din relațiile de mai jos):
    1. ILEDG0 < ILEDG1 < ILEDG2 < ILEDG3 < ILEDG4 < ILEDG5 < ILEDG6 < ILEDG7
    2. ILEDG0 > ILEDG1 < ILEDG2 < ILEDG3 < ILEDG4 < ILEDG5 < ILEDG6 < ILEDG7
    3. ILEDG0 > ILEDG1 > ILEDG2 < ILEDG3 < ILEDG4 < ILEDG5 < ILEDG6 < ILEDG7
    4. ILEDG0 > ILEDG1 > ILEDG2 > ILEDG3 < ILEDG4 < ILEDG5 < ILEDG6 < ILEDG7
    5. ILEDG0 > ILEDG1 > ILEDG2 > ILEDG3 > ILEDG4 < ILEDG5 < ILEDG6 < ILEDG7
    6. ILEDG0 > ILEDG1 > ILEDG2 > ILEDG3 > ILEDG4 > ILEDG5 < ILEDG6 < ILEDG7
    7. ILEDG0 > ILEDG1 > ILEDG2 > ILEDG3 > ILEDG4 > ILEDG5 > ILEDG6 < ILEDG7
    8. ILEDG0 > ILEDG1 > ILEDG2 > ILEDG3 > ILEDG4 > ILEDG5 > ILEDG6 > ILEDG7

Exercițiu Bonus

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