【答疑】违反“时钟沿前看条件”原则的分析

【答疑】违反“时钟沿前看条件”原则的分析

本文为明德扬原创文章,转载请注明出处!web

明德扬有一条很是重要的看波形技巧,即“时钟上升沿前看条件”的技巧,意思就是在时钟上升沿前,看条件信号,看到什么值就是值。
在这里插入图片描述
这一条技巧,对于刚学习FPGA的人来讲,很是之实用。svg

可是,部分工程师在作仿真时,有时候会出现违反这一原则的奇怪现象。例以下面这个案例:学习

关于在仿真软件中,为何计数器的断定会在不知足加一条件的时候进行加一操做(以下图所示)。计数器cnt_col的加1条件是din_vld,按照原则,第4个时钟上升沿的时候,din_vld应该为0,计数器不该该加1,但事实上是加1了,这是怎么回事?咱们举另外一个例子来讲明这个问题。
在这里插入图片描述
功能要求以下:复位后,din_vld 不定时等于1,当din_vld出现3个或超过3个周期的高电平脉冲时,将第三个周期时对应的din值赋给dout,其余时候dout保持不变。测试

根据功能要求,写出代码后用modelsim进行仿真,效果以下图:在这里插入图片描述
而后发现仿真的波形和咱们预期的波形并不一致!!在这里插入图片描述在这里插入图片描述在这里插入图片描述
计数器cnt在din_vld == 0 的时候就已经开始计数了。设计

查看代码,计数器cnt的加一条件是:add_cnt = din_vld == 1 && flag == 0 。xml

也就是说,信号din_vld在时钟上升沿处由0变1的时候,仿真软件把信号din_vld的值取为1了。blog

那么会出现这种状况的缘由是什么呢?图片

这里是软件仿真,是软件模拟真实的电路状况。可是,软件模拟是有缺陷的,不管软件如何模拟,本质上它都是串行执行的代码,是一条一条指令执行的。it

在仿真文件里,有两个initial语句,一个是产生时钟的,一个是产生din_vld的,以下图。编译

在这里插入图片描述
按照verilog的语法,这两个initial是并行执行的。但事实上软件执行是有前后的。颇有可能先执行了din_vld变1的代码,再执行了clk由0变1的代码,这种状况下,在时钟的上升沿就会采到din_vld为1,所以就会出现案例中的错误。

这是与FPGA实际的电路是不符合的,也就是说这个实际上是仿真缺陷的问题,而不是设计问题。

虽然不是设计问题,但仿真仍然要继续,咱们须要避免这种状况。如何避免呢?

解决上述问题的方法:

咱们能够在测试文件中给信号加上一个1ns 的延时,这样两个initial语句就绝对不会同时执行。

代码以下图:
在这里插入图片描述

用modelsim从新编译一下再仿真,此时的波形就是功能要求的正确结果。以下图:在这里插入图片描述在这里插入图片描述在这里插入图片描述
问题完美解决!

更多FPGA相关问题欢迎留言讨论。