什么是组合逻辑电路?
数字电路理论中组合逻辑电路1(combinatorial logic或combinational logic)是一种逻辑电路,它的任一时刻的稳态输出,仅仅与该时刻的输入变量的取值有关,而与该时刻以前的输入变量取值无关。 用数学公式表达,即:
F
i
=
f
(
x
1
,
x
2
,
…
,
x
n
)
,
i
=
1
,
2
,
…
,
m
.
\ F_i=f(x_1,x_2,…,x_n) , i=1,2,…,m\,.
Fi=f(x1,x2,…,xn),i=1,2,…,m.
计算机中用到的其他电路,如半加器、全加器、半减器、全减器、数据选择器、数据分配器、编码器和译码器也用来构成组合逻辑电路。
逻辑电路的分析
补充知识点
有效电平
数电实践课上,我们会经常听到片选信号低电平有效之类的说法,那么这具体代表什么含义呢?
- 有效电平(有信号输入或输出)
正逻辑电路中,凡是变量1表示有信号输入或输出,则为高电平有效电路;凡变量0表示的则为低电平有效电路; - 输入变量的有效电平往往取决于信号的来源,输出变量的有效电平往往取决于负载对电路的要求;为了方便设计,当高电平有效时,写为原变量,当低电平有效时,写为反变量。
- 片选是一个单片机学科术语,片选信号一般是在划分地址空间时,由逻辑电路产生的;
- 为了降低功率,同时减少干扰和保证控制的可靠性,许多器件的片选信号选择低电平有效;
最小项和最大项
我们用真值表定义一个布尔函数,布尔函数可以用乘积项的逻辑和表示。简单来说,最小项即包含n个变量的与项。
例如:A,B,C三个逻辑变量的对应23=8个最小项,分别为:
A
B
C
,
A
B
C
ˉ
,
A
B
ˉ
C
,
A
ˉ
B
C
,
A
B
ˉ
C
ˉ
,
A
ˉ
B
C
ˉ
,
A
ˉ
B
ˉ
C
,
A
ˉ
B
ˉ
C
ˉ
\ ABC, AB\bar{C}, A\bar{B}C, \bar{A}BC, A\bar{B}\bar{C}, \bar{A}B\bar{C}, \bar{A}\bar{B}C, \bar{A}\bar{B}\bar{C}\,
ABC,ABCˉ,ABˉC,AˉBC,ABˉCˉ,AˉBCˉ,AˉBˉC,AˉBˉCˉ
如果用和式的逻辑乘表示布尔函数,最大项即为包含n个变量的或项。
如:
F
1
=
A
ˉ
B
C
+
A
B
ˉ
C
+
A
B
C
ˉ
=
∑
m
(
3
,
5
,
6
)
\ F1=\bar{A}BC+A\bar{B}C+AB\bar{C}=\sum m(3,5,6)\,
F1=AˉBC+ABˉC+ABCˉ=∑m(3,5,6)
F
2
=
(
A
ˉ
+
B
ˉ
+
C
ˉ
)
(
A
ˉ
+
B
ˉ
+
C
)
(
A
+
B
ˉ
+
C
)
=
∏
M
(
0
,
1
,
2
)
\ F2=(\bar{A}+\bar{B}+\bar{C})(\bar{A}+\bar{B}+C)(A+\bar{B}+C)=\prod M(0,1,2)\,
F2=(Aˉ+Bˉ+Cˉ)(Aˉ+Bˉ+C)(A+Bˉ+C)=∏M(0,1,2)
电路分析与设计
逻辑电路分析题,一般要求我们找到输入输出之间的逻辑关系,并指出电路的逻辑功能;
组合逻辑电路功能的几种表示方法:真值表、卡诺图、逻辑表达式及时间图。
电路分析的步骤:
- 逻辑图->逻辑表达式;//若给定波形图,可采用控制变量法判断输入输出变量,再有真值表最小项或最大项写出表达式;
- 化简逻辑表达式;//可用代数运算或卡诺图
- 确定输出变量的物理意义,进而描述电路功能(如:将8421码转化为余三码)
逻辑电路设计题中,往往给定功能,要求设计出最佳电路。一般,最佳电路要求:
- 所用逻辑器件的数目、种类最少,且器件之间的连线最简单;
- 门电路有延迟,应使级数尽量少;
- 功耗小,工作稳定可靠
例:分析下图电路的功能,并写出verilog HDL程序。
解答步骤
- 写出逻辑表达式
G 3 = B 3 ; G 2 = B 3 ⊕ B 2 ; . G 1 = B 2 ⊕ B 1 ; . G 0 = B 1 ⊕ B 0 ; . \ G3=B3;\, \ G2=B3 \oplus B2;\,. \ G1=B2 \oplus B1;\,. \ G0=B1 \oplus B0;\,. G3=B3; G2=B3⊕B2;. G1=B2⊕B1;. G0=B1⊕B0;. - 列出真值表分析
该电路的功能是:将4位二进制码转化为4位GRAY码。 - verilog代码
// BTOG module
module BTOG(B3,B2,B1,B0,G3,G2,G1,G0);
input B3,B2,B1,B0;
output G3,G2,G1,G0;
assign G3=B3;
assign G2=B3^B2;
assign G1=B2^B1;
assign G0=B1^B0;
endmodule
电路器件原理
数据选择器
数据选择器又称多路选择器(MUX),可等效为一个单刀多掷开关;
可以看到MUX有两种输入端:地址输入端(用A表示)和数据输入端(用D表示)。
n个地址输入端对应2n个数据输入端。因为把从全0到全1排列,共有2n个值,每一个值对应一个D端;每取一个值,对应一个选中的D端,这时输出Y为该D端口的值。
如:2选1、4选1、8选1···MUX
功能描述:
以8选1MUX为例,集成电路74LS151
¬
E
\neg E
¬E为使能端,低电平有效。
输出函数表达式
Y
=
∑
i
=
1
3
m
i
D
i
=
(
A
2
A
1
A
0
)
m
(
D
0
D
1
D
2
D
3
)
T
\ Y=\sum_{i=1}^3 m_iD_i=(A_2A_1A_0)_m(D_0D_1D_2D_3)^T\,
Y=i=1∑3miDi=(A2A1A0)m(D0D1D2D3)T
推广:对n个地址输入的MUX,其表达式为:
Y
=
∑
i
=
1
2
n
−
1
m
i
D
i
\ Y=\sum_{i=1}^{2^n-1} m_iD_i\,
Y=i=1∑2n−1miDi
其中mi是由地址变量组成的地址最小项。
verilog语言描述
// MUX8 module
module mux8(A,D,Y);
input [2:0]A;
input [7:0]D;
output Y;
reg Y;
always@(A)
case(A)
0:Y<=D[0];
1:Y<=D[1];
2:Y<=D[2];
3:Y<=D[3];
4:Y<=D[4];
5:Y<=D[5];
6:Y<=D[6];
7:Y<=D[7];
endcase
endmodule
注:
- verilog语言可用case条件语句表示多种情况的分支,但一定要将所有情况穷尽;
- 列出所有有效情况后要加上default保证所有情况都能执行。default缺省,表示列出的情况以外的情况都执行default语句。
- 可以利用数据选择器设计多功能组合电路的类型。
数据分配器
数据分配器(DEMUX)将一路输入数据按n位地址分配到2n个数据输出端上;
有两种输入端:地址输入端,用A表示;数据输入端,用D表示。n个地址输入端对应2n-1个数据输出端。每取一个地址值,对应选中的Y端,此时对应的Y端输出D值,没选中的Y端默认输出为高电平。数据分配器等效为数据选择器的反变换。
输出函数表达式
Y
=
{
D
,
i
=
A
2
n
−
1
⋅
⋅
⋅
A
1
A
0
1
,
i
≠
A
2
n
−
1
⋅
⋅
⋅
A
1
A
0
\ Y=\begin{cases}D,&i=A_{2^n-1}···A_1A_0 \cr 1,&i\neq A_{2^n-1}···A_1A_0\end{cases}\,
Y={D,1,i=A2n−1⋅⋅⋅A1A0i=A2n−1⋅⋅⋅A1A0
编码器/译码器
编码器
编码器有2^n个数据输入端和n个数据输出端,每个码只对应一个输入信号,某时刻只对一个输入信号进行编码。
常见的编码器类型有3种:二进制编码器、二-十进制编码器、优先编码器。这里主要介绍优先编码器。
优先编码器允许输入端同时有多个编码信号,但是电路只对优先权较高的一个进行编码。
如图,这是一个4-2优先编码器,有4个输入端,2个输出端。所有输入端都有一个小圆圈,表示输入为低电平有效,即输入0时有效,输出端也是如此,输出低电平为有效电平。
附加的功能端有:
- S ‾ \overline{S} S:选通输入端,即使能端,低电平有效;
- Y s ‾ \overline{Y_s} Ys:选通输出端,低电平有效,无编码输入指示;
- Y E X ‾ \overline{Y_{EX}} YEX:输出扩展端,低电平有效,指示编码状态;
以74LS148编码器为例,用verilog语言设计:
// cod8 module
module cod8(nS,nI,nY,nYs,nYex);
input nS;
input [7:0] nI;
output [2:0] nY;
output nYs,nYex;
reg [2:0] nY;
reg nYs,nYex;
always @(nS or nI)
if(nS)
{nY,nYs,nYex}<=5'b00011;
else
casex(nI)
8'b0xxxxxxx: {nY,nYs,nYex}<=5'b00010;
8'b10xxxxxx: {nY,nYs,nYex}<=5'b00110;
8'b110xxxxx: {nY,nYs,nYex}<=5'b01010;
8'b1110xxxx: {nY,nYs,nYex}<=5'b01110;
8'b11110xxx: {nY,nYs,nYex}<=5'b10010;
8'b111110xx: {nY,nYs,nYex}<=5'b10110;
8'b1111110x: {nY,nYs,nYex}<=5'b11010;
8'b11111110: {nY,nYs,nYex}<=5'b11110;
default: {nY,nYs,nYex}<=5'b11101;
endcase
endmodule
注:casex语句与case、casez语句的区别
语句格式相同,但对于x,z的敏感程度不同;x表示无效,z表示高阻;
casez语句中,如果分支表达式某些位的值为高阻z,那么对这些位的比较就会忽略,而只关注其他位的比较结果;
变量前加n表明变量使低电平有效;
译码器
逻辑功能:将输入的二进制代码的原意译为相应的状态信息。可分为两种类型:变量译码器和显示译码器;
- 变量译码器:唯一地址译码器,常用于计算机中将一个地址代码转换成一个有效信号;
- 显示译码器:主要用于驱动数码管显示数字或字符;
变量译码器最常用的是3-8译码器即74LS138译码器。
如上图,输入端为高电平有效,输出端为低电平有效。三个使能端必须同时有效,即 E 1 E 2 ‾ E 3 ‾ = 100 时 E_1\overline{E_2}\overline{E_3}=100时 E1E2E3=100时,芯片才能正常工作。正常工作时,输出表达式为:
Y i ˉ = m i ˉ = M i , ( i = 0 , 1 , … , 7 ) \ \bar{Y_i}=\bar{m_i}=M_i ,(i=0,1,…,7)\, Yiˉ=miˉ=Mi,(i=0,1,…,7)
使用verilog语言实现3-8译码器,使能端高电平有效,输出端低电平有效:
// decode module
module decode(Ain,En,Yout);
input En;
input [2:0] Ain;
output [7:0] Yout;
reg [7:0] Yout;
always @ (En or Ain)
begin
if (!En)
Yout = 8'b0;
else
case (Ain)
3'b000 : Yout = 8'b00000001;
3'b001 : Yout = 8'b00000010;
3'b010 : Yout = 8'b00000100;
3'b011 : Yout = 8'b00001000;
3'b100 : Yout = 8'b00010000;
3'b101 : Yout = 8'b00100000;
3'b110 : Yout = 8'b01000000;
3'b111 : Yout = 8'b10000000;
default : Yout = 8'b00000000;
endcase
end
endmodule
注:
- 实际编程时,应尽量避免使用for语句。虽然理论可行,但是电路模块是不能循环的,每一次循环都需要额外的电路开销。
- 译码器实际相当于一个最小项输出器,可实现任何组合逻辑函数;输出可以是单变量或多变量;设计方案不唯一;
- 当输出为低电平有效时,将表达式转化为与非形式更方便。
数码管
最常用的是七段显示数码管,可以显示十进制数,分为共阳与共阴两种类型。
注:
- 由于二极管的导通性,要使数码管发光,共阳型另一端需接低电平;共阴型另一端需要接高电平。
- 译码器与共阴数码管连接时需要连接上拉电阻来保护器件。
verilog实现(共阴数码管):
// seg module
module seg7 (bcd, leds);
input [3:0] bcd;
output [1:7] leds;
reg [1:7] leds;
always @(bcd)
case (bcd) //abcdefg
0: leds = 7’b1111110;
1: leds = 7’b0110000;
2: leds = 7’b1101101;
3: leds = 7’b1111001;
4: leds = 7’b0110011;
5: leds = 7’b1011011;
6: leds = 7’b1011111;
7: leds = 7’b1110000;
8: leds = 7’b1111111;
9: leds = 7’b1111011;
default: leds = 7’bx;
endcase
endmudule