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

De la WikiLabs
Jump to navigationJump to search
 
(Nu s-au afișat 25 de versiuni intermediare efectuate de alți 4 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]]
* [[Introducere în sinteza pe FPGA. Xilinx ISE]]
+
* [[Tutorial_Quartus_II| Utilizarea programului de sinteză Altera Quartus II]]
* Utilizarea programului de sinteză [[Tutorial Xilinx ISE|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]
* [[Circuite secvențiale]], [[Numărătorul]]
+
* [[Circuite secvențiale]]
* [[Generator de impulsuri cu factor de umplere variabil]]
+
* [[Numărătorul]]
 +
* [[Memorii RAM]]
  
== 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.
+
* Se va descrie în Verilog o memorie RAM 16x4b cu un port de citire-scriere. Citirea este sincrona.
* Realizați un circuit care să stingă apoi să aprindă un led treptat, folosind un generator de factor de umplere variabil.
+
* Se vor scrie contrâgerile necesare pentru a conecta
 +
** adresa la SW7-4 și data de intrare la SW3-0.
 +
** semnalul de activare a scrierii la unul din butoane (KEY0 ... KEY3).
 +
** ieșirea memoriei la LEDR3-0.
 +
** intrarea de ceas a memoriei la unul dintre oscilatoarele plăcii DE1.
 +
* Programati placa FPGA, si folosind switch-urile si butoanele placii, scrieți adresele 3, 6 și 10 cu valorile 2, 1 respectiv 7, apoi citiți-le în aceeași ordine. Observati, folosind LED-urile placii, daca s-a realizat memorarea.
  
<!--
+
== 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.
+
*Descrieți în Verilog o memorie RAM 16x4b cu două porturi:
 +
** Un port sincron de scriere (Write-Only) cu următoarele semnale:
 +
*** WR_ADDR - adresa la care se scrie
 +
*** WR_EN - comanda de scriere
 +
*** WR_DATA - datele scrise
 +
** Un port sincron de citire (Read-Only) cu următoarele semnale:
 +
*** RD_ADDR - adresa citită
 +
*** RD_DATA - datele citite
 +
* Memoria va fi instanțiată în modulul TOP conform figurii următoare:
 +
[[Fișier:Cid_lab6.jpg]]
  
<syntaxhighlight lang="Verilog">
+
<syntaxhighlight lang="verilog">
net "ps2_clock" clock_dedicated_route = "false";
+
module COUNTER(
 +
    input clk,
 +
    output reg [31:0] cnt
 +
);
 +
 
 +
always @(posedge clk) cnt <= cnt + 1;
 +
 
 +
endmodule
 +
 
 +
module ROM(
 +
    input [3:0] in,
 +
    output reg [3:0] out
 +
);
 +
 
 +
always @(in)
 +
    case(in)
 +
        0:  out = 4'b0000;
 +
        1:  out = 4'b0110;
 +
        2:  out = 4'b0011;
 +
        3:  out = 4'b1110;
 +
        4:  out = 4'b1011;
 +
        5:  out = 4'b1111;
 +
        6:  out = 4'b0111;
 +
        7:  out = 4'b1100;
 +
        8:  out = 4'b0001;
 +
        9:  out = 4'b0101;
 +
        10: out = 4'b1101;
 +
        11: out = 4'b1010;
 +
        12: out = 4'b0010;
 +
        13: out = 4'b0100;
 +
        14: out = 4'b1000;
 +
        15: out = 4'b1001;
 +
        default: out = 4'b0000;
 +
    endcase
 +
 
 +
endmodule
 
</syntaxhighlight>
 
</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].
+
* Scrieți constrângerile necesare pentru a conecta porturile modulului TOP:
 +
** DIN la SW7-4,
 +
** ADR la SW3-0,
 +
** WEN la KEY3,
 +
** DOUT la LEDR3-0,
 +
** intrarea de ceas la CLOCK_50.
 +
* Programati placa FPGA; Scrieți memoria RAM cu valorile necesare pentru a produce pe DOUT o secvență de numere indicată de cadrul didactic.
 +
 
 +
== Submiterea Exercițiilor ==
  
'''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''.
+
Pentru notare, se vor submite următoarele fișiere, către adresa de e-mail indicată de cadrul didactic.
-->
 
  
<!--
+
O arhivă <span style="color: red; font-weight: bold">zip</span> ce va conține:
== Cerințe suplimentare (opționale) ==
+
*Toate fișierele Verilog (cu extensia .v) care conțin descrierea circuitului
 +
*Un fișier de constrângeri, cu extensia .qsf
 +
*Un fișier de tip proiect Quartus, cu extensia .qpf
 +
Atentie, arhiva va contine doar fisiere (fara directoare).
  
Realizați un modul Verilog care să permită stocarea unor figuri de afișaj pe 7 segmente într-o memorie RAM, apoi afișeze conținutul memoriei deplasându-se de la dreapta la stânga, pe afișajul cu 7 segmente.
+
Subiectul mesajului de e-mail trebuie respecte formatul <span style="color: red; font-weight: bold">[Nume]_[Prenume]_[Grupa]_Mem</span> de exemplu Popescu_Ion_423B_Mem
-->
 

Versiunea curentă din 18 aprilie 2018 16:00

Noțiuni și cunoștințe necesare

Exemplu

  • Se va descrie în Verilog o memorie RAM 16x4b cu un port de citire-scriere. Citirea este sincrona.
  • Se vor scrie contrâgerile necesare pentru a conecta
    • adresa la SW7-4 și data de intrare la SW3-0.
    • semnalul de activare a scrierii la unul din butoane (KEY0 ... KEY3).
    • ieșirea memoriei la LEDR3-0.
    • intrarea de ceas a memoriei la unul dintre oscilatoarele plăcii DE1.
  • Programati placa FPGA, si folosind switch-urile si butoanele placii, scrieți adresele 3, 6 și 10 cu valorile 2, 1 respectiv 7, apoi citiți-le în aceeași ordine. Observati, folosind LED-urile placii, daca s-a realizat memorarea.

Exercițiu

  • Descrieți în Verilog o memorie RAM 16x4b cu două porturi:
    • Un port sincron de scriere (Write-Only) cu următoarele semnale:
      • WR_ADDR - adresa la care se scrie
      • WR_EN - comanda de scriere
      • WR_DATA - datele scrise
    • Un port sincron de citire (Read-Only) cu următoarele semnale:
      • RD_ADDR - adresa citită
      • RD_DATA - datele citite
  • Memoria va fi instanțiată în modulul TOP conform figurii următoare:

Cid lab6.jpg

module COUNTER(
    input clk,
    output reg [31:0] cnt
);

always @(posedge clk) cnt <= cnt + 1;

endmodule 

module ROM(
    input [3:0] in,
    output reg [3:0] out
);

always @(in)
    case(in)
        0:  out = 4'b0000;
        1:  out = 4'b0110;
        2:  out = 4'b0011;
        3:  out = 4'b1110;
        4:  out = 4'b1011;
        5:  out = 4'b1111;
        6:  out = 4'b0111;
        7:  out = 4'b1100;
        8:  out = 4'b0001;
        9:  out = 4'b0101;
        10: out = 4'b1101;
        11: out = 4'b1010;
        12: out = 4'b0010;
        13: out = 4'b0100;
        14: out = 4'b1000;
        15: out = 4'b1001;
        default: out = 4'b0000;
    endcase

endmodule
  • Scrieți constrângerile necesare pentru a conecta porturile modulului TOP:
    • DIN la SW7-4,
    • ADR la SW3-0,
    • WEN la KEY3,
    • DOUT la LEDR3-0,
    • intrarea de ceas la CLOCK_50.
  • Programati placa FPGA; Scrieți memoria RAM cu valorile necesare pentru a produce pe DOUT o secvență de numere indicată de cadrul didactic.

Submiterea Exercițiilor

Pentru notare, se vor submite următoarele fișiere, către adresa de e-mail indicată de cadrul didactic.

O arhivă zip ce va conține:

  • Toate fișierele Verilog (cu extensia .v) care conțin descrierea circuitului
  • Un fișier de constrângeri, cu extensia .qsf
  • Un fișier de tip proiect Quartus, cu extensia .qpf

Atentie, arhiva va contine doar fisiere (fara directoare).

Subiectul mesajului de e-mail trebuie să respecte formatul [Nume]_[Prenume]_[Grupa]_Mem de exemplu Popescu_Ion_423B_Mem