本文为明德扬原创录用文章,请注明转载来源!
一、什么是组合逻辑电路?
在数字电路中,根据不同的逻辑功能,我们可以将数字电路分为两类,一类是组合逻辑电路,另一类是时间逻辑电路。本文主要解释了组合逻辑电路的原理、应用和应用Verilog实现。

组合逻辑电路的逻辑功能是,任何时刻的输出仅取决于此时的输入,与电路的原始状态无关。逻辑功能中的时间逻辑电路的特点是,任何时间的输出不仅取决于当时的输入信号,还取决于电路的原始状态,或与以前的输入有关。
从图中可以看出,左侧的X代表其输入变量,右侧的Y代表其输出变量。对于这种电路,其输出Y只与当时相应的输入X有关,与之前的输入X无关。对于这种电路,我们称之为组合逻辑电路。
二、如何分析组合逻辑电路?
在了解了什么是组合逻辑电路之后, 如何分析电路?如果有电路图,我们能用什么方法快速准确地知道它的逻辑功能?
上图提供了组合逻辑电路的分析方法和过程。如何实现每一步,不记得的学生可以复习数字电力基础,复习公式简化、卡诺图简化、真实值表等内容。
三、如何设计组合逻辑电路?
从上面我们可以看出,组合逻辑电路的分析是根据给定的组合电路逻辑图来分析其逻辑功能的。然后,组合逻辑电路的设计是组合逻辑电路的反向过程。我们应该根据给定的逻辑功能要求设计最简单的逻辑电路来实现这一功能。
首先,根据逻辑功能建立真实值表,通过真实值表写出逻辑函数表达式,然后简化表达式,然后根据简化函数表达式绘制逻辑电路图。
四、竞争与冒险
产生竞争性冒险
当逻辑门的两个输入端信号同时向相反方向变化时,从变化到稳定状态所需的时间不同,称为竞争。
由于输入端的竞争,逻辑门产生了不应有的尖峰干扰脉冲(也称为过渡干扰脉冲),称为冒险。
在实际电路中,输入信号通过每个门电路然后输出,它总是需要传输时间,所以这是门电路的传输时间或延迟时间。在一个组合电路中,当一个变量通过两条以上的路径到达输出端时,由于每条路径的延迟时间不同,到达终点的时间将先有后有竞争。
2.消除竞争性冒险的方法
1)添加封锁脉冲。在输入信号产生竞争性冒险的时间内,引入脉冲封锁可能产生尖峰干扰脉冲的门。封锁脉冲应在输入信号转换前到达,转换后消失。
2)额外的选择脉冲。在输出可能产生尖峰干扰脉冲的门电路中添加一个选择通信号的输入端。只有在输入信号转换完成并稳定后,才能引入选择通信脉冲打开,此时才允许输出。在转换过程中,由于没有额外的选择脉冲,因此在输出中不会出现尖峰干扰脉冲。
3)接入滤波器电容器。由于尖峰干扰脉冲的宽度通常很窄,在可能产生尖峰干扰脉冲的门电路输出端和地面之间接入一个容量为几十皮革的电容器可以吸收尖峰干扰脉冲。
4)修改逻辑设计。
五、逻辑电路应用组合
1、编码器
逻辑功能:上图为8-3编码器的真值表,有8个输入信号和3个输出信号。I当7输入为1时,对应的3个输出为110I6当输入为1时,相应的3个输出为101,等等I当0的输入为1时。对应的三个输出为000。
变量表达式:依照前面设计组合逻辑电路的方法流程,我们根据逻辑功能真值表写出函数表达式如下所示:
电路图:然后根据表达式绘制电路图:
Verilog实现:
上述case句子是多分支选择句子,没有优先级,实现优先编码器,使用elseif语句如下图所示:
如果输入I7等于1,然后执行A=3’b000,如果I如果7不等于1,则不会执行A=3’b以下将执行else if语句。如果I6也不等于1,将依次执行,直至判断I0等于1,如果I0不等于1,所以执行else中的A=3’b000语句。从这个过程中可以看出, I7优先级最高,我们先判断I7,依次I6,直至I0。
2、译码器
逻辑功能:上图为3-8译码器的真值表,有3个输入信号和8个输出信号。逻辑公牛与编码器相反。
变量表达式:根据前面设计组合逻辑电路的方法流程,我们根据逻辑功能真值表写下函数表达式如下:
电路图:然后根据表达式绘制电路图:
Verilog实现:
译码器的应用:
数字管是将七个发光二极管以一定的方式排列,利用不同发光段的组合显示0-90个十进制数,即译码器原理的应用。
3.数据选择器
8-1数据选择器
逻辑功能:上图是8-1数据选择器我们可以从真值表中看到真值表,当A=000时,输出I0为高电平,其余为低电平,对应高电平的开关关闭,对应低电平的开关仍断开,因此,Y的输出为D0,,当D0=0时,Y=0,当D0=1时, Y=1.我们可以根据真值表写出其函数表达式:
变量表达式:根据前面设计组合逻辑电路的方法流程,我们根据逻辑功能真值表写下函数表达式如下:
电路图:然后根据表达式绘制电路图:
Verilog实现:
4.数值比较器
逻辑功能:上图是一位数值比较器我们可以从真值表中看到真值表。A>B,A<B,A=B三种情况。下面我们可以根据真值表写出它的函数表达式:
变量表达式:根据前面设计组合逻辑电路的方法流程,我们根据逻辑功能真值表写下函数表达式如下:
电路图:然后根据表达式绘制电路图:
Verilog实现:
了解数值比较器的原理,让我们使用它Verilog实现四位二进制数值比较器:
5、加法器
逻辑功能:上图是全加器其函数表达式可根据真值表写出:
变量表达式:根据前面设计组合逻辑电路的方法流程,我们根据逻辑功能真值表写下函数表达式如下:
电路图:再根据表达式画出电路图:
要进行多位数相加,最简单的方法是将多个全加器进行级联:
Verilog实现:
6、组合逻辑的两种赋值方式
由于数字电路由与导线连接的逻辑门组成,因此任何电路都可以表示为模块和分配语句的某种组合。但是,有时这不是描述电路的最方便的方法。过程(始终以块为例)为描述电路提供了另一种语法。
对于综合硬件,两种类型的始终块是相关的:
- 组合:always@(*)
- 时序:always@(posegeclk)
组合总是块等同于赋值语句,因此总有一种方法可以用两种方式表示组合电路。使用哪种选择主要是哪种语法更方便的问题。程序块内部代码的语法与外部代码不同。过程块具有更丰富的语句集(例如,if-then,case),不能包含连续的赋值*,但是还引入了许多新的非直观的错误处理方式。 (* 过程上的连续分配确实存在,但是与连续分配有些不同,并且不能综合。)
例如,分配和组合始终块描述了同一电路。两者都创建相同的组合逻辑块。每当任何输入(右侧)更改值时,两者都将重新计算输出。
assignout1 = a & b | c ^ d;
always @(*)out2 = a & b | c ^ d;
对于组合always@块,请始终使用(*)的灵敏度列表。明确列出信号很容易出错(如果您错过了一个信号),并且在硬件综合中会被忽略。如果您明确指定了灵敏度列表并错过了信号,则合成的硬件仍会像指定了(*)一样运行,但是模拟不会且与硬件的行为也不匹配。(在SystemVerilog中,使用always_comb)
关于wire和reg:assign语句的左侧必须为net类型(例如,wire),而过程赋值的左侧(在Always块中)必须为变量类型(例如reg)。这些类型(wire与reg)与合成的硬件无关,而仅仅是Verilog用作硬件仿真语言而留下的语法。
以上介绍了组合逻辑电路的原理,以及一些典型的组合逻辑电路的一些应用,并用Verilog实现这些电路,看起来很简单的电路,却是很经典很基础的,有助于我们从硬件层面去理解和设计FPGA。有机会的话,再总结时序逻辑电路的原理和典型应用。