Opis sekvenčnih vezij

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

Sekvenčni avtomat

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.