第4章 组合逻辑构建模块(常用电路)
一、导读
1.1 本章学习目标
理解编码器(Encoder)和优先编码器(Priority Encoder)的工作原理及设计方法
掌握译码器(Decoder)的结构、功能及其在地址译码和显示驱动中的应用
深入理解多路选择器(Multiplexer)的数据选择机制及其在逻辑函数实现中的通用性
学会使用多路分配器(Demultiplexer)进行数据路由
掌握二进制比较器(Comparator)的设计原理和级联方法
了解加法器(Adder)的基本结构,包括半加器、全加器和行波进位加法器
能够根据系统需求选择和组合标准构建模块
认识这些标准模块在实际集成电路中的典型器件型号和参数
1.2 为什么本章如此重要
在前一章中,我们学习了从逻辑需求到电路表达式的综合方法。然而,在实际的数字系统设计中,工程师很少从零开始设计每一个逻辑门。相反,大量经过验证的标准构建模块(Building Block)被反复使用,就像搭积木一样组装成复杂的系统。本章介绍的编码器、译码器、多路选择器和比较器,正是这些标准模块中最基本、最常用的成员。
这些构建模块的重要性体现在多个层面。首先,它们是复杂数字系统的基本组成单元。一个微处理器中包含了数以千计的译码器(用于指令译码、地址译码)、多路选择器(用于数据通路选择)和加法器(用于算术运算)。其次,这些模块具有高度的通用性。例如,多路选择器不仅可以用于数据选择,还可以用来实现任意逻辑函数;译码器配合或门可以实现任意组合逻辑函数。这种通用性使得设计者可以用少量的标准模块覆盖广泛的应用场景。
此外,理解这些标准模块的内部结构和工作原理,对于系统级设计也至关重要。当设计者选择一个商用译码器芯片时,需要了解其传播延迟、扇出能力和功耗特性,才能确保整个系统的性能满足要求。本章将帮助读者建立从模块功能到内部电路的完整认识。
1.3 核心问题引导
编码器如何将多个输入信号转换为二进制编码?普通编码器和优先编码器有什么区别?
译码器的输入输出关系是什么?如何用译码器实现任意组合逻辑函数?
多路选择器为什么被称为"通用逻辑模块"?如何用2选1多路选择器实现任意2变量函数?
多路分配器和译码器之间有什么关系?它们在功能上是否可以互换?
比较器如何判断两个二进制数的大小关系?多位比较器如何通过级联实现?
加法器中的进位传播延迟问题是什么?如何设计高速加法器?
在实际系统设计中,如何选择合适的标准模块并进行有效的组合?
二、核心概念详解
2.1 编码器与优先编码器
编码器(Encoder)是将多个输入信号线转换为较少位数二进制编码输出的组合电路。一个2^n-to-n编码器有2^n条输入线和n条输出线,当某一条输入线有效时,输出线产生对应的n位二进制编码。例如,8-to-3编码器有8条输入线(D0-D7)和3条输出线(A2, A1, A0),当D5有效时,输出为101(二进制5)。
普通编码器有一个重要的限制:它假设任意时刻只有一条输入线有效。如果多条输入线同时有效,普通编码器的输出将是不确定的(通常是各条有效输入对应编码的逻辑或),这可能导致错误的结果。
优先编码器(Priority Encoder)解决了这个问题。当多条输入线同时有效时,优先编码器只对优先级最高的那条输入线进行编码。优先级通常按照输入线的编号从高到低排列。例如,在8-to-3优先编码器中,如果D3和D7同时有效,输出为111(对应D7),因为D7的优先级最高。
优先编码器通常还有一个有效输出标志(Valid Output Flag),用于指示当前是否有任何输入线有效。这在级联多个优先编码器时非常有用:高位编码器的有效输出标志可以连接到低位编码器的使能端,实现编码范围的扩展。典型的集成器件如74LS148就是8-to-3优先编码器。
2.2 译码器
译码器(Decoder)执行与编码器相反的操作:将n位二进制输入转换为2^n条输出线中的一条有效信号。一个n-to-2^n译码器有n条输入线和2^n条输出线,根据输入的二进制值,恰好有一条输出线被激活(通常为低电平有效)。
译码器的每个输出对应一个最小项。例如,2-to-4译码器的输出分别为:Y0 = A'B'(m0),Y1 = A'B(m1),Y2 = AB'(m2),Y3 = AB(m3)。这一特性使得译码器配合或门可以实现任意组合逻辑函数:将函数对应的最小项输出连接到或门的输入端即可。例如,要实现函数F = m0 + m2 + m3,只需将译码器的Y0、Y2、Y3输出连接到一个3输入或门。
译码器在数字系统中最常见的应用是地址译码。在存储器系统中,CPU发出的地址信号经过译码器转换为选择特定存储单元的字线(Word Line)信号。例如,一个10-to-1024译码器可以将10位地址信号转换为1024条字线中的一条,选中对应的存储行。
使能端(Enable)是实际译码器的重要附加功能。使能端允许外部控制译码器是否工作,这使得多个译码器可以级联以扩展输出范围。例如,两个3-to-8译码器可以通过使能端级联为一个4-to-16译码器。典型的集成器件如74LS138是3-to-8译码器。
2.3 多路选择器
多路选择器(Multiplexer,简称MUX)根据选择信号从多个数据输入中选择一个作为输出。一个2^n-to-1多路选择器有2^n条数据输入线、n条选择线和1条输出线。选择线的二进制值决定了哪条数据输入被传送到输出端。
2-to-1 MUX是最基本的多路选择器,有2条数据输入(D0, D1)、1条选择线(S)和1条输出(Y)。其功能为:当S=0时Y=D0,当S=1时Y=D1。布尔表达式为 Y = S'D0 + SD1。
多路选择器具有逻辑函数的通用实现能力。一个2^n-to-1 MUX可以实现任意n变量的布尔函数:将函数的n个变量连接到选择线,然后根据函数真值表中每行的输出值设置对应的数据输入。例如,用4-to-1 MUX实现2变量函数F(A,B):将A、B连接到选择线S1、S0,数据输入D0-D3分别设置为F(0,0)、F(0,1)、F(1,0)、F(1,1)的值。
更巧妙的是,用2^(n-1)-to-1 MUX就可以实现n变量函数:将n-1个变量连接到选择线,剩余一个变量(或其反变量、0或1)作为数据输入。这种方法可以进一步减少所需的硬件资源。多路选择器在数据通路设计中无处不在,是条件选择、寄存器文件读取端口和数据路由的基本组件。
2.4 比较器
比较器(Comparator)用于比较两个二进制数的大小关系。1位比较器比较两个1位二进制数A和B,输出三个信号:A>B(A大于B)、A=B(A等于B)、A<B(A小于B)。其逻辑表达式为:A>B = AB',A=B = A'B' + AB = A XNOR B,A<B = A'B。
多位比较器通过从高位到低位逐级比较来判断两个数的大小。4位比较器比较A=A3A2A1A0和B=B3B2B1B0:首先比较最高位A3和B3,如果不等则直接得出结果;如果相等则比较次高位A2和B2,以此类推。这种级联比较的逻辑可以用递推公式表达。
实际的集成比较器(如74LS85,4位幅度比较器)提供了级联输入端(Cascade Inputs),用于扩展比较位数。当两个4位数相等时,输出由级联输入决定。通过将低位比较器的输出连接到高位比较器的级联输入,可以构建任意位数的比较器。例如,两片74LS85可以级联为8位比较器。
比较器在数字系统中的应用非常广泛:在算术逻辑单元(ALU)中用于条件判断,在排序电路中用于数据比较,在地址匹配电路中用于检测特定地址,在PWM(Pulse Width Modulation)控制器中用于将计数值与阈值进行比较。
2.5 加法器
加法器(Adder)是执行二进制加法运算的组合电路,是算术逻辑单元的核心组件。半加器(Half Adder)是最简单的加法器,它接受两个1位输入A和B,产生和(Sum)与进位(Carry)两个输出:Sum = A XOR B,Carry = AB。半加器不能处理来自低位的进位输入。
全加器(Full Adder)增加了进位输入(Carry In, Cin),可以处理级联加法。全加器接受三个输入A、B和Cin,输出和S与进位输出Cout:S = A XOR B XOR Cin,Cout = AB + ACin + BCin。全加器可以通过将两个半加器和一个或门组合而成。
行波进位加法器(Ripple Carry Adder)通过将多个全加器级联来实现多位加法。最低位全加器的Cin接地(或接外部进位输入),每个全加器的Cout连接到下一位的Cin。n位行波进位加法器需要n个全加器。其主要缺点是进位信号需要从最低位逐级传播到最高位,总延迟为n倍的单级进位延迟。对于32位加法器,这个延迟可能成为速度瓶颈。
为了提高加法器的速度,可以设计进位超前加法器(Carry Lookahead Adder, CLA)。CLA通过并行计算每一位的进位信号来消除进位传播延迟。定义进位生成(Generate)G = AB和进位传播(Propagate)P = A XOR B,则每一位的进位可以表示为:Ci = Gi + Pi*Ci-1。通过递推展开,可以直接用输入计算所有进位,无需等待前一级的进位结果。CLA的延迟与位数无关(在理想情况下),但硬件复杂度随位数增加而快速增长。
三、深入分析与讨论
3.1 多路选择器的逻辑函数实现能力
多路选择器作为通用逻辑模块的能力值得深入探讨。从理论上讲,一个2^n-to-1 MUX可以实现任意n变量的布尔函数,这是因为MUX的选择线遍历了所有可能的输入组合,而数据输入端可以独立设置为0或1,恰好对应真值表的每一行。
这种通用性在FPGA设计中得到了充分体现。FPGA中的基本逻辑单元——查找表(LUT)——本质上就是一个多路选择器。一个4输入LUT包含一个16-to-1 MUX(或等效的SRAM配置),16个存储单元保存了目标函数的真值表值,4个地址线作为选择信号。当配置数据加载到SRAM中后,LUT就实现了特定的逻辑函数。
更实用的技术是使用规模较小的MUX实现较大变量的函数。例如,用8-to-1 MUX(3条选择线)实现4变量函数:将3个变量(A, B, C)连接到选择线,第4个变量D用于生成数据输入。每个数据输入Di是D的函数,可以是0、1、D或D',取决于对应两行真值表的输出值。具体规则为:如果两行输出都是0则Di=0,都是1则Di=1,分别为0和1则Di=D,分别为1和0则Di=D'。
3.2 标准模块的级联与扩展
在实际系统设计中,单个标准模块的规格往往不能满足需求,需要通过级联和扩展来构建更大规模的模块。级联设计的关键在于正确处理模块间的接口信号和控制逻辑。
以译码器为例,单个3-to-8译码器只能处理3位输入。如果需要4-to-16译码功能,可以使用两个3-to-8译码器:将最高位输入连接到两个译码器的使能端(一个通过反相器),低3位输入同时连接到两个译码器的地址输入端。当最高位为0时,第一个译码器工作,输出Y0-Y7有效;当最高位为1时,第二个译码器工作,输出Y8-Y15有效。
类似地,多路选择器也可以通过级联来扩展。两个4-to-1 MUX可以组成一个8-to-1 MUX:两个MUX的数据输入分别接D0-D3和D4-D7,第4位选择信号通过一个2-to-1 MUX选择两个4-to-1 MUX的输出之一。这种树形级联结构在大规模数据选择中被广泛使用。
级联设计需要注意信号传播延迟的累积。每增加一级模块,信号的总延迟就会增加。在高速系统中,需要仔细计算关键路径的总延迟,确保满足时序要求。
四、实践案例
4.1 算术逻辑单元(ALU)的基本设计
设计一个简单的4位ALU,能够执行加法、减法、逻辑与和逻辑或四种操作。ALU的核心是一个4位行波进位加法器和一组多路选择器。
加法操作(A + B):直接将A和B输入加法器,进位输入Cin=0,输出S=A+B。减法操作(A - B):利用补码原理,A - B = A + B' + 1。将B的每一位取反后输入加法器,同时设置Cin=1,输出S=A+B'+1=A-B。逻辑与操作:将A和B的对应位进行与运算,可以通过将A输入加法器同时将B置为0,并在加法器输出后选择与运算结果来实现。更直接的方法是在每个位上使用独立的与门。
ALU的功能选择通过多路选择器实现:在每一位上,加法器的和输出、与门输出、或门输出分别连接到MUX的数据输入端,2位操作码(Opcode)作为MUX的选择信号,MUX的输出即为该位的ALU输出。
这个ALU设计展示了加法器、比较器和多路选择器等标准模块的组合使用方式。实际的ALU还会包含更多的运算功能(如移位、异或等),但其基本架构是相同的。
4.2 存储器地址译码系统
设计一个微型计算机的存储器地址译码系统。系统有16位地址总线(A15-A0),需要选择4个外设芯片:RAM(8KB)、ROM(4KB)、I/O接口1(256B)和I/O接口2(256B)。
地址分配方案:RAM占用地址0000H-1FFFH(A15-A13=000),ROM占用2000H-2FFFH(A15-A13=001),I/O1占用3000H-30FFH(A15-A13=011,A12-A8=00000),I/O2占用3100H-31FFH(A15-A13=011,A12-A8=00001)。
译码方案:使用3-to-8译码器(输入A15-A13)产生8个片选区域。译码器输出Y0连接到RAM的片选端,Y1连接到ROM的片选端,Y3连接到第二级译码电路。第二级使用另一个译码器(输入A12-A8)来区分I/O1和I/O2。
这个设计展示了译码器在地址空间划分中的层次化使用方法。高位地址用于粗粒度的区域选择,低位地址用于细粒度的单元选择,形成了树形的地址译码结构。
五、常见误区与注意事项
混淆编码器和优先编码器的行为:普通编码器在多个输入同时有效时输出不确定,而优先编码器总是给出最高优先级的编码。在实际系统中,几乎总是使用优先编码器,因为多个信号同时有效的情况难以完全避免。
忽视译码器输出的有效电平:许多商用译码器(如74LS138)的输出是低电平有效的(即被选中的输出为0,其余为1)。在使用这些器件时,后续的 logic 需要相应调整——通常使用NAND门代替OR门来实现逻辑函数。
多路选择器数据输入设置错误:用MUX实现逻辑函数时,数据输入端的值必须严格按照真值表设置。一个常见的错误是混淆了选择线与数据变量的对应关系,导致函数实现错误。
忽略行波进位加法器的延迟问题:行波进位加法器的延迟随位数线性增长。在高速应用中(如32位或64位加法器),必须使用进位超前或其他快速进位方案,否则加法器的延迟将成为整个系统的速度瓶颈。
级联时忽略传播延迟的累积:多个模块级联后,总传播延迟是各级延迟之和。在时序分析中,必须考虑最坏情况下的总延迟,确保在时钟周期内完成所有计算。
六、本章小结
本章介绍了数字系统设计中最重要的组合逻辑构建模块。编码器将多个信号线压缩为二进制编码,优先编码器进一步解决了多输入冲突的问题。译码器将二进制编码展开为独热码输出,是地址译码和逻辑函数实现的基础。多路选择器作为通用的数据路由和逻辑函数实现模块,在数据通路设计中无处不在。比较器提供了数值大小判断能力,是条件分支和排序算法的硬件基础。加法器作为算术运算的核心,其设计从简单的行波进位结构发展到进位超前结构,体现了速度与面积的工程权衡。这些标准模块不仅是独立的电路单元,更是构建复杂数字系统的基本积木。掌握它们的功能特性、内部结构和级联方法,是进行高效数字系统设计的必要条件。
七、思考题与练习
设计一个16-to-4优先编码器,列出真值表并写出各输出的最简逻辑表达式。说明有效输出标志的作用。
使用3-to-8译码器和必要的逻辑门实现以下3变量函数:(a) F(A,B,C) = Sigma m(0,2,5,7) (b) G(A,B,C) = Sigma m(1,3,4,6)。注意译码器输出可能是低电平有效的。
用8-to-1多路选择器实现4变量函数 F(A,B,C,D) = Sigma m(0,1,5,7,9,12,14)。确定选择线和数据输入的连接方式。
设计一个5位格雷码到二进制码的转换器。可以使用比较器、加法器或其他标准模块的组合来实现。
两个4位二进制数A和B,设计电路判断以下条件:(a) A = B (b) A > B (c) A和B中1的个数相同。分别给出设计方案。
分析4位行波进位加法器的传播延迟。假设每个全加器的进位延迟为2个门延迟,和输出延迟为3个门延迟,计算从输入到最终输出(包括最高位的和与进位)的总延迟。
设计一个电路,使用一个4-to-1 MUX和一个异或门实现函数 F(A,B,C) = A XOR B XOR C。说明选择线和数据输入的连接方式。
比较以下两种实现4位比较器的方案:(a) 使用4片1位比较器级联 (b) 先进行逐位异或判断相等,再用减法判断大小。分析两种方案在速度和面积方面的优劣。