根据逻辑电路的不同特点,数字电路分为组合逻辑和时序逻辑,今天让我们一起来学习一下两种逻辑的区别以及使用环境。
时序逻辑和组合逻辑的区别
关于组合逻辑和时序逻辑的不同,我们可以从三方面来理解,分别是 code(代码),电路图和波形图三方面。
(1)从代码层面来看,时序逻辑即敏感列表里面带有时钟上升沿,如果是没有上升沿或者是带有“*”号的代码,为组合逻辑。
(2)电路层面,两种逻辑反映的电路也有不同,时序逻辑相当于在组合逻辑的基础上多了一个 D 触发器。
(3)波形图层面,组合逻辑的波形是即刻反映变化的,与时钟无关;但是时序逻辑的波形不会立刻反映出来,只有在时钟的上升沿发生变化。
用一个简单的例子来区分学习下,如计算 c=a+b。
在代码层面,时序逻辑代码表示如下,可以看到此代码有“posedge“时钟上升沿,即表示有一个 D 触发器,a+b 的结果 c 是在 D 触发器发出指令后才进行输出的。
always@(posedge clk or negedge rst_n)begin if(rst_n==l'bO)begin c <= 0; end else begin c <= a + b; end end
组合逻辑则如下所示,是不带上升沿的,有“*”号的,直接输出 a+b=c 的值,不进行额外操作:
always@(*)begin c = a + b; end
对比两种逻辑的代码表示,可以看出同样是输出 c 的值,不同的逻辑输出时间却不同,时序逻辑是在时钟上升沿输出,组合逻辑则直接输出。
电路图层面,组合逻辑为一个加法器连接 a 和 b,紧接着立刻给到 c,如下图所示,可以看到 a+b 得出的值 c 直接输出,没有进行任何额外操作:

时序逻辑的电路图加法器连接的 a 和 b 没有变,但是 c 的值在输出部分,不会直接输出,D 触发器就像一扇门,信号值 c‘停留在门前,当 D 触发器收到了时钟 clk 上升沿的信号,才会把门打开,输出信号 c 的值,如下图所示:

可以看到,组合逻辑是直接输出信号 c,时序逻辑需要 D 触发器收到时钟上升沿信号后才会输出信号 c。
在波形图层面,我们可以画出时序图来分析,如下图所示。可以看出第一个时钟时 a=1,b=2,此时组合逻辑立刻得出 c=3,是跟时钟没有关系的;但是时序逻辑一定要在下一个时钟的上升沿处才得出 c=3 的结果;
以此类推,后面的原理是一样的,当 a=2,b=4 时,组合逻辑马上得出 c=6,时序逻辑在第 3 个时钟上升沿得出 c=6。

综上所述,我们进行一下总结,组合逻辑任意时刻的输出仅仅取决该时刻的输入,与时钟无关;时序逻辑先算好当前输入信号的结果,但还不影响输出,只有等到时钟上升沿的一瞬间,才把结果给了输出。
时序逻辑和组合逻辑的使用
相信大家已经可以非常清晰的区分组合逻辑和时序逻辑,下面我们就讨论一下组合逻辑和时序逻辑的使用环境。
首先我们需要保证信号的结果是正确的,只要满足目标需求,这时使用时序逻辑还是组合逻辑都是可以的(这里我们讨论的是大多数情况,但也有例外,例如模块的输出一般要求是时序逻辑)。
在实际设计中,为了便于操作,我们可以首先考虑用时序逻辑,看是否能满足设计要求。如果无法满足目标要求,需要凑时序,那么就考虑改为组合逻辑。
举个例子便于大家更好地理解,如下图所示,假设有一个模块,有两个信号 dout 和 dout_vld,其中 dout 表示数据,dout_vld 表示数据有效性。我们假设需要该模块先后输出两个数据 6 和 1。

如下图所示,该波形输出就是正确的,只要设计能保证正确性,那不管使用组合逻辑还是时序逻辑,都是可以的。

但假设现在输出的结果如下图所示,输出的是 8 和 5,不是我们目标需要的 6 和 1,并且可以看到,dout_vld 比 dout 晚了一个时钟,这个时候就可以考虑设计 dout_vld 的时序逻辑改为组合逻辑,将信号 dout_vld 提前一拍,就可以得到正确的结果。
另一种方法,假设 dout 是组合逻辑设计的,就是把 dout 改为时序逻辑实现,将 dout 推迟一拍,达到信号对齐的效果。

通过上面的详细解释,相信大家都可以掌握时序逻辑和组合逻辑的原理和使用。
扫码关注尚为网微信公众号

原创文章,作者:sunev,如若转载,请注明出处:https://www.sunev.cn/embedded/1237.html