我目标的快速摘要: 设计由可变长度自动重载定时器触发的计数器。
稍微详细一点:将会有一个寄存器,其值会发生变化(可预测会发生变化,并在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)
);
答案 0 :(得分:3)
只要您的AutoReloadTimer和Counter模块以及使用完成信号的任何逻辑都在同一时钟上,您就不会遇到任何亚稳态问题。您将拥有完全同步的实现。当然,您还必须满足使用设备的时间要求
完成信号实际上会在时钟上升沿之后改变一些小的组合路径延迟,导致计数器命中0.任何使用完成信号的逻辑在下一个上升沿之前的剩余时钟周期内,做什么它需要做(更多的组合逻辑),并且仍然满足由完成信号调节的任何寄存器输入的设置时间。
只有在时钟转换时任何寄存器的输入正在转换时,才会出现亚稳态问题。如果正在注册的数据来自使用异步时钟的寄存器,或者寄存器的建立或保持时序被违反,则会发生这种情况。