-1

以下代码是为异步计数器编写的。程序编译得很好,但计数器值在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
4

2 回答 2

2

T-FlipFlop 或切换触发器应在启用时切换其输出,您只需:

if(clkDivider==11)
  q<=1;

替换 q<=1q<=~q使其在启用时切换。

于 2013-03-03T17:37:37.730 回答
0

正如您所提到的,这是一个异步计数器。您的 Verilog 模拟没有达到您想要的效果的原因是该TFF实例b正在尝试clkDivider使用不同的时钟信号对其数据输入 ( ) 进行采样。 clkDivider由 signal 计时clk,但您尝试使用不同的时钟信号 ( q[0]) 对其进行采样。

您需要找到一种方法将 clkDivider 信号同步到其他 3 个时钟域中的每一个,或者使用完全同步的设计。

于 2013-03-03T18:49:25.633 回答