Reti sequenziali in Verilog
Per implementare utilizzando Verilog una rete sequenziale, secondo gli schemi (di Moore o di Mealy) del libro di testo, occorre:
definire un modulo sigma che implementa la funzione di transizione dello stato interno
definire un modulo omega che implementa la funzione delle uscite
definire un modulo che al suo interno contenga la definizione del registro di stato come variabile “reg” e che abbia fra i suoi parametri gli ingressi, il segnale di clock e le uscite. Il modulo:
dichiare le uscite del modulo come “reg”
dichiara il registro di stato (variabile di tipo “reg” con il numero di bit necessari per contenere lo stato interno)
dichiara i wire necessari a collegare l'uscita della rete sigma all'ingresso del registro di stato e l'uscita della rete omega al registro delle uscite
crea le istanze della rete omega e della rete sigma utilizzando wire e registro di stato definiti nel modulo
in uno statement initial begin … end assegna il valore iniziale al registro di stato e al registro delle uscite
in uno statement
always @(negedge clock) begin … end (dove
clock è il nome della variabile di ingresso che porta il segnale di clock) assegna al registro di stato il valore dell'uscita di sigma e al registro delle uscite il valore dell'uscita di omega utilizzando statement
var <= val
Questo statement di assegnamento ha il significato di effettuare l'assegnamento in parallelo agli altri nel blocco.
Esempio
Supponiamo di voler implementare come rete sequenziale un automa di Mealy che:
ha due stati
nel primo stato se riceve uno 0 rimane lì e manda in uscita un 1, se riceve un 1 transita nell'altro stato e manda in uscita un 1
nel secondo stato, se riceve un 0 rimane lì e manda in uscita uno 0, se riceve un 1 transita nell'altro stato con un uscita a 0.
Rete Omega
primitive automa_omega(output z, input s, input x);
table
0 0 : 1;
0 1 : 1;
1 0 : 0;
1 1 : 0;
endtable
endprimitive
Rete Sigma
primitive automa_sigma(output z, input s, input x);
table
0 0 : 0;
0 1 : 1;
1 0 : 0;
1 1 : 1;
endtable
endprimitive
Automa di Mealy
module automa_mealy(output reg z, input x, input clock);
reg stato;
wire uscita_omega;
wire uscita_sigma;
automa_omega omega(uscita_omega, stato, x);
automa_sigma sigma(uscita_sigma, stato, x);
initial
begin
stato = 0;
z=0;
end
always @(negedge clock)
begin
stato <= uscita_sigma;
z <= uscita_omega;
end
endmodule