良好的计数器设计或可能的亚稳性问题?

时间:2014-06-21 03:24:58

标签: counter verilog

我目标的快速摘要: 设计由可变长度自动重载定时器触发的计数器。

稍微详细一点:将会有一个寄存器,其值会发生变化(可预测会发生变化,并在AutoReloadTimer模块的EN信号之前被锁存),该寄存器会设置计数器递增的速率。

这是自动重装计时器:

module AutoReloadTimer( clk, rst, EN, D, done );
    input  clk;
    input  rst;
    input  EN;
    input  [WIDTH-1:0] D;
    output done;

    parameter WIDTH = 8;

    // OneShot EN -> load
    wire load;
    OneShotD OneShot_D(
        .clk( clk ),
        .rst( rst ),
        .in( EN ),
        .RE( load )
    );

    reg [WIDTH-1:0] counter, load_value;

    always @( posedge clk ) begin
        if ( rst ) begin
            counter     <= {WIDTH{1'b1}};
            load_value  <= {WIDTH{1'b1}};
        end else if ( load ) begin
            counter     <= D;
            load_value  <= D;
        end else if (counter == 0 ) begin
            counter     <= load_value;
            load_value  <= load_value;
        end else begin
            counter     <= counter - 1'b1;
            load_value  <= load_value;
        end
    end

    assign done = ( counter == 0 );

endmodule

以下是来自AutoReloadTimer模块的完成信号触发的计数器:

module Counter( clk, rst, EN, CLR, Q );
    input  clk;
    input  rst;
    input  EN;
    input  CLR;
    output [WIDTH-1:0] Q;

    parameter WIDTH = 8;

    reg [WIDTH-1:0] ctr;

    always @( posedge clk ) begin
        if ( rst ) begin
            ctr <= {WIDTH{1'b0}};
        end else if ( CLR ) begin
            ctr <= {WIDTH{1'b0}};
        end else if ( EN ) begin
            ctr <= ctr + 1'b1;
        end else begin
            ctr <= ctr;
        end
    end

    assign Q = ctr;
endmodule

以下是测试平台的部分波形: Counter Waveform

我对此感到好奇的是我的计数器的稳定性 - 这是一个问题,即在时钟的上升沿完成信号变低了吗?我还是Verilog和数字设计的新手。我对这个术语很熟悉,有点认为是亚稳态,但我对它的理解并不完全满意。

寻找投入,批评等等。

修改 我忘了在模块中包含哪些配置来生成该图表:

wire ART_done;
AutoReloadTimer ART0 (
    .clk( clk ),
    .rst( rst ),
    .EN( EN ),
    .D( 4 ),
    .done( ART_done )
);

Counter uut (
    .clk(clk), 
    .rst(rst), 
    .EN(ART_done), 
    .CLR(CLR), 
    .Q(Q)
);

1 个答案:

答案 0 :(得分:3)

只要您的AutoReloadTimer和Counter模块以及使用完成信号的任何逻辑都在同一时钟上,您就不会遇到任何亚稳态问题。您将拥有完全同步的实现。当然,您还必须满足使用设备的时间要求

完成信号实际上会在时钟上升沿之后改变一些小的组合路径延迟,导致计数器命中0.任何使用完成信号的逻辑在下一个上升沿之前的剩余时钟周期内,做什么它需要做(更多的组合逻辑),并且仍然满足由完成信号调节的任何寄存器输入的设置时间。

只有在时钟转换时任何寄存器的输入正在转换时,才会出现亚稳态问题。如果正在注册的数据来自使用异步时钟的寄存器,或者寄存器的建立或保持时序被违反,则会发生这种情况。

相关问题