【 Verilog HDL 】避免出现锁存器的组合电路描述方式

版权声明:本博客内容来自于个人学习过程中的总结,参考了互联网以及书本、论文等上的内容,仅供学习交流使用,如有侵权,请联系我会重写!转载请注明地址! https://blog.csdn.net/Reborn_Lee/article/details/82789677

无论多么复杂的FPGA设计,如果我们将其中具有存储功能的机构(寄存器、RAM、FIFO等)全部拿掉,那么剩下的若干独立数字电路网络则都是纯组合逻辑电路,对应的,我们称FPGA设计中这些具有存储功能的结构为纯时序逻辑电路。

在数字电路的世界中,只有两种电路,即组合逻辑电路和时序逻辑电路,而时序逻辑电路中则包含了组合逻辑电路部分和纯时序逻辑电路部分。

分析下面这个代码:

module test(...);

...
always@(sel,b)
begin
    if( sel = 1'b1 )
        a = b;
end


endmodule

请问上述代码描述的是不是一个组合逻辑电路呢?

我们首先要知道组合逻辑电路的概念:如果数字电路满足任意时刻的输出仅仅取决于该时刻的输入,那么该数字电路为组合逻辑电路。

根据此概念,我们分析一下,上述HDL描述: 上述例子中,输出为a,输入为sel,b。当sel为逻辑1时,输出a完全取决于b,可当sel为逻辑0呢?从语法上分析,此时a应该保持为最近一次sel为逻辑1时b的值,而与当前的b值无关。由此可见,上述代码并不符合组合逻辑的定义。

事实上,该段代码在综合时会引入锁存器,这是一个具有存储功能的单元,因此实际上实现的是一个时序逻辑电路。而且锁存器还有很多缺点:

首先,由于锁存器是毛刺敏感的,如果不能保证sel信号的质量,那么会造成输出信号a的不稳定;

其次,FPGA芯片中一般没有锁存器这样一个资源,需要使用一个触发器和一些逻辑门来实现,比较浪费资源;

第三,锁存器的引入会对时序分析造成困难。

因此,除非你现在就需要实现一个锁存功能,否则在编写组合逻辑电路时,请务必确认HDL代码覆盖到了组合逻辑的所有分子,以避免锁存器的引入。仍以上述代码为例,判断是否覆盖到了所有分子的一个方法,就是要确定无论输入sel和b怎么变化,always块中的代码从begin到end执行一遍,都能够经过至少一条对输出a的赋值语句。

修改后的代码类似如下:

always@(sel,b)
begin
    if(sel = 1'b1)
        a = b;
    else
        a = 1'b0;

end

这篇博文与下面这篇博文同时服用:【Verilog HDL】设计硬件电路时,如何避免生成锁存器?

猜你喜欢

转载自blog.csdn.net/Reborn_Lee/article/details/82789677