===== 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