Strumenti Utente

Strumenti Sito


informatica:ae:reti_sequenziali

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
informatica/ae/reti_sequenziali.txt · Ultima modifica: 18/10/2013 alle 08:55 (6 anni fa) da Marco Danelutto