Circuito de modelado desde FSM usando Verilog

1

Estoy tratando de entender el concepto de modelar un circuito desde un FSM en Verilog.

He intentado anotar el procedimiento que he usado en la imagen de abajo para asegurarme de que lo hice correctamente:

Segúnlasolución,elcircuitoeselsiguiente:

ElcódigodeVerilogquehedesarrolladoes:-

//----------------------------------------//modulebitstreamgenerator//-----------------------------------------modulegenerator(clk,stream//generatedstream);outputstream;inputclk;regc;wirestream;assignstream=c;initialbeginc=1'd0;endalways@(posedgeclk)begin//c=!c;c={$random}%2;//$display("a= %b",c);
end
endmodule



//----------------------------------------
//module D flip flip
//-----------------------------------------

module d(q_w,q0_w,d,c);
output q_w,q0_w;
input c,d;

//wire c;
reg q,q0;
wire q_w,q0_w;
assign q_w=q;
assign q0_w=q0;

    initial 
       begin
           q=1'b0; q0=1'b1;
      end
    always @ (posedge c)
       begin 
         q=d;
         q0= ~d;
       end
endmodule


//----------------------------------------
//module sequencedetector
//-----------------------------------------

module sequencedetector(
clk,
x,  //input bit stream
out //output from sequence detector
);

input x,clk;
output out;

wire x,y0,y_0,y1,y_1,g12,g32,g2d1,out;

d dff1(.q_w(y1),.q0_w(y_1),.d(g2d1),.c(clk));   //flip flop D1
d dff0(.q_w(y0),.q0_w(y_0),.d(x),.c(clk));  //Flip Flop D2

and gate1(g12,x,y0);
or gate2(g2d1,g12,g32);
and gate3(g32,y1,y0);
and gate4(out,x,y_0,y1);

endmodule


//----------------------------------------
//module sequencedetector testbench
//-----------------------------------------

module sequencedetector_tb;

reg clk;
wire out,x;

sequencedetector UUT(
.clk(clk),
.x(x),
.out(out));

generator UUTgen(
.clk(clk),
.stream(x));



initial begin
clk=1'b0;
//stream=1'b0;
//=1'b0;
end

initial  
begin
    $dumpfile ("counter.vcd"); 
    $dumpvars(0); 
end

always
    begin
    #20 clk=!clk;
    end

initial
    begin
    #20000 $finish;
    end 
endmodule

Pero, lamentablemente, la salida I no es la esperada. El circuito no detecta ningún problema ya que la salida siempre está BAJA. No puedo cargar la instantánea de GTKwave en busca de suficiente reputación.

Cualquier ayuda es muy apreciada

EDITAR

Simplemente descubrí que en el código para el flip Flop la salida (q) no seguía la entrada (d) cada vez que el bit de entrada cambiaba solo por un ciclo, probablemente porque el muestreo se estaba realizando en la misma instancia en que se realizaban los cambios. sucediendo (en el flujo de bits). Este código requería que los bits modificados sostengan al menos 2 ciclos seguidos de la salida del flip flop. Se introdujo un retraso de 2 ciclos en el código de flip flop y la salida es la esperada.

always @ (posedge c)
           begin 
            #2 q=d;
             q0= ~d;
           end

El problema ahora es qué debo hacer si necesito implementar el código Verilog en un hardware real. Me refiero a cuál es la alternativa de demora (n. ° 2) si necesito crear un código sintetizable (definitivamente no es una multitud de puertas) pero tal vez una función de verilog estándar compatible con el hardware.

    
pregunta sherinkapotein

1 respuesta

2

Desea utilizar una asignación sin bloqueo. Estas asignaciones cambian en el borde del reloj.

always @ (posedge c)
begin 
    q  <= d;
    q0 <= ~d;
end

Para ilustrar las implicaciones del bloqueo frente a la asignación sin bloqueo, considere el siguiente ejemplo.

Dos salidas, A y B. A está controlada por la entrada, y B está controlada por A

module flipflop(
    input c,
    input d,
    output reg a,
    output reg b
    );

   always@(posedge c) begin
      a        <= d;
      b        <= a;

   end
endmodule

Eso produce esto:

Comopuedever,hayunflipflopentrelasalidaAylasalidaB.

Ahoraelejemplodebloqueo:

moduleflipflop(inputc,inputd,outputrega,outputregb);always@(posedgec)begina=d;b=a;endendmodule

Esoproduceesto:

YanohaydemoraentreAyB.

Sideseaunretrasodevarioscc,esnecesariousarunaasignaciónnobloqueanteparainferirelnúmerocorrectodeFFnecesarios.Aquíhayunejemplodeunaseñaltripleregistradaenhwquecreaunretrasode3cc:

moduleflipflop(inputc,inputd,outputq);reg[2:0]q_i;always@(posedgec)beginq_i[0]<=d;q_i[2:1]<=q_i[1:0];endassignq=q_i[2];endmodule

Creaesteesquemaensíntesis:

LasherramientastienenFDREinferidosenestoscasos.Consultela guía de bibliotecas de xilinx (página 185) para obtener una idea de qué primitivos son disponible (altera tendrá probablemente similares).

Ejecuté tu código en Vivado 2015.3 y funcionó bien:

    
respondido por el stanri

Lea otras preguntas en las etiquetas