在前面的内容中,我们都是基于前仿真来检验我们的代码,除了倍频电路设计是必须要使用后仿真,但这是为什么呢?现在我们就来解答这个问题。 首先,我们先回顾一下我们的前面内容讲过的计数器,通过前仿真与后仿真的对比,来认识后仿真是怎么一回事。 计数器前仿真图: 计数器前仿真图: 在进行后仿真之前,我们必须进行一次全编译 ,在全编译完成之后,就可以进行后仿真了:选择tool → Run simulation Tool → Gate level Simulation 不同版本的Quartus可能time model可能不同,但都只要选择最慢的time model即可,通常都是直接按run就是最慢的time model。 下图为后仿真: 通过上面的两张图,我们可以知道前仿真跟后仿真的最大不同就是,输出有了延迟,在前仿真中,我们可以很明显看到时钟信号clk每到上升沿,count_out输出信号马上就会更新,而到了后仿真中,clk时钟信号每到上升沿,count_out需要等待一段时间才能更新,这就是前仿真跟后仿真的本质不同,前仿真仅仅是仿真代码的逻辑是否有误,而后仿不仅仅仿真逻辑是否有误,还会把电源元器件直接的延迟也加上,所以后仿真更能体现一个电路系统的真实情况。 然后,我们现在把后仿真的图像给放大,如下图所示: 放大后: 再放大后: 把后仿真的图像放大之后,我们发现计数器,从3计数到4的时候,计数器输出信号count_out会先输出2然后输出0,最后再输出4,产生了毛刺。下面我们一起通过计数器的架构图来分析一下为什么会出现这种情况,计数器架构图如下: 当计数器输出信号count_out输出3的时候,Q0Q1Q2= 110,当时钟信号clk再次变化的时候,Q0=0,此时count_out输出等于2,然后Q1=0,此时count_out输出就变成了0,最后Q2=1,此时count_out输出才变成4,下面我们用一张时序图来说明这个问题。 由于时钟信号clk到每一个寄存器的时钟是不一致的,所以会导致Q0Q1Q2数据刷新的时间不一样,而Q0Q1Q2刷新顺序,是由综合器综合出来的FPGA内部实际电路图(网表)所决定。 下面我来解释一下倍频电路的实现原理,倍频电路的架构图如下:
当时钟Clk_in的上升沿到来的时候,REG_A把D等于1的值给予Q输出1,经过后面的OR门跟非门的延时,使得REG_A复位,Q输出0,当时钟Clk_in的下降沿到来的时候,REG_B把D等于1的值给予Q输出1,经过后面的OR门跟非门的延时,使得REG_B复位,Q输出0,然后把REG_A跟REG_B的Q输出信号用一个OR门结合在一起,就实现了倍频电路了。时序图如下:
后仿真图如下:
|