Logica sequenziale: implementazione verilog Lucidi del Corso di Elettronica igitale Modulo 11 Università di Cagliari ipartimento di Ingegneria Elettrica ed Elettronica Laboratorio di Elettronica (EOLAB) Latch in verilog L implementazione di logica sequenziale in verilog si basa sull uso dei reg sfruttando il fatto che un reg a cui non venga assegnato un nuovo valore mantiene il valore precedentemente assegnatogli Siamo in grado quindi di implementare qualsiasi tipo di latch con i blocchi always, NON assegnando un nuovo valore all uscita per ogni combinazione di ingressi Ovviamente è anche possibile una descrizione in stile strutturale 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 2
Latch SR verilog module LSR(S,R,Q,QN); input S,R; output Q,QN; reg Q,QN; always @(S or R) case({s,r}) 2 b10: {Q,QN}=2 b10; 2 b01: {Q,QN}=2 b01; 2 b11: {Q,QN}=2 b00; case Non viene assegnato un valore per ogni possibile combinazione di S e R quindi si ottiene un elemento di memoria. (Questa versione non modella lo stato proibito) 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 3 Latch SR verilog: strutturale module LSR_struct(S,R,Q,QN); input S,R; output Q,QN; wire Q,QN,S,R; nor n1(q,r,qn); nor n2(qn,s,q); module LSR_struct(S,R,Q,QN); input S,R; output Q,QN; wire Q,QN,S,R; nand n1(q,s,qn); nand n2(qn,r,q); 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 4
Latch con enable module L(,EN,Q); input,en; output Q; reg Q; always @( or EN) if(en) Q=; Ogni volta che cambiano o EN viene assegnato a Q il valore di solo se EN=1. Sia EN che fanno parte della sensitivity list. 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 5 Esempio: Latch con enable Variazioni di ignorate perché EN è basso e non viene eseguita la if EN EN=1 il latch diventa trasparente EN=0 il latch memorizza Q Q inizialmente indeterminato 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 6
Latch in verilog In generale avremo un latch ogni volta che un costrutto di if (annidate o meno) o un costrutto case non prevede un assegnamento dell uscita per ogni possibile percorso Un caso tipico è un costrutto case senza default 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 7 Latch con enable e clear module L2(,EN,CLR,Q); input,en,clr; output Q; reg Q; always @( or EN or CLR) if(clr) Q=1 b0; else if(en) Q=; Non tutti i possibili percorsi nelle if annidate assegnano un valore a Q (non c è la else nella seconda if). E un latch con clear (il segnale CLR) attivo alto 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 8
Latch con enable, clear e preset module L3(,EN,CLR,SET,Q); input,en,clr,set; output Q; reg Q; always @( or EN or CLR or SET) if(clr) Q=1 b0; else if(set) Q=1 b1; else if(en) Q=; Nell ultimo costrutto if manca un else quindi si ottiene un latch 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 9 Blocking e Non-blocking assignment Prima di affrontare la modellazione di flip-flop e registri sensibili ai fronti del segnale di clock è necessario introdurre un nuovo meccanismo di assegnamento di valore ai segnali di tipo variable: l assegnamento nonblocking (simbolo operatore <=). Assegnamento blocking L assegnamento blocking (=) congela l esecuzione delle istruzioni procedurali, dunque viene eseguito prima di fare avanzare la simulazione e passare all istruzione successiva. Assegnamento non-blocking L assegnamento non-blocking (<=) non ferma l esecuzione, dunque TUTTI gli assegnamenti di questo tipo, anche dentro un blocco procedurale, vengono eseguiti in PARALLELO. In pratica tutte l espressioni a destra dell operatore non-blocking sono valutate (campionate) contemporaneamente e solo successivamente i valori vengono assegnati alla variabile sul lato sinistro. 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 10
Blocking e Non-blocking assignment In questo esempio, alla fine dell esecuzione, le variabili A e B varranno: Blocking: A=1, B=1 Non-blocking: A=1, B=0 reg A,B; initial A=0; B=1; //(delays) A=B; B=A; Assegnamento blocking reg A,B; initial A<=0; B<=1; //(delays) A<=B; B<=A; Assegnamento non-blocking 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 11 Assegnamento Blocking 1. Arrivati a questa istruzione la simulazione si CONGELA. A=B; B=A; 4. La simulazione RIPRENE. 2. Viene valutato il lato destro dell operatore =. 3. Il risultato viene assegnato al lato a sinistra dell operatore =. 5. Viene valutato il lato destro dell operatore =. 6. Il risultato viene assegnato al lato a sinistra dell operatore =. 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 12
Assegnamento Non-blocking 1. Arrivati a questa istruzione la simulazione si CONGELA. 2. Vengono valutati tutti i lati a destra dell operatore <=. A<=B; B<=A; 3. Tutti i risultati vengono assegnati ai lati a sinistra dell operatore <=. 4. La simulazione RIPRENE. 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 13 Blocking : esempio reg A,B; initial A=0; B=1; //(delays) A=B; B=A; A=0 e B=1 PRIMA viene eseguito A=B e quindi A diventa 1 OPO viene eseguito B=A, ma siccome A è già diventato 1 anche B diventa 1 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 14
Non-blocking: esempio reg A,B; initial A<=0; B<=1; //(delays) A<=B; B<=A; A=0 e B=1 I due assegnamenti sono non-blocking quindi vengono eseguiti in parallelo. Perciò le due espressioni a destra dell operatore <= vengono campionate allo stesso tempo. ato che, quando viene valutato il lato destro dell espressione, l assegnamento non è stato ancora eseguito, A assume il valore che aveva prima B (1) e B assume il valore che aveva prima A (0). 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 15 Blocking e non-blocking Come si vede dall esempio, il risultato delle stesso codice, implementato con assegnamenti di tipo blocking o non-blocking è differente. In particolare, nel caso dell assegnamento nonblocking il risultato finale NON dipe dall ordine con cui sono scritti assegnamenti contemporanei (cioè senza ritardi nel mezzo). 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 16
Flip-flop in verilog Anche per implementare dei flip-flop si fa uso di un blocco always con costrutti procedurali (if e case) in cui ad un reg non viene sempre assegnato un valore è necessario però potere definire la sensibilità ai fronti del clock e NON al livello Gli strumenti per definire i fronti sono i due modificatori posedge e negedge che indicano il fronte positivo e negativo di un certo segnale L assegnamento deve essere di tipo non-blocking per evitare qualsiasi tipo di ambiguità derivante dall ordine con cui è scritto il codice (il non-blocking NON dipe dall ordine). 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 17 Flip-flop module FF(,CLK,Q); input,clk; output Q; reg Q; Q<=; L always viene eseguito solo in corrispondenza dei fronti positivi del clock. non fa parte della sensitivity list perché l uscita deve essere aggiornata solo a causa di variazioni di CLK ( viene campionato sui fronti di CLK). L assegnamento è di tipo non-blocking 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 18
Esempio: Flip-Flop CLK campionato sui fronti di CLK Q Q inizialmente indeterminato 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 19 Flip-flop: blocking e non-blocking La differenza fra l uso di assegnamenti blocking e non-blocking è avvertibile quando viene assegnato, nello stesso modulo, più di un segnale. module FF(,CLK,Q); input,clk; output Q1,Q2; reg Q1,Q2; Q1=; Q2=Q1; module FF(,CLK,Q); input,clk; output Q1,Q2; reg Q1,Q2; Q1<=; Q2<=Q1; 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 20
Flip-flop: blocking e non--blocking Q1=; Q2=Q1; La prima assegnazione viene eseguita per prima, quindi Q1 campiona il valore di. La seconda assegnazione viene eseguita successivamente (blocking) dunque Q2 diventa uguale a Q1 ossia a. ENTRAMBI i flip-flop campionano l ingresso sul fronte del clock. Q1<=; Q2<=Q1; I lati destri delle espressioni vengono valutati contemporaneamente e POI assegnati a Q1 e Q2. Q1 campiona dunque il segnale. Q2, invece, campiona il valore che aveva Q1 PRIMA di campionare, ossia il valore di Q1 al precedente colpo di clock. 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 21 Flip-flop: blocking e non-blocking clk Q Q1 Q Q Q1 Q2 Q Q2 clk 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 22
Flip-flop: blocking e non-blocking a notare che si preferisce l uso del non-blocking perché NON è ambiguo: comunque si scrivano le cose (in qualsiasi ordine) il circuito modellato è lo stesso. Nel caso dell assegnamento blocking, invece, l ordine con cui si scrivono le cose cambia il circuito modellato quindi NON può essere usato per modellare flip-flop o registri (a causa dell ambiguità). L eventuale problema di ambiguità dovuto all uso dell assegnamento blocking al posto del non-blocking si manifesta principalmente se si implementa più di un flip-flop nello stesso modulo e se le uscite dell uno vanno a pilotare in qualche modo gli ingressi dell altro. In ogni caso, la modellazione di logica sequenziale sensibile ai fronti, richiede OBBLIGATORIAMENTE l uso di assegnamenti non-blocking 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 23 Flip-flop: blocking e non-blocking [2] module FF(,CLK,Q); input,clk; output Q1,Q2; reg Q1,Q2; // Q1=; // Q2=Q1; // Inverto l ordine // cambia il risultato Q2=Q1; Q1=; module FF(,CLK,Q); input,clk; output Q1,Q2; reg Q1,Q2; // Q1<=; // Q2<=Q1; // Inverto l ordine // NON cambia il risultato Q2<=Q1; Q1<=; 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 24
Flip-flop: blocking e non blocking [2] Q2=Q1; Q1=; La prima assegnazione viene eseguita per prima, quindi Q2 campiona il valore di Q1. La seconda assegnazione viene eseguita successivamente (blocking) dunque Q1 diventa uguale a. I flip-flop campionano dati differenti. Q2<=Q1; Q1<=; I lati destri delle espressioni vengono valutati contemporaneamente e POI assegnati a Q1 e Q2. Q1 campiona dunque il segnale. Q2, invece, campiona il valore che aveva Q1 PRIMA di campionare, ossia il valore di Q1 al precedente colpo di clock. 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 25 Flip-flop: blocking e non-blocking [2] Q1 Q1 Q Q Q2 Q Q Q2 clk clk 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 26
Flip-flop con enable module FF2(,CLK,EN,Q); input,clk,en; output Q; reg Q; if(en) Q<=; In questo caso abbiamo un flip-flop (in quanto memorizza sui fronti del clock) con segnale di enable. In presenza di un fronte positivo di CLK viene valutato se il FF è abilitato (EN=1) ed in tal caso viene aggiornata l uscita 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 27 Flip-flop con reset sincrono module FF3(,CLK,RST,Q); input,clk,rst; output Q; reg Q; if(rst) Q<=1 b0; else Q<=; In questo caso viene sempre assegnato un valore all uscita ma abbiamo comunque un FF perché l always si attiva solo sui fronti di CLK. Se RST o cambiano senza che cambi CLK l uscita NON viene aggiornata. Il reset è SINCRONO (attivo alto) perché viene valutato solo sui fronti del clock 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 28
Esempio: FF- con reset sincrono CLK RST Il reset RST è attivo sincrono quindi ha effetto sul fronte di CLK Q 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 29 Flip-flop con reset asincrono module FF4(,CLK,RST,Q); input,clk,rst; output Q; reg Q; always @(posedge CLK or negedge RST) if(~rst) Q<=1 b0; else Q<=; Il reset è ASINCRONO (attivo basso) perché l always viene valutato se cambia RST anche in assenza di variazioni del clock 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 30
Esempio: FF- con reset asincrono CLK RST Il reset RST (attivo basso) è asincrono quindi ha effetto immediatamente a precindere da CLK Q 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 31 Flip-flop in verilog In generale si ottiene un flip-flop ogni qual volta si utilizza un segnale campionato su un fronte (posedge o negedge) nella sensitivity list di un always I segnali della sensitivity list devono essere tutti attivi sui fronti o tutti a livelli: non si possono avere sensitivity list miste Se altri segnali, oltre il clock, compaiono nella sensitivity list danno luogo ad azioni asincrone, cioé azioni attivate indipentemente dal clock 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 32
Registri Un registro non è altro che un insieme di N flipflop (o latch) che vengono scritti contemporaneamente con un solo segnale di clock (o di enable) La definizione di un registro sarà identica a quella di un flip-flop con l unica differenza che il dato e l uscita Q saranno vettori a N bit anzi che a singolo bit 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 33 Registro ad 8 bit module REG8(,CLK,RST,Q); input CLK,RST; input [7:0] ; output [7:0] Q; reg [7:0] Q; if(rst) Q<=8 b0; else Q<=; Registro ad 8 bit con segnale di reset sincrono (campionato sui fronti del clock) 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 34
Moduli parametrici La dimensione del registro può essere resa parametrica per generalità con la direttiva parameter All interno di un modulo si può definire uno costante per mezzo del comando parameter IM=8; Al momento dell istanziazione del modulo si può modificare il valore della costante my_mod #(16) uut(lista-ingressi); Assegna il valore del parametro, quindi sostituisce 16 a 8 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 35 Registro parametrico module REGN(,CLK,RST,Q); parameter N=8; input CLK,RST; input [N-1:0] ; output [N-1:0] Q; reg [N-1:0] Q; if(rst) Q<={N{1 b0}}; else Q<=; In fase di istanziazione si decide quale sia la dimensione del registro REGN #(16) A(d,c,r,q); Se nel codice è presente un solo registro, la differenza fra blocking e non-blocking non è avvertibile 11 icembre 2006 E - Logica sequenziale verilog Massimo Barbaro 36