470 likes | 656 Views
CID2 curs 3. 26 octombrie 2006. UDP (primitive definite de utilizator) continuare latch-uri şi bistabile definite în Verilog variabile de tip reg, atribuiri. UDP. User Defined Primitive primitive(out, in1,…,inn); ….declaratii… table …. endtable endprimitive.
E N D
CID2 curs 3 26 octombrie 2006
UDP (primitive definite de utilizator) • continuare • latch-uri şi bistabile definite în Verilog • variabile de tip reg, atribuiri CID2 curs 3
UDP User Defined Primitive primitive(out, in1,…,inn); ….declaratii… table …. endtable endprimitive CID2 curs 3
UDP (continuare) • tipuri • combinaţionale • secvenţiale • diferă de module ca structură şi definire • au o singură ieşire (scalară) • se definesc întotdeauna prin tabele ATENŢIE! intrările nu pot fi vectori ieşirea are un singur bit CID2 curs 3
1. UDP combinaţionale tabele compactate
Exemplu. Multiplexor 2:1 i0 i1 s MUX y CID2 curs 3
Tabele logice – tabele combinaţionale CID2 curs 3
Definirea unui tabel compactat în Verilog (logică cu 4 valori) primitive mux_2_to_1(y, s, i0, i1); output out; input s, i0, i1; table//s i0 i1 y 0 0 ? : 0;// ? inseamna 0,1 sau x 0 1 ? : 1; 1 ? 0 : 0; 1 ? 1 : 1; end table endprimitive CID2 curs 3
Important • ordinea varibilelor din tabel este ordinea definirii intrărilor • nu se admit valori z • combinaţie nedefinită → ieşirea estex CID2 curs 3
tabelul se reevaluează de câte ori se modifică o intrare • se parcurg liniile în ordine până la prima configuraţie similară intrării actuale primitivele NU se definesc în interiorul modulelor CID2 curs 3
Regulile de compactare • nu se compactează niciodată ieşirea! • este bine să nu ignorăm valorile x (ex la multiplexor cu x pe i1 cand s=0, y=i0) CID2 curs 3
0 0 0 : 0 0 0 1 : 0 0 0 x : 0 0 1 0 : 1 0 1 1 : 1 0 1 x : 1 0 x 0 : x 0 x 1 : x 0 x x : x 0 0 ? : 0 0 1 ? : 1 0 x ? : x (evaluare implicită) Logică cu 4 stări:exemplu - multiplexor CID2 curs 3
Tabel combinaţional (final) CID2 curs 3
Atenţie!!! dacă ignorăm i1=x, pentru s=0 multiplexorul nu va funcţiona corect dacă ignorăm i0=x, pentru s=1 multiplexorul nu va funcţiona corect CID2 curs 3
2 UDP secvenţiale tabele de tranziţie fronturi
Primitive (UDP) secvenţiale • pot conţine opţional un câmp de iniţializare • ne ajută să definim, de exemplu, latch-uri • tabelul conţine: intrări : starea curentă : starea următoare • simbolul – pentru menţinerea stării curente CID2 curs 3
Exemplu: latch D cu reset asincron • Pentru CK = 0 se menţine starea • Pentru CK = 1 latch-ul este transparent • Dacă RST = 1 → Q=0 CK D RST Q CID2 curs 3
funcţionarea latch-ului reset latch blocat (memorează) latch transparent (Q=D) CID2 curs 3
primitive latch_D (Q, RST, D, CK); output Q; reg Q; input RST, D, CK; table 1 ? ? : ? : 0;// resetare 0 0 1 : ? : 0; 0 1 1 : ? : 1; 0 ? 0 : ? : - ; // mentinerea starii curente endtable endprimitive CID2 curs 3
Iniţializare • NUMAI pentru primitivele secvenţiale (după definirea porturilor) • sintaxa: initial q=0; • aici putem spune că instrucţiunea initial “iniţializează” CID2 curs 3
fronturi? • la latch-ul anterior ceasul este activ pe palier • pentru fronturi este necesar un mod de reprezentare • posedge, negedge (similar cu funcţiile logice elementare, pentru care avem simboluri diferite pentru operanţii în expresii logice sau instrucţiuni assign) ! si ~, & si && etc… CID2 curs 3
pereche de valori ex (01) SAU simboluri reprezentarea fronturilor CID2 curs 3
Bistabil D cu CLR ceasul este activ pe front CLR prioritar, activ pe 0, resetează bistabilul pe fiecare front activ al ceasului, Q=D D CLR CK Q CID2 curs 3
Definire prin tabel primitive bistabil_D(Q, D, CK, CLR); output Q; reg Q; input D, CK, CLR; initial Q=0; // echivalent cu initializarea la pornire table // D CK CLR : Q : Q+ ? ? 0 : ? : 0; 0 r 1 : ? : 0; 1 r 1 : ? : 1; ? n 1 : ? : -; * ? 1 : ? : -; ? ? p : ? : -; endtable endprimitive CID2 curs 3
Reguli • este ilegal să se definească 2 fronturi pe aceeaşi linie • starea se defineşte ca registru • nu avem voie sa avem două ieşiri (Q şi Q’) • iniţializarea este opţională CID2 curs 3
Folosirea primitivelor (UDP) • se aplică mai degrabă în modele structurale • necesită instrucţiunea ‘include (directivă pentru compilator) CID2 curs 3
3 Latch-uri şi bistabile Modele comportamentale
Latch cu assign latch cu 2 porţi nand 1. definire structurală (funcţionează) 2. definire data-flow assign q = set ~& nq; assign nq = reset ~& q; NU funcţionează!!! reset set q nq CID2 curs 3
Latch transparent (cu assign) module latch_CA(q_out, data_in, enable); output q_out; input data_in, enable; assign q_out = enable ? data_in : q_out; endmodule CID2 curs 3
module test_latch_ca; reg data, enable; wire q; initial begin enable = 0; #10 enable = 1; #60 enable = 0; #20 enable = 1; #50 $stop; end initial begin data = 0; forever #5 data = ~data; end latch_CA my_latch(q, data, enable); endmodule CID2 curs 3
Alt exemplu module latch_reset(q_out, data_in, enable, reset); output q_out; input data_in, enable, reset; assign q_out = !reset ? 0 : enable? data in : q_out; endmodule explicaţi funcţionarea acestui latch! CID2 curs 3
Modele comportamentale ciclice(pentru latch-uri şi bistabile) • instrucţiunea assign modelează comportamentul sensibil la nivelurile logice • NU poate modela fronturile (comportamentul determinat de tranziţiile semnalelor) • circuitele SINCRONE (definiţie): toate evenimentele se produc ca urmare a frontului activ al ceasului CID2 curs 3
exemplu de latch always @(posedge <clock> or posedge <reset>) begin if (<reset>) begin <reg> <= 1'b0; end else begin <reg> <= <signal>; end CID2 curs 3
Exemplu de latch (2) always @(posedge <clock>) begin if (<reset>) begin <reg> <= 1'b0; end else if (<clock_enable>) begin <reg> <= <signal>; end CID2 curs 3
4 Variabile de tip reg tipuri atribuiri
Variabile de tip reg • net-urile nu sunt suficiente! • de ce? • pentru că driverul trebuie să fie activ tot timpul • pentru că nu pot implementa algoritmi Variabilele reg memorează valorile între două atriburi succesive CID2 curs 3
reg Definiţie:O variabilă reg este o abstracţie a unui element de stocare a datelor. (este analog variabilelor în limbajele de programare C sau Pascal) Nu este analogul unui registru fizic, deoarece nu există semnal de ceas. Valoarea stocată este memorată până la următoarea atribuire explicită. Până la prima atribuire, are valoarea x (până la prima atribuire, neturile au valoarea z). CID2 curs 3
5 tipuri de variabile reg… CID2 curs 3
Atribuiri • pentru semnale, variabile… • assign (atribuire continuă), pentru net-uri • = atribuire folosită pentru reg-uri • <=non-blocking (tot pentru reg-uri) CID2 curs 3
Diferenţa dintre = şi <= CID2 curs 3
always@(posedge clk or posedge rst) begin if (rst) begin A=0;B=0;C=0;D=0; else begin A=B; B=C; C=D; D=E; end end always@(posedge clk or posedge rst) begin if (rst) begin A=0;B=0;C=0;D=0; else begin D=E; C=D; B=C; A=B; end end Registru de deplasare CORECT GREŞIT!!! CID2 curs 3
always@(posedge clk or posedge rst) begin if (rst) begin A<=0;B<=0;C<=0;D<=0; else begin A<=B; // D<=E B<=C; // C<=D C<=D; // B<=C D<=E; // A<=B end end Ambele variante conduc la acelaşi circuit, după sinteză CID2 curs 3
Posibile subiecte de examen • Comentaţi următorul modul Verilog (explicaţi ce face fiecare linie): primitive bistabil_D(Q, D, CK, CLR); output Q; reg Q; input D, CK, CLR; initial Q=0; // echivalent cu initializarea la pornire table // D CK CLR : Q : Q+ ? ? 0 : ? : 0; 0 r 1 : ? : 0; 1 r 1 : ? : 1; ? n 1 : ? : -; * ? 1 : ? : -; ? ? p : ? : -; endtable endprimitive CID2 curs 3
… sau… • Cât sunt valorile variabilelor A,B,C,D, E după o anumită secvenţă de atribuiri proecedurale secvenţiale şi continue? initial A = 0; B = 1; E = 0; A=B; C=D; D=A; B=E; // D=A; B=E; C=D; A=B; // A<=B; C<=D; D<=A; B<=E; // D<=A; B<=E; C<=D; A<=B; CID2 curs 3
… sau … • Definiţi un bistabil JK • ca primitivă (cu tabel) • ca modul (cu instrucţiunea always) • Definiţi un bistabil T • ca primitivă • ca modul CID2 curs 3