如有朋友能解决此问题,希望留言告知,感激不尽~
当前状态:部分解决(实况更新)
问题
写的顶层模块如下,主要实现将系统时钟转化为周期为500ms的时钟作为计数器的计数基准时钟:
module CounterIP(
CLK,
nRST,
Count
);
input CLK;
input nRST;
output wire [3:0]Count;
reg clk;
reg [23:0]cnt;
parameter Time500MS = 25'd25_000_000;
Counter u1(
.clock(clk),
.q(Count)
);
always @(posedge CLK or negedge nRST)
if(!nRST)
begin
clk <= 1;
cnt <= 24'd0;
end
else if(cnt == Time500MS/2 - 1)
begin
cnt <= 24'd0;
clk <= ~clk;
end
else
cnt <= cnt+1;
endmodule
写的TestBench文件如下:
`timescale 1ns/1ns
`define clock_period 20 //定义时钟周期20ns
module CounterIP_tb;
reg clk;
reg n_rst;
wire [3:0]count;
parameter endTime = 33'd7_000_000_000;
CounterIP u1(
.CLK(clk),
.nRST(n_rst),
.Count(count)
);
initial clk = 0;
always #(`clock_period/2) clk = ~clk;
initial begin
n_rst = 0;
#(`clock_period*200);
n_rst = 1;
#endTime;
$stop;
end
endmodule
仿真效果如图,可以看出计数值每500ms(500000000ns)计数值+1,一切正常。
然后我将Counter的四位输出接到板子的四位LED上,结果它始终全亮,对应Count值为 0000 ,令人费解。
问题解决
- 感觉自己有点弱智了。如下图,因为创建计数器的时候
进位输入
和进位输出
是可选项,同时存在一个时钟输入;我就顺势理解为来一个clock记一个数,单级的计数器不需要进位输入和输出,但实际上clock就是单纯的驱动时钟,进位输入才是计数来源。(这就引发了一个新疑惑,上面没有进位输入的时候,仿真为什么是按clock来计数
)
所以我们重新创建计数器如下:
并调整程序代码如下:
module CounterIP(
CLK,
Count,
Cout
);
input CLK;
output wire Cout;
output wire [3:0]Count;
wire cin;
reg [24:0]cnt = 25'd0;
parameter Time500MS = 25'd25_000_000;
Counter u1(
.cin(cin),
.clock(CLK),
.q(Count),
.cout(count)
);
always @(posedge CLK)
if(cnt == Time500MS-1)
cnt <= 25'd0;
else
cnt <= cnt+1;
assign cin = (cnt==Time500MS-1) ? 1:0; //每0.5s产生一个进位输入脉冲
endmodule
如此,功能仿真和班级调试均能通过~
但还是前面提到的,为什么问题中没有进位输入
的情况下仿真能够顺利进行?
对于新的疑惑,还希望有经验的朋友能够不吝赐教。