打印
[FPGA]

组合逻辑与时序逻辑电路

[复制链接]
2026|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 | 只看该作者
希望多来分享啊

使用特权

评论回复
5
cityday| | 2014-5-9 17:00 | 只看该作者
赞一个,挺清楚的,菜鸟感谢楼主~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

126

帖子

6

粉丝