初级会员
- 积分
- 83
- 金钱
- 83
- 注册时间
- 2018-11-20
- 在线时间
- 18 小时
|
3金钱
尊敬的 正点原子团队 以及 论坛里的各位 大佬,小弟请教一个问题:
在手把手教你学 FPGA 教程里,第一个实验 流水灯,每隔 0.2 秒 切换 下一个led 灯,可是仔细研究了代码,并做了仿真之后,发现led灯 切换的时间 不是0.2s,而是 0.2秒 再加 20ns
1 :先贴出一段源码
实验里里计数器部分源代码如下:
//计数器对系统时钟计数,计时0.2秒
always @(posedge sys_clk or negedge sys_rst_n) begin
if (!sys_rst_n)
counter <= 24'd0;
else if (counter < 24'd1000_0000)
counter <= counter + 1'b1;
else
counter <= 24'd0;
end
2: 对counter 的值 进行分析
这样 counter 的值 不就是 从 0 变化到了 1000_0000,共 1000_0001 个时钟周期了吗? (时钟频率是50MHZ,一个时钟周期 就是 20ns) 共 0.2秒 再加 20ns , 那流水灯 的切换间隔 不就多 了 20 ns 了吗?
3: 仿真验证 一下 (图看不清的话,可以下载 在放大了看)
仿真验证 一下 ,这里把 if (counter < 24'd1000_0000) 改成 if (counter < 24'd10) 目的是便于仿真观察。
4 : 问题来了
所以,是不是 应该把 if (counter < 24'd1000_0000) 改成 if (counter < 24'd1000_0000 — 1'b1) 更好呢 ?
|
最佳答案
查看完整内容[请看2#楼]
对的,计数器从0开始计数,如果严格计算周期是应该减去1。这里是为了方便计算,没有减1,Modelsim仿真实验的视频是以流水灯为例的,有对这个作说明
|