【FPGA开发】Modelsim仿真精度的坑

问题所在

       最近在使用黑金的AXU3EG板卡对着正点原子ZYNQ7020的例程进行移植学习。但在编写tb代码以及使用modelsim进行仿真时出了问题,发现我的实际波形与正点的对不上,仔细测量一下波形发现,我的系统时钟是6ns周期,而不是理想中的5ns周期,这才想到,正点的板子用的是50M单端时钟,也就是20ns的时钟周期,一半也就是10ns,而黑金的板子用的是200M的差分时钟,也就是5ns的时钟周期,一半也就是2.5ns(虽然我在编写tb代码时只用了其中一级),而正是这个小数出了问题!

       我开始时编写的tb代码中:

`timescale 1ns / 1ns       //仿真单位/仿真精度

...

initial begin
    sys_clk <= 1'b0;
    sys_rst_n <= 1'b0;
    #200
    sys_rst_n <= 1'b1;
end

always begin
    #2.5
    sys_clk <= ~sys_clk;
end

...

       时钟的翻转是我自己臆想的2.5ns翻一次,而实际上,由于仿真单位和仿真精度都是定义的1ns,也就是说,我对于时钟的翻转,最后会给优化为四舍五入的#3,即3ns,也就导致最后的时钟为6ns的周期。

问题的解决

       知道了问题的所在,解决起来就轻松了,只需要把仿真单位和仿真精度再提高一些就行了,而在ns后面的单位是ps,它们之间的进制也是1000,修改代码如下:

`timescale 100ps / 100ps       //仿真单位/仿真精度

...

initial begin
    sys_clk <= 1'b0;
    sys_rst_n <= 1'b0;
    #2000
    sys_rst_n <= 1'b1;
end

always begin
    #25
    sys_clk <= ~sys_clk;
end

...

       这里需要注意,不仅仅是只改变最上面的仿真单位和精度,下面使用#的所有延时都要同步的进行修改。

       然后继续进行仿真,发现由于修改了仿真单位和精度,最后的坐标轴变成了以ps为单位,这会把所有数都显得很大,不太美观,如下图所示:

在这里插入图片描述

       这时,我们只需要右键点击坐标轴,选择“Grid, Timeline & Cursor Control…”。

在这里插入图片描述

       再把Time units改回ns即可。

       这时再测量系统时钟,就是预期的5ns时钟周期了。

535ba202b48b0" style="zoom:33%;" />

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辣个蓝人QEX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值