ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

数字电路组合逻辑设计入门:逻辑器件排列组合与真值表分析

数字电路组合逻辑设计入门:逻辑器件排列组合与真值表分析 我第一次在实验课上搭出第一个逻辑电路时被三块74LS00折腾了一整个下午。回去翻书才想明白所谓数字电路设计说白了就是把与门、或门、非门这些最基础的逻辑器件按照某种规则排列组合起来最后实现你想要的输入输出关系。这句话听起来简单真做起来却有一堆门道。这篇内容适合正在学数字电路、准备参加课程实验的在校生也适合想系统回顾组合逻辑设计思路的工程师。我会把逻辑器件排列组合背后的数学原理、常用套路、实操案例和踩坑经验都过一遍尽量让你看完之后能直接抄作业。1. 逻辑器件排列组合数字电路设计绕不开的基本功1.1 先认识积木常见逻辑器件一览数字电路这块领域底层是晶体管的导通与截止往上抽象出来的工作单元就是逻辑器件。我们常说的与门、或门、非门以及在此基础上复合出来的与非门、或非门、异或门、同或门都算最基础的门电路。再往上走还有编码器、译码器、多路选择器、加法器、比较器、计数器、寄存器这些中规模器件它们内部其实就是由大量门电路排列组合而成的。我个人习惯把逻辑器件分成三个层次来看。第一层是基本门解决的是单个逻辑运算比如你输入两个电平与门只在两个都是高电平时输出高电平。第二层是复合门例如与非门、或非门、异或门它们在基本门的基础上多包了一层逻辑但对外仍是一个完整器件很多情况下能直接减少芯片数量。第三层是中规模逻辑器件比如74LS138译码器、74LS151多路选择器它们的功能更复杂但内部依然是几十个门电路按固定结构连接起来的。理解这个层次非常关键。因为你在做逻辑器件排列组合时脑子里一定要清楚要么你直接用门电路逐个搭建把功能细化到每一个逻辑门要么你站在更高的抽象层级用译码器、选择器这种“半成品积木”来拼装。同一个功能两种思路都能实现但门数、功耗、布线复杂度完全不同。1.2 为什么“排列组合”四个字是核心数字电路设计中的“排列组合”并不是指刷数学题而是指输入变量的组合方式决定了输出行为同时器件的连接方式决定了最终功能。任何组合逻辑电路不管看起来多复杂本质上都是在做一件事判断当前输入是哪一种组合然后给出对应的输出。举个例子一个2输入与门有两个输入变量输入组合只有4种00、01、10、11每种组合对应一个输出。一旦确定了真值表你就确定了这个器件的逻辑功能。如果把输入组合看成“排列”把输出定义看成“组合”那么数字电路设计其实就是在一张张真值表上做排列组合。更有意思的是n个输入变量能定义出的逻辑函数数量是2的2的n次方。n等于2时就有16种逻辑函数n等于3时变成了256种n到4的时候已经有65536种可能的功能。这就是为什么用同样几种门电路有人能拼出八位加法器有人能拼出音乐电路里的音调发生器也有人能拼出数码管显示译码器——大家手里的积木差不多差别全在排列组合的思路。2. 用数学思维理解逻辑器件排列组合从2的n次方到2的2的n次方2.1 输入组合总数为什么真值表恰好有2的n次方行要深入操作数字电路先得把一个公式刻进脑子里n个输入变量穷举所有输入状态行数一定是2的n次方。这是一条铁律因为它对应二进制数的不重不漏。拿三人表决器来说输入是A、B、C三个变量每个变量取值不是0就是1那三个变量合起来就是一个三位二进制数从000到111正好8种。你可以自己拿笔画一下三位二进制数从000、001、010一直数到111永远都是8种不会多也不会少。到了四位输入就是16种组合五位是32种依此类推。很多新手在设计电路时第一步真值表就列错了根源往往就是漏行或者重复行。我自己的习惯是列真值表之前先把二进制计数顺序写完整最高位先翻转或者最低位先翻转都行关键是保持每一个组合只出现一次。如果你把2的n次方这一条算清楚真值表这一关就不会出问题。这个数字还有一层实际意义它决定了电路输入的“搜索空间”。比如设计一个4位二进制加法的超前进位模块输入变量可能有8个、9个甚至更多穷举状态数量就会变得非常大。这时候想靠人肉列真值表已经不现实你必须用卡诺图分组化简或者直接用硬件描述语言交给综合工具去处理。2.2 逻辑函数总数2的2的n次方带来的功能空间真值表的每一行除了输入组合还有一个输出位。输入组合确定了你还有权决定每个组合对应0还是1于是逻辑函数的种类就出现了爆炸式增长。n个输入变量共有2的n次方种输入组合每一种组合的输出可以独立选择0或1所以逻辑函数总数就是2的2的n次方。这个公式很多教材会直接抛出来但我当年没有马上理解它到底意味着什么。直到我手工列出一个2输入真值表把所有可能的输出列全部写了一遍才真正感觉到这个空间的广阔。以两个输入A、B为例输入组合有4种每一种的Y位有0或1两种选择。把所有选择枚举出来你能得到16个不同的三字函数。其中有0常量、1常量有A本身、B本身有与、或、与非、或非、异或、同或还有一堆像“A非且B”“B非且A”这样的非对称函数。16种听上去不多但已经能覆盖相当多的逻辑需求。到了3个输入逻辑函数数量跳到2564个输入是655368个输入的时候数字已经大到没有现实感。这件事对我最大的启发是所谓设计能力核心在于你有没有办法快速描述出你到底需要这个函数空间里的哪一个点。用真值表描述用卡诺图化简用逻辑表达式描述用HDL描述本质上都是在做同一件事从庞大的函数空间里锁定你需要的那个功能。2.3 组合数与排列数C(n,k)和A(n,k)在电路里怎么用回到数学课本里的两个公式组合数C(n,k) n! / (k!(n-k)!)排列数A(n,k) n! / (n-k)!。很多人学数字电路时觉得这些内容已经还给数学老师了但实际上它们会以各种形式溜回电路设计里。先看组合数C(n,k)。它的含义是从n个东西里不分顺序地取出k个。在数字电路里“k-out-of-n”表决电路就是典型例子。三输入多数表决器本质上就是2-out-of-3三个输入里只要有两个以上为1输出就是1。C(3,2)等于3正好对应三种“两两组合”的情况也就是AB、BC、AC这三个乘积项。你看表决器化简后的表达式FABBCAC其实就是把C(3,2)的所有组合都列了一遍。再看排列数A(n,k)。它的含义是从n个东西里按顺序取出k个顺序不同算不同的结果。这个思路在多路选择器里体现得最明显4选1多路选择器的两个选择信号可以是00、01、10、11四种排列每一种排列对应一条数据通道。如果只有2位选择信号无论你怎么排排列数就是2的2次方等于4。这一步虽然简单但它说明了选择器的本质用选择信号的排列组合当作地址去索引数据输入。所以别小看这两个数学公式。它们在数字电路里不是独立的考点而是贴着真值表行数、表决器乘积项、选择器通道编号这些具体设计细节出现的。你能把这些数学关系想清楚很多电路结构就变得理所当然了。3. 器件选型与排列套路不同积木的搭法差别很大3.1 门电路选型TTL与CMOS怎么挑动手搭电路之前一定会遇到选芯片的问题。市面上最经典的74系列门电路最常见的是TTL工艺的74LS和CMOS工艺的74HC两种。名称里都有74但特性差异不小这直接决定你的电路能不能稳定工作。74LS系列功耗偏高但驱动能力比较大输出高电平最低约2.7V低电平最高约0.5V在5V电源下工作。74HC系列是CMOS工艺静态功耗极低输出高低电平都很接近电源和地噪声容限比TTL更好但驱动能力相对弱一些。如果混用要考虑电平兼容性74LS输出高电平只有2.7V左右接74HC的输入虽然基本能用但噪声大时容易误判反过来74HC输出接74LS一般没问题。我的建议是课程实验和面包板调试优先用74HC系列因为抗干扰能力更强输入阻抗高不容易被接触不良和毛刺信号带跑。如果老师指定用74LS系列那也没关系注意电源滤波和地线连接要牢靠。另外无论是TTL还是CMOS未使用的输入引脚最好不要悬空。CMOS输入悬空尤其危险电平不确定不说还可能引起芯片内部振荡甚至发热损坏。3.2 译码器与多路选择器用“选择信号排列”做通道开关门电路是搭建组合逻辑的基本积木但到了更复杂的场景直接用门拼会非常啰嗦。这时候就该上中规模器件了它们内部已经把一种固定的排列组合结构做成了芯片成品你只需要用控制信号去选择。先看译码器。三线八线译码器74LS138有3位输入2的3次方等于8条输出线每条输出线对应一种输入组合输出低电平有效。这实际上是“输入排列”到“输出线编号”的映射当A2A1A0等于000时Y0有效等于001时Y1有效。利用这个特性配合与非门可以实现任意三变量逻辑函数。做法是先找到输出为1的最小项把对应最小项编号的译码器输出全部接到一个与非门上因为译码器输出是低电平有效所以与非门正好输出这些最小项之和。再看多路选择器。四选一多路选择器有两个选择信号S1、S0它们组成4种排列每种排列选通一路输入数据。这本质上是把“选择信号的排列组合”当成地址索引。比如四输入表决器用选择器实现可以把A、B接到选择端D0到D3分别接C、C的反相、0、1等组合信号整体芯片就能完成逻辑功能。这种写法的好处是逻辑关系被高度并行化尤其适合数据选择和状态机设计的场景。3.3 与非门为什么是“万能积木”数字电路实验课上出镜率最高的芯片一定有74LS00一片里面集成了四个二输入与非门。为什么偏偏是与非门而不是与门或或门原因在于与非门本身具备完备性只要你愿意可以用与非门拼出与门、或门、非门甚至异或门。任何组合逻辑函数理论上都可以只用与非门实现。这个结论背后的数学依据是摩根定律。比如要得到非门把一个与非门的两个输入短接或者把另一个输入固定为高电平输出就是对输入的取反。要得到与门可以先取与非再取反要得到或门可以把两个输入分别取反后再做与非运算。把这些基本转换记熟你在板上没有合适门电路时可以拿与非门来顶替。更重要的是用统一的门电路实现逻辑表达式时电路结构更规整。我在做数字电路实验时经常先用卡诺图把表达式化成最简与或式再用摩根定律转换成与非-与非形式最后全部用74LS00和74LS10三输入与非门搭出来。这种方法在手工搭电路的时代非常实用因为芯片种类越少采购成本和出错概率就越低。4. 实操案例用74系列搭建一个三人表决器4.1 需求分析从“少数服从多数”翻译成真值表三位评委投票两个人及以上同意就算通过这是数字电路课本里最经典的设计题目之一非常适合用来演示完整的排列组合设计流程。我下面会把这个例子从头到尾走一遍包含真值表、化简、方案对比和上板注意事项。定义三个输入A、B、C分别代表三位评委同意为1反对为0输出F为表决结果通过为1否决为0。按排列组合把三个输入的所有情况列出来一共2的3次方等于8种组合每个组合对应的输出如下ABCF说明0000三人全反对0010只有C同意0100只有B同意0111B、C同意1000只有A同意1011A、C同意1101A、B同意1111三人全同意这张表一列出来问题就变成用什么门电路组合才能让F只在第4、6、7、8行输出1其他行输出0。接下来就是用数学工具对这个8行真值表做化简。4.2 卡诺图化简为什么结果就是ABBCAC很多人对卡诺图有畏难情绪其实它就是把真值表重新画成一种方便找相邻项的表格。三输入变量卡诺图通常是2行4列行变量放A列变量放B、C列的顺序必须是格雷码00、01、11、10因为相邻两个状态只有一位发生变化这样几何相邻的格子也代表逻辑相邻。把真值表里F等于1的四项m3(011)、m5(101)、m6(110)、m7(111)填进卡诺图对应位置然后开始圈1。第一步看m7它能分别和m3、m5、m6合并m7和m3合并消去A得到BCm7和m5合并消去B得到ACm7和m6合并消去C得到AB。三个合并圈覆盖了全部四个为1的格子所以化简结果就是FABBCAC。这其实就是一个三人表决器的标准逻辑表达式。它的含义很直观任意两个人同意输出就为1三个人都同意当然也为1。值得注意的是这个表达式在卡诺图里每个为1的格子都被至少一个圈覆盖而且每个圈都足够大这意味着电路没有冗余项也没有静态竞争冒险的隐患这一点在后面调试时特别重要。4.3 三种电路实现方案对比有了FABBCAC接下来就是选器件实现。我实际试过三种方案各有优劣整理在这张表里你可以直接对照参考。方案所需芯片门数优点缺点方案A与门或门74LS08四2输入与门、74LS32四2输入或门3个与门加2个或门级联结构最直观和表达式一一对应芯片种类多布线稍乱方案B全与非门74LS00四2输入与非门、74LS10三输入与非门3个二输入与非加1个三输入与非芯片种类少适合手工搭电路需要先把表达式转换成与非形式方案C4选1多路选择器74LS153双4选1或74LS1518选11片芯片加少量门布线极简适合复用对初学者来说原理稍抽象先说方案B的表达式转换。FABBCAC对右边整体取两次非得到F((ABBCAC)非)非。再用摩根定律展开ABBCAC的非等于(AB)非、(BC)非、(AC)非这三个项的与所以F的非等于(AB)非·(BC)非·(AC)非。于是F就等于这三个中间量取非后的再取非也就是把它们送入三输入与非门。具体到门电路先用三个二输入与非门分别计算(AB)非、(BC)非、(AC)非再把这三个输出接到一个三输入与非门最终得到F。整个电路正好用一片74LS00和一片74LS10。方案C的MUX实现思路是令A、B接选择器选择端用C作为输入信号填充数据通道。真值表显示当AB00时输出恒为0所以D0接地当AB01时输出等于CD1接C当AB10时输出也等于CD2接C当AB11时输出恒为1D3接VCC。一片74LS153就能完成而且不需要额外门电路。这种做法的好处是如果后面要换表决规则只需要改D0到D3的连接方式不用重新搭门电路。我个人的建议是课程设计展示阶段用方案A更容易讲清楚思路实际手工搭电路用方案B更省事做工程原型或可复用模块用方案C更合理。三个方案做出来的功能完全一样但观察角度的差异能帮你更好地体会逻辑器件排列组合的多种路径。4.4 仿真与上板要点Verilog描述和实验注意事项如果你用Verilog做仿真验证三人表决器的描述可以非常简洁。数据流级写法就是一行连续赋值语句module voter3( input wire A, input wire B, input wire C, output wire F ); assign F (A B) | (B C) | (A C); endmodule行为级写法则更贴近真值表用case语句把输出为1的4个组合直接列出来module voter3( input wire A, input wire B, input wire C, output reg F ); always (*) begin case ({A, B, C}) 3b011, 3b101, 3b110, 3b111: F 1b1; default: F 1b0; endcase end endmodule仿真时遍历8种输入组合观察F是否在第4、6、7、8种组合下为1即可。上板搭电路的时候有几个点特别容易踩坑。第一74系列芯片的VCC和GND千万不要接反有些芯片接反后会明显发烫甚至直接烧毁。第二实验板上所有芯片的地必须共地电源建议加一个0.1uF去耦电容否则高频毛刺可能让输出乱跳。第三LED指示灯要串一个330欧到1千欧的限流电阻直接接到芯片输出口容易因为过流导致逻辑电平被拉低。5. 常见问题与排查技巧我踩过的坑都在这里5.1 真值表列对了接线后输出却乱跳这是刚接触数字电路实验时最普遍的问题我自己也交过不少学费。明明真值表、卡诺图、逻辑表达式都对芯片型号也选对了接完线上电输出就是不稳定时好时坏或者该输出1的时候输出0。问题多半出在引脚连接或者电平设置上。最常见的是面包板接触不良芯片引脚没有完全插进插孔或者相邻孔被导线连到了一起。遇到这种情况先别怀疑芯片坏了拿起万用表蜂鸣档从第一根输入线开始逐段测量导通情况。第二个常见原因是未使用的输入引脚悬空特别是CMOS门电路悬空输入会感应杂散信号导致内部逻辑状态漂移。正确的做法是未使用的非门输入要么接地要么接电源确保电平固定。第三个原因和TTL电平门槛有关。TTL芯片输入高电平最低要2V低电平最高要0.8V如果你的输入信号来自单片机或传感器电平不在这个范围里芯片就会把输入误判成不确定状态。这时候需要确认电平转换电路是否工作正常。先测量芯片供电引脚再测量输入信号高电平和低电平的实测值最后测输出按这个顺序排查通常几分钟就能定位问题。5.2 输出毛刺竞争冒险的来龙去脉如果你用示波器观察组合逻辑输出偶尔会看到一些很窄的尖峰脉冲哪怕真值表显示输出不应该变化这就是数字电路里的竞争冒险现象。竞争冒险的根源是信号传输延迟。每个逻辑门都有几十纳秒量级的延时不同路径上门的数量和延迟时间不一样导致信号到达同一汇合点的时间有先后。比如FABAC当B1、C1、A从1跳变到0时理论上F应该一直保持1因为AB和AC总有一个为1。但如果AB这条路径先变化AC这条路径后变化中间会有一瞬间两个乘积项都变成0输出端就出现一个负毛刺。解决办法有几个。最典型的是在逻辑表达式里增加冗余项原理是让卡诺图里的每个相邻圈重叠覆盖消除信号交替时的空窗期。像三人表决器FABBCAC三个圈两两重叠所以天然没有这类静态冒险。如果表达式无法完全消除还可以在输出端加一个小电容滤波或者在涉及时钟的逻辑里增加同步级缓存信号确保毛刺不会传播到后续电路。5.3 实验室排障三板斧从后往前、分模块、多用万用表最后分享一个我每次做数字电路实验都用的排障流程虽然简单但真的能省下大量时间。第一招是从输出往输入倒着排查。先看最终输出引脚电平是否正常如果不正常顺着它连接的上一级输入往前查一级一级缩小范围通常很快就能找到断点。第二招是分模块测试。一个复杂电路如果整体调不通一定要按功能模块拆开分别验证每个子模块的输出是否符合预期。比如表决器电路由三个与非门和一个三输入与非门组成你可以先单独测第一个与非门输入A和B看输出是否为(AB)非逐个模块验证后再连起来。很多人一上来就全接完出问题只能干瞪眼就是因为模块边界已经被焊死了。第三招是善用万用表和示波器。万用表适合测静态电平示波器看时序关系。如果你确认逻辑功能正确但输出老是出错用示波器看输入信号是否有毛刺、上升沿是否太慢往往能发现波形质量问题。记住数字电路的“0”和“1”不是理想电平受到噪声、延时和负载的影响后真实波形的质量直接决定整个系统稳不稳定。我在实际搭电路时最深的体会是数字电路实验的绝大部分坑不是因为逻辑没想明白而是因为连线、电平和时序这些细节没有处理好。只要把真值表和化简步骤做扎实再养成按模块验证的习惯逻辑器件排列组合这件事真的可以又快又稳地完成。以后你看到任何复杂逻辑芯片试着拆一拆它的内部结构你会发现它们都是用同样一套思路拼出来的。
返回列表