组合逻辑与时序逻辑电路

2020-02-23 10:47发布

本帖最后由 TataJen 于 2014-2-12 15:37 编辑

组合逻辑电路:是指数字电路在任何时刻的输出仅仅取决与该时刻数字电路输入,而与电路原来的状态无关。、
时序逻辑电路:是指数字电路在任何时刻的输出不仅取决与当时的输入信号,而且还取决于电路原来的状态,或者说和以前的输入有关。

上面的话很好记,反映到实际情况中查了好些资料才算理解。
对于从事FPGA工作的,区分组合逻辑电路与时序逻辑电路需要从”硬件电路“和”verilog语言“两方面来区分。

从硬件电路上来说:
             两者的区别在于逻辑电路是否包含“记忆性单元”:
             组合逻辑电路不包含记忆性单元,时序逻辑电路包含记忆性单元。
             译码器、加法器由非记忆性单元构成,故属于组合逻辑电路。
             寄存器、计数器由记忆性单元构成,故属于时序逻辑电路。
组合逻辑单元的另一个特点是:    1   输入、输出之间没有反馈延迟通道
            
从verilog语法上大家只要记住下面4个组合逻辑电路的要点,与之相反的就是时序逻辑电路:(可以只看要点)

要点1:用alway描写组合逻辑电路,敏感事件列表中,不要使用边缘敏感事件。

要点2:为变量赋值使用阻塞赋值(=),不要使用非阻塞赋值(<=0)。

要点3:用always 块时,必须注意电平敏感信号表是否完全,

如: always @ (a or b or c or d)
            begin  q=(a&b&c) | (d&e);
            end

此时生成的不是组合逻辑,因为当e变化时,q不能立即跟着变化。只有当a/b/c/d发生变化时e的影响变化结果才会显示出来,可见综合成的电路需要一个寄存器来存储e的变化。

要点4:用always 块时,不要忘了加else语句:

如: always @ (a or b)
            begin if(c)  q=a;
            end
或: always @ (a or b)
            begin if(c)  q=a;
                    else;
            end

上面两种形式生成的都不是纯组合逻辑电路,因为当c==0时,q能保留原来的值,所以生成的电路中有锁相环( 组合逻辑单元的另一个特点是:    1   输入、输出之间没有反馈延迟通道)。

如果将上面两个函数改成这样就是组合逻辑电路了:
     always @ (a or b)
            begin if(c)  q=a;
                     else q=b;
            end
或者这样也行:
      always @ (a or b)
            begin if(c)  q=a;
                     else q=0;
            end
补充:
         1   组合逻辑电路跟时序逻辑电路重点停留在:”电路“两个字上,verilog只是语言,不是生成的电路。
         2   verilog中是否出现reg型变量跟是否是组合和时序逻辑电路无关,因为reg型变量综合出来,不一定就是寄存器。(如果综合出来有寄存器,则一定是时序逻辑电路)
         3   always 既能描述组合逻辑电路,也能描述时序逻辑电路,always 块内被赋值的变量必须是reg型变量。
         4   assign 描述的都是组合逻辑电路,assign只能对wire型变量赋值。
请指点!!
   
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。