Sekvenčna vezja opišemo z blokom always_ff in pogojem za fronto ure
(posedge ali
gegedge) v seznamu signalov.
Pogoj za naraščajočo (prvo) fronto ure posedge clk
je edini zapis v seznamu, kadar opisujemo popolnoma sinhrono vezje.
V prireditvenih stavkih za opis sekvenčnih vezij uporabimo operator
<= (nonblocking assignment), ki ne blokira izvajanja ostalih
stavkov. Primer opisa sinhronega podatkovnega flop-flopa:
always_ff @(posedge clk)
if (reset)
q <= 1’b0;
else
q <= d;
Podatkovni-flip flop z asinhronim reset signalom opišemo tako, da dodamo še fronto signala reset v seznam signalov. Če je signal reset aktiven ob logični 1, zapišemo pozitivno fronto, če ja aktiven ob 0 pa negativno fronto:
// D flip-flop z asinhronim resetom (pozitivna logika)
always_ff @(posedge clk, posedge reset)
if (reset) // reset == 1
q <= 1’b0;
else
q <= d;
// D flip-flop z asinhronim resetom (negativna logika)
always_ff @(posedge clk, negedge reset)
if (~reset) // reset == 0
q <= 1’b0;
else
q <= d;
Zaporedni prireditveni stavki z operatorjem <= predstavljajo v vezju
registre ali flip-flope. Primer 4-bitnega zaporednega pomikalnega registra (SISO):
module siso(
input logic clk;
input logic en;
input logic din;
output logic dout
);
logic d1; // notranji flip-flopi
logic d2;
logic d3;
always_ff @(posedge clk)
if (en) begin // pomikanje ob fronti ure in en==1
d1 <= din;
d2 <= d1;
d3 <= d2;
dout <= d3;
end
endmodule
Delovanje sekvenčnega avtomata predstavimo z diagramom prehajanja stanj. Poglejmo si avtomat za detekcijo pritiska tipke.Ob pritisku na tipko, gre avtomat iz mirovnega stanja v stanje impulz, ob naslednjem urinem ciklu pa v stanje čakaj, kjer ostane tako dolgo, dokler je tipka pritisnjena. Avtomat v stanju impulz generira izhodni signal, ki je dolg natanko eno urino periodo.
Za zapis stanj deklariramo nov podatkovni tip in 2-bitno spremenljivko stanja (2 bita zadoščata za 4 stanja).
module fsm(clk, t, izh);
input logic clk, t;
output logic izh;
typedef enum logic [1:0] {mir, impulz, cakaj} stanja;
stanja st;
always_ff @(posedge clk) begin
case (st)
mir:
if (t) st <= impulz;
impulz:
st <= cakaj;
cakaj:
if (!t) st <= mir;
default:
st <= mir;
endcase
end
assign izh = (st==impulz);
endmodule
V SystemVerilogu je uporaba tipa enum priporočljiva, ker izboljša berljivost kode in zmanjša možnost napak pri delu s stanji avtomata. Blok always_ff jasno označuje, da gre za sekvenčno logiko, operator <= pa uporabljamo za neblokirne prireditve v registrih oziroma flip-flopih.