作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的目标的快速总结:设计一个由可变长度自动重新加载计时器触发的计数器。
更详细一点:将有一个寄存器,其值会发生变化(可预见地发生变化,并且在 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
这是来自测试台的波形的一部分:
我在这里好奇的是我的计数器的稳定性 - 完成信号在时钟上升沿变低是否是一个问题?我对 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)
);
最佳答案
只要您的 AutoReloadTimer 和 Counter 模块以及使用完成信号的任何逻辑都位于同一时钟上,您就不会有任何亚稳态问题。您将拥有一个完全同步的实现。当然,您还必须满足您使用的设备的时序要求
完成信号实际上会在时钟上升沿之后改变一些小的组合路径延迟,从而导致计数器达到 0。任何使用完成信号的逻辑在下一个上升沿之前都有剩余的时钟周期,以执行以下操作它需要执行(更多组合逻辑)并且仍然满足由完成信号调节的任何寄存器输入的设置时间。
只有当任何寄存器的输入在时钟转换时正确转换时,才会出现亚稳态问题。如果正在注册的数据来自使用异步时钟的寄存器,或者寄存器的建立或保持时序被违反,则可能会发生这种情况。
关于counter - 良好的计数器设计或可能的亚稳态问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24337984/
我是一名优秀的程序员,十分优秀!