以下代码是为异步计数器编写的。程序编译正常但计数器值在1
之后不会增加。我做错了什么?
以下是代码:
//TOP
module CounterWithDivider(clk,reset,temp,q);
input clk,reset;
output [3:0]q;
output reg [3:0]temp;
reg [3:0]clkDivider;
TFF a(clkDivider,clk,reset,q[0]);
TFF b(clkDivider,q[0],reset,q[1]);
TFF c(clkDivider,q[1],reset,q[2]);
TFF d(clkDivider,q[2],reset,q[3]);
always @(posedge clk or negedge reset)
begin
if(~reset || clkDivider==12)
clkDivider<=0;
else
if(clk)
begin
clkDivider<=clkDivider+1;
temp<=clkDivider;
end
end
endmodule
// T触发器
module TFF(clkDivider,clk,reset,q);
input clk,reset;
input [3:0]clkDivider;
output reg q;
always @(posedge clk or negedge reset)
begin
if(~reset)
q<=0;
else
if(clkDivider==11)
q<=1;
end
endmodule
答案 0 :(得分:2)
T-FlipFlop或切换触发器应在启用时切换其输出,您只需:
if(clkDivider==11)
q<=1;
将q<=1
替换为q<=~q
,以便在启用时切换。
答案 1 :(得分:0)
如你所说,这是一个异步的反击。您的Verilog仿真没有按照您的要求进行操作的原因是TFF
实例b
正在尝试使用不同的时钟信号对其数据输入(clkDivider
)进行采样。 clkDivider
由信号clk
计时,但您尝试使用不同的时钟信号(q[0]
)对其进行采样。
您需要找到一种方法将clkDivider信号同步到其他3个时钟域中,或者使用完全同步的设计。