本帖最后由 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型变量赋值。
请指点!!
|