Este modelo de un D-Flip flop con Habilitar no funciona como se esperaba

0

Este es un modelo Verilog de una serie de flip-flops D con línea de habilitación junto con un banco de pruebas utilizado en ModelSim Altera:

module Register_Design #(parameter Width = 4)
(
    input Clock, Reset, Load, 
    input  [Width - 1:0] In,
    output reg [Width - 1:0] D
);
    always @(posedge Clock or negedge Reset) begin
        if(~Reset)
            D <= 0;
        else if(Load)
            D <= In;
    end
endmodule

module Register_Design_Test;
    reg Clock, Reset, Load;
    reg [3:0] In;
    wire [3:0] D;

    Register_Design #(4) REG0 (Clock, Reset, Load, In, D);

    initial fork
        Clock = 1'b0;
        Reset = 1'b1;
        Load  = 1'b1;
        In    = 4'h0;
        #2 Reset = 1'b0;
        #10 In = 4'b0010;
        #20 In = 4'b0100;
        #30 In = 4'b1000;
        #40 In = 4'b1100;
        #40 Load = 1'b1;
        #50 In = 4'b1111;
        #70 In = 4'b1110;
        #80 In = 4'b1100;
        #90 In = 4'b1000;
        #100 In = 4'b0000;
    join

    always @(Clock) #10 Clock <= ~Clock;

    initial #500 $stop;
endmodule

Aquí hay una imagen de la salida de la simulación:

Como puede ver, a pesar de que la entrada Load está siendo 1 , que debería cargar un nuevo valor en los flip-flops D, la salida siempre es 0000 , que es el estado predeterminado en el reinicio. ¿Qué me estoy perdiendo aquí?

En lugar de usar un modelo de flujo de datos de comportamiento, utilicé este y funcionó bien:

D_FF D0 (Clock, Reset, M[0], D[0]);
D_FF D1 (Clock, Reset, M[1], D[1]);
D_FF D2 (Clock, Reset, M[2], D[2]);
D_FF D3 (Clock, Reset, M[3], D[3]);

MUX_2x1 MUX0 ({In[0], D[0]}, Load, M[0]);
MUX_2x1 MUX1 ({In[1], D[1]}, Load, M[1]);
MUX_2x1 MUX2 ({In[2], D[2]}, Load, M[2]);
MUX_2x1 MUX3 ({In[3], D[3]}, Load, M[3]);

module MUX_2x1 (In, S, Out);
    input  S;
    input  [1:0] In;
    output reg Out;

    always @(*) begin
        case (S)
            1'b0:    Out = In[0];
            1'b1:    Out = In[1];
            default: Out = 1'bx;
        endcase
    end
endmodule

module D_FF (clk, reset, d, q);
    input d, clk, reset;
    output reg q;

    always @(posedge clk or posedge reset) begin
        if(reset)
            q <= 0;
        else
            q <= d;
    end
endmodule
    
pregunta 3bdalla

1 respuesta

3

En su primer ejemplo de código, tiene un restablecimiento activo bajo ( if (~Reset) D <= 0 ). Y en el banco de pruebas mantienes Reset bajo durante la mayor parte de la simulación. Como se esperaba, esto da como resultado que D sea 0.

En el segundo ejemplo de código, tienes un reinicio de alta actividad ( if (reset) q <= 0 ) que naturalmente se comportará de manera diferente.

    
respondido por el The Photon

Lea otras preguntas en las etiquetas