[FPGA] 组合逻辑与时序逻辑电路

[复制链接]
2836|4
 楼主| TataJen 发表于 2014-2-12 14:40 | 显示全部楼层 |阅读模式
本帖最后由 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型变量赋值。
请指点!!
   
 楼主| TataJen 发表于 2014-2-17 23:12 | 显示全部楼层
自己顶一个,哈哈,串口通了!!
GoldSunMonkey 发表于 2014-2-18 21:00 | 显示全部楼层
恭喜恭喜
GoldSunMonkey 发表于 2014-2-18 21:00 | 显示全部楼层
希望多来分享啊
cityday 发表于 2014-5-9 17:00 | 显示全部楼层
赞一个,挺清楚的,菜鸟感谢楼主~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

126

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部