detector de secuencia en verilog

2

Tengo la tarea de construir un detector de secuencia

Aquíestáelcódigo:

/*ThisdesignmodelsasequencedetectorusingMealyFSM.*Wheneverthesequence1101occurs,outputgoeshigh.*Overlappingsequencesareallowed.*/modulefirstFSM(inputwireclk,inputwirerst,inputwiresequence,outputregtick);//Statedeclarationslocalparama=2'b00;localparamb=2'b01;localparamc=2'b10;localparamd=2'b11;//SignalsregpresentState;regnextState;//Stateassignmentsalways@(posedgeclk,posedgerst)beginif(rst)presentState<=a;elseif(clk)presentState<=nextState;end//Nextstatelogicalways@*begin//DefaultorunassignedstatesremainsamenextState=presentState;tick=1'b0;case(presentState)a:if(sequence)nextState=b;b:beginif(sequence)nextState=c;elsenextState=a;endc:if(~sequence)nextState=d;d:beginif(sequence)begintick=1'b1;nextState=b;endelsenextState=a;enddefault:begintick=1'b0;nextState=a;endendcaseendendmodule

Aquíestáelbancodepruebas

'timescale1ns/1nsmodulefirstFSMTest;//Signalsregclk,rst;regsequence;wiretick;//Initialiseregportsinitialbeginclk=1'b0;sequence=1'b0;end//Setinitialresetinitialbeginrst=1'b1;#30rst=1'b0;end//Setoccuranceofsequenceinitialbegin#30sequence=1'b1;#20sequence=1'b0;#20sequence=1'b0;#20sequence=1'b1;#20sequence=1'b1;#20sequence=1'b0;#20sequence=1'b1;#20sequence=1'b0;#20sequence=1'b1;end//InitialiseuutfirstFSMuut(.clk(clk),.rst(rst),.sequence(sequence),.tick(tick));always#10clk=~clk;endmodule

Aquíestálasalida

Como puede ver, la secuencia 1101 ocurre después de la línea amarilla.

Pero no importa lo que haga, la salida no es alta. Estoy bastante seguro de que el diseño y la tb son correctos. Entonces, ¿dónde está el error?

(¿Estos y otros verilog Q se adaptan mejor al desbordamiento de pila o EE? Por favor, migre si cree que esto no pertenece aquí)

Gracias.

    

1 respuesta

2

Sus registros están mal definidos.

reg presentState ;
reg nextState ;

debería ser

reg [1:0] presentState ;
reg [1:0] nextState ;

.

De forma predeterminada, los registros solo tienen 1 bit, por lo que solo se puede llegar a los estados a y b.

Además, debes hacer tu banco de pruebas un poco diferente. Intenta

initial
begin
@(posedge clk);
@(posedge clk);     sequence <= 1'b1 ; 
@(posedge clk);     sequence <= 1'b0 ; 
@(posedge clk);     sequence <= 1'b0 ; 
@(posedge clk);     sequence <= 1'b1 ; 
@(posedge clk);     sequence <= 1'b1 ; 
@(posedge clk);     sequence <= 1'b0 ; 
@(posedge clk);     sequence <= 1'b1 ; 
@(posedge clk);     sequence <= 1'b0 ; 
@(posedge clk);     sequence <= 1'b1 ; 

$finish;

end

en su lugar.

Con esos pocos cambios, recibo un pulso en la salida 'tick' cuando ejecuto esto en Icarus Verilog.

    
respondido por el alex.forencich

Lea otras preguntas en las etiquetas