ARTICLE DETAIL

资讯详情

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

逻辑器件排列组合实战:从门电路基础到组合逻辑设计

逻辑器件排列组合实战:从门电路基础到组合逻辑设计 1. 从一堆芯片到一台机器逻辑器件的排列组合到底在玩什么数字电路这门课很多人上来就背门电路真值表与非门、或非门、异或门背得滚瓜烂熟一进实验室就傻眼——一堆74系列芯片摆在面前不知道从哪儿下手。我当年也是这样直到后来做了几个像样的项目才慢慢琢磨明白一件事数字电路的本质就是用有限的逻辑器件通过排列组合搭出无限种功能。这话听着像废话但确实是整个数字逻辑设计最核心的思想。举个最直观的例子你手头只有与非门理论上可以搭出任何逻辑电路。反相器把与非门两个输入端并在一起就行。与门与非门后面再接一个反相器。或门用德摩根定律变换一下。你看一个芯片就能演化出一整套逻辑家族这就是排列组合的威力。理解了这个再看什么“用74LS00搭一个全加器”“用CD4001做一个振荡器”就都不神秘了。这篇东西我就拿自己折腾数字电路的经验把逻辑器件的排列组合这件事掰开了讲清楚。从门电路基础怎么理解到组合逻辑怎么搭再到几个常见芯片的实际应用最后说说我在实操中踩过的坑。适合刚学完数字电路理论、想动手做点东西的人也适合那些会看原理图但不太明白“为什么这么接”的爱好者。2. 门电路到底在排列组合什么2.1 从真值表看排列组合的逻辑本质先别急着拿电烙铁。要理解逻辑器件的排列组合得先回到真值表。一个两输入与门输入A和B各有0和1两种状态组合起来就是2的2次方等于4种情况00、01、10、11输出只有1和0两种可能。如果我们不限定门电路类型把“输入状态组合”和“输出状态”的对应关系看成一张表你会发现问题很有意思——4种输入组合每种对应一个输出那总共可能有多少种不同的逻辑函数2的4次方等于16种。这就是为什么教材里会说两输入变量一共可以定义16种布尔函数。其中有用的就那么几个与、或、与非、或非、异或、同或剩下的要么是常数输出要么退化成了单输入函数。但关键在于这16种函数都可以用我们手头那几种门电路搭出来。排列组合的第一层含义就是输入端的状态组合决定了函数的真值表第二层含义就是不同门电路之间的连接方式决定了最终能实现哪种真值表。我自己做实验的时候特别喜欢干一件事拿到一个逻辑表达式先不急着画电路图而是先把真值表列全把输入的所有排列组合情况写出来再手动推算每一行的输出。这个习惯帮我建立了从“输入组合”到“输出结果”的直觉之后再看别人设计的电路一眼就能看出它是干什么的。2.2 为什么说与非门能搭出所有逻辑电路你可能听说过“与非门是万能门”这种说法。为什么是它原因说出来很简单与非门天然带一个反相器结构而任何逻辑函数经过两次取反、再配合德摩根定律展开都能转化成只包含与非运算的表达式。我举个具体的例子。假设要实现F A·B C·D这个式子直接看需要两个与门、一个或门。但如果只有与非门呢第一步把F取反再取反F (A·B C·D)这步是恒等变换。第二步用德摩根定律把里面的或变成与F ((A·B) · (C·D))。你看最后得到的表达式里只有与非运算——(A·B)是一个与非门(C·D)是另一个与非门或非而不是与非没关系A·B整体取反后是两个与项的结果再与非就完成了整个功能。这个过程我第一次推的时候觉得特别绕但推了几遍之后就发现规律了任何与或式只要把或门换成“两个与非门输出端再接一个与非门”就能用与非门替代。这个方法不仅考试有用实际焊板子的时候更用得上——有时候手头就一种芯片灵活变换能救命。2.3 从器件清单到功能框图搭电路的第一课理解了单种门的表达能力下一步就是学会看器件清单。一块74LS00里面有4个独立的两输入与非门一块74LS08里面有4个与门一块74LS32里面有4个或门。做设计之前我习惯先把需要的逻辑门数量统计一下再对照手头的芯片资源做“资源分配”。这里有个选题上的技巧优先使用与非门和或非门。原因很实在——同系列芯片里与非门和或非门的品种最多、价格最便宜、购买也最容易而与门和或门反而不是那么常见。这跟芯片内部电路结构有关与门和或门通常是在与非门或或非门的基础上再串一级反相器做出来的既然这样不如直接外接一个反相器还能省一个门。所以你在很多数字电路教材上看到的电路明明表达式里写的是与门和或门画出来的原理图里却全是与非门和或非门就是这个道理。3. 组合逻辑的核心套路从表达式到电路图的排列组合3.1 一个完整设计实例三人多数表决器纸上谈兵没意思咱们来一个实际项目设计一个三人多数表决器。三个人A、B、C投票两人或两人以上同意输入为1输出F就是1。第一步列真值表。三输入变量一共2的3次方等于8种组合。F为1的情况有四行ABC011、101、110、111。第二步写标准与或式。把F为1的每一行写成一个最小项然后相加F ABC ABC ABC ABC。这个表达式是直接从真值表“翻译”过来的不用动脑筋但一般不是最简形式。第三步化简。观察一下最后两项ABC和前面三项都有重叠。用公式法时常利用A A 1来合并F ABC ABC ABC ABC BC AC AB。你验证一下BC覆盖了011和111AC覆盖了101和111AB覆盖了110和111四行全覆盖没毛病。第四步根据化简后的表达式选器件。如果手头有与门和或门F AB AC BC需要三个两输入与门和一个三输入或门。如果三输入或门不方便可以拆成两个两输入或门级联F (AB AC) BC。第五步对照芯片管脚图连线。74LS08提供4个与门用其中3个74LS32提供4个或门用其中2个。剩下一个与门和一个或门空闲注意输入不能悬空接地或接高电平都行。你看整个设计过程就是一个典型的排列组合流程真值表的输入状态排列逻辑表达式的最小项组合再根据表达式把门电路连接起来。听起来平平无奇但每一步都有讲究。3.2 为什么卡诺图化简是排列组合思维的加速器当年学卡诺图的时候我一直觉得它只是考纲里的一项技能后来做设计才发现它真正的价值在于让你从“代数运算”里解放出来直接用几何方式观察“哪些最小项可以合并”。卡诺图本质上就是把真值表的行和列重新排列——让相邻的格子之间只有一位变量不同。这样一来两个相邻的1就对应两个可以合并的最小项。比如上面那个表决器在卡诺图上你会看到四个1围成一个2x2的圈直接读出B·C和A·C和A·B三项比用公式法合并快得多。实际操作中我的建议是如果变量不超过4个优先画卡诺图超过5个变量才需要靠计算机工具或者更系统的代数化简方法。为什么因为卡诺图的排列方式在4变量以内非常直观格子之间有明确的“邻居”关系圈的组合一目了然5变量以上虽然也能画但需要在两个4变量图之间比较人脑处理不过来容易出错。顺便说一句很多新手在卡诺图上画圈时容易犯两个毛病一是圈得不够大该合并的没合并二是把无关项也圈进去了结果化简出来的表达式虽然正确但硬件实现时反而多绕了弯路。我自己的经验是每圈一个圈都回头核对一下这个圈覆盖的格子它们之间的变量是不是只有一位不同如果有多位不同圈就出问题了。3.3 化简之后的电路“翻译”技巧得到最简表达式之后接下来的任务是把它翻译成电路连接。这里有几个我在实操中总结出来的小技巧。优先共享公共项。比如一个系统里需要AB、AC、BC等好几个与项如果某些与项在多个输出里都出现可以考虑用同一片与门输出后分线出去。别小看这个细节一个复杂一点的组合逻辑公共项共享能省掉不少门电路。我做课程设计的时候就因为多分了一条线省了一块芯片的用量。复合门的等价替换要熟练。现在的芯片库里与非门和或非门远比与门和或门常见所以拿到一个“与或式”之后我习惯性地会先用德摩根定律把它转成“与非-与非”形式再动工。还是举表决器的例子F AB AC BC。先取反再取反F ((AB AC BC))把括号内的或变与得到F ((AB) · (AC) · (BC))。这时候你数一下需要的与非门数量三个两输入与非门生成三个反相与项再来一个三输入与非门把三项合并一共4个与非门。74LS00里有4个一块芯片搞定。然后就是管脚排列。每个芯片的管脚图一定要提前查资料74系列芯片的引脚定义基本固定但我吃过亏想当然认为两个输入一定是1和2结果焊上去才发现是1和2输入、3输出。焊完再拆浪费时间不说板子还容易坏。所以每次拿到芯片第一件事就是翻数据手册把管脚图打印出来放旁边。4. 常用芯片的排列组合实战4.1 用74LS00搭一个振荡器从组合逻辑进入时序逻辑组合逻辑芯片排列组合除了搭算术电路和表决器还有一个特别妙的用法——搭振荡器。你只需要把与非门的输出接回自己的输入就构成了一个反馈回路再配上电阻电容就能产生方波信号。具体电路是这样的两个与非门串联第一个门的输出接第二个门的输入第二个门的输出经过一个电阻接到第一个门的另一个输入端和电容上。上电瞬间电容电压为零第一个门输出高电平第二个门输出低电平然后电源通过电阻给电容充电当电容电压超过阈值时第一个门翻转输出低电平第二个门输出高电平电容开始放电如此反复就形成了振荡。这个电路我折腾了一下午才稳定工作。频率大致由RC时间常数决定我用的10k电阻和0.1uF电容实测频率大约在700Hz左右能听到明显的蜂鸣声。用公式算出来的理论值跟实测值会有偏差因为门电路的阈值电压不是精确的VCC/2不同批次的芯片也有差异。但好在做实验不需要精确频率只要稳定就行。有了振荡器你就等于有了一个“时钟源”这是从纯组合逻辑走向时序逻辑的第一步。很多音乐电路、流水灯、频率计内核都是这个振荡器加上一堆排列组合好的逻辑门。4.2 译码器与编码器排列组合的“逆向思维”如果说前面的例子是“自己搭门电路”那译码器和编码器就是把排列组合封装成现成芯片你只需要接对输入输出的对应关系。74LS138是一个3线-8线译码器3个输入A2、A1、A0共有8种排列组合每种组合对应8个输出Y0到Y7中的某一个为低电平。它内部其实就是一堆与非门的排列组合但用起来你完全不用关心内部结构只要会查真值表就行。译码器有个特别经典的应用——实现任意组合逻辑函数。你想实现F Σm(1,3,5,7)就是把输入接好然后把Y1、Y3、Y5、Y7这四个低有效的输出端接到一个与非门的输入端与非门的输出就是你要的F。原理其实还是最小项相加那一套译码器替你生成了所有最小项你只要把需要的项“汇聚”起来就是完整的逻辑函数。这个思路特别适合多输出的情况比如同时需要好几个逻辑函数共用同一个译码器后面接不同的与非门组合能省下大量逻辑门。编码器就是译码器的反向操作比如74LS1488个输入、3个输出优先级编码。它在键盘扫描里用得很多检测哪一行哪一列被按下然后输出对应编码。理解了译码器和编码器你就发现所谓排列组合不只是门电路层面的连接也包括芯片层面的“信号路由”。4.3 数据选择器一组开关的排列组合另一个特别能体现排列组合思想的芯片是多路数据选择器比如74LS1518选1。它有3个选择输入端S2、S1、S0——这三位的排列组合决定8个数据输入端D0到D7中的哪一个被选到输出端。数据选择器的核心应用思路和译码器有点像也是把逻辑函数变成一张“查找表”。你想实现一个三变量逻辑函数直接把三个输入A、B、C接到S2、S1、S0上然后把真值表中F的8个输出值分别接到D0到D7。当A、B、C的状态组合不断变化时对应的D端数据就被选到输出了实现效果和逻辑门搭出来的电路一模一样。这个方法在原型验证的时候特别好用。因为不管是多复杂的函数只要真值表确定拿一块74LS151接跳线就能快速验证逻辑正确性不用等焊板子。等验证通过了再根据具体需求决定是用逻辑门搭还是直接用选择器做最终方案。我用这个方法排查过不少逻辑设计上的错误效率高很多。5. 更进一步的排列组合多级电路与常见芯片搭配5.1 全加器的搭法理解“位”之间的排列组合加法器是数字电路的经典项目。半加器处理两个一位数的相加输出和S与进位C。全加器还要处理来自低位的进位Cin所以是三输入。全加器的逻辑表达式是S A XOR B XOR CinCout AB Cin(A XOR B)。你先别急着背公式关键是想明白为什么是这个结构A和B先异或得到的是“不考虑进位的本位和”这个结果再和Cin异或一次得到最终的和而进位呢AB之间如果都是1必然产生进位如果A和B中有一个为1则进位取决于Cin。从电路实现上看全加器可以用两个半加器加一个或门组合出来。为什么能这样分解因为A B Cin的操作可以分成两步先算A B得到S1和C1再把S1 Cin得到S2和C2最后Cout C1 C2。这就是一个典型的“函数分解”也是排列组合思维在算法层面的体现——大问题拆小问题小问题的解再组合成大问题的解。有了全加器你就可以把它排列成4位加法器把4个全加器级联起来低位的Cout接到高位的Cin。这种“串行进位”的结构虽然简单但随着位数增加进位传递延迟会越来越大。我在实验板上搭过4位的用按键模拟输入LED显示结果整体体验非常好但如果你要做更高速的电路就得上先行进位加法器了——那是另一个级别的排列组合艺术。5.2 芯片级联的排列组合用两片74LS138扩展成4线-16线译码器单看一块芯片功能是固定的。但芯片与芯片之间一排列组合功能立刻翻倍。扩展译码器就是一个很经典的例子两片74LS138如何变成4线-16线译码器思路是这样的4线输入中高两位D3、D2决定选择哪一片芯片低两位D1、D0作为片内译码输入。怎么实现“选择哪一片”74LS138本身有使能端三个使能端E1高有效E2A和E2B低有效。把第一片的E2A和第二片的E2B都接D3的反相信号D3为0时第一片工作D3为1时第二片工作。低两位D1、D0同时接到两片的A1、A0上这样每一时刻只有一片芯片输出有效信号另一片所有输出都无效。这个设计里最妙的地方就是使能端的组合使用。使能端本质上是片选信号而片选信号的设计正是芯片级组合逻辑的核心多个模块共享输入但通过使能信号把数据“路由”到正确模块。无论是存储器扩展、总线设计还是外设寻址背后都是这套思想。理解了译码器的扩展你就理解了计算机地址解码的基本原理——CPU发出的地址信号经过译码器的排列组合选中内存中某个特定单元。5.3 从理论到实践一个数字电路音乐电路的思路前面说的全加器和译码器都偏“正经”我再用一个偏娱乐的项目说说排列组合的开放性——数字音乐电路。网上有不少“音乐电路”方案核心思路其实都一样用计数器或振荡器产生频率可变的脉冲信号再通过扬声器发声。音乐的本质是一串频率在时间上的排列组合所以只要能控制不同音符对应的频率、按顺序切换就能演奏一段旋律。我做过一个最简单的版本用555定时器搭一个频率可调的多谐振荡器用一个CD4017计数器做顺序控制再用电阻网络给不同的音高提供不同的充电电阻。CD4017是一个10输出计数器它的状态输出Y0到Y9会依次变高相当于“按顺序选中”不同的频率档位。每个Y输出端接一个不同的电阻到振荡器的定时端电阻阻值决定频率也就决定了音高。这样一来Y0到Y9的排列顺序就变成了一段旋律的播放顺序。说起来容易调起来麻烦。我踩了个大坑电阻阻值不能单纯按音乐频率比例来选因为555的振荡频率跟电阻并不是精确的线性关系需要边听边微调。所以我在每个电阻的位置都留了可调电阻的位置先用10k多圈电位器调出基准音再根据十二平均律的频率比例推算其他档位。这个项目最大的收获不是学会了音乐电路本身而是顺势把前面说的振荡器、计数器、译码器、电阻网络全都串了起来。这些逻辑器件搭配起来就是一台简单的可编程乐器——所有的音乐旋律无非就是频率的排列组合。6. 实战中那些绕不过去的坑和排查方法6.1 悬空引脚的“幽灵干扰”我做数字电路实验遇到最多的问题就是莫名其妙的输出跳变。查了半天最后发现是某个闲置输入引脚悬空了。CMOS芯片的输入阻抗极高悬空引脚会感应周围电场导致芯片内部逻辑状态漂移进而干扰同一芯片的其他门。处理方式就一句话所有输入引脚必须可靠接高电平或低电平不允许悬空。在面包板上操作时我习惯把同一芯片的所有闲置输入引脚统一接到VCC或GND。具体接哪个取决于闲置门的类型——与非门闲置时输入接高电平或非门闲置时输入接低电平。这样可以保证闲置门不产生无关的电流消耗也不会对外部电路造成干扰。6.2 供电和去耦数字电路的“血压”问题芯片工作不稳定先别怀疑芯片坏了多数情况是供电问题。面包板上的导线电阻加上芯片切换时的瞬态电流会让VCC产生毛刺导致逻辑电平误判。我的标准做法是在每个芯片的电源引脚旁边放一个0.1uF的瓷片电容从VCC到GND。这在高速数字电路里几乎是标配叫去耦电容作用是给高频瞬态电流提供就近的低阻抗通路。至于为什么选0.1uF这个值在高频特性和储能之间取得平衡经验值直接照用。如果系统里有电机、继电器之类的大功率负载还需要在电源输入端加大电解电容做储能。6.3 检查逻辑错误的系统化方法如果电路供电正常、引脚接对了但功能还是不对那就得系统化排查了。我的排查顺序是这样的第一分段验证。别指望整个电路一下子就是对的。比如搭全加器先只接半加器部分确认S1和C1输出正确再接上半加器二和或门。这个习惯救了我很多次因为一旦整体不工作你很难判断是哪一部分出了问题。第二对照真值表逐行测试。给输入端加每一种状态组合用万用表或LED观察输出跟理论真值表比对。哪一行对不上就定位到具体逻辑路径上。第三用“固定输入法”缩小范围。就是说对某个输入强行接高电平或低电平观察输出的变化是否符合预期。比如一个与门输出不对先把其中一个输入接低无论另一个输入是什么输出应当始终为0如果不为0说明芯片坏了或者接线错了。第四怀疑芯片本身。74系列芯片也分不同后缀LS、HC、HCT、AC等它们的输入输出电平和驱动能力都不一样。混用不同系列的芯片可能出现电平不兼容的情况——比如TTL输出的高电平可能达不到CMOS输入要求的阈值。我一开始没注意这个问题结果TTL芯片输出给CMOS芯片信号就是上不去。后来统一改用同一系列问题迎刃而解。6.4 逻辑门振荡器的不稳定问题回到前面那个用与非门搭的振荡器它最大的问题就是频率不稳定。因为门电路的翻转阈值随温度和电压漂移RC电路的充放电过程受元件精度影响也很大。我实测同一个电路在不同供电电压下频率差距能达到百分之十几。如果想要稳定频率的脉冲信号建议换成晶振或555定时器芯片。晶振靠石英晶体的压电效应维持振动频率精度极高555定时器内部有比较器和触发器输出频率由外部R和C精确决定比门电路振荡器稳定得多。所以虽然门电路搭振荡器看起来特别“极客”但如果你的项目对时间精度有要求还是老老实实换专用器件。7. 器件选型的一点想法和项目扩展方向前面提了好几次芯片选型我再展开说几句。数字逻辑器件的家族很庞大74系列是TTL4000系列是CMOS两者在功能上有很多对应关系但在电气特性上差别不小。TTL芯片速度快、驱动能力强但功耗相对大CMOS芯片功耗极低、电源电压范围宽但速度相对慢。如果是电池供电的便携设备CMOS是不二之选如果是高速信号处理74HC甚至74AC系列更合适。我在实验课上经常看到有人拿74LS和4000系列混搭还抱怨为什么不工作——多半是电平兼容性的问题。还有一个容易忽略的点是芯片的“扇出系数”就是一个门输出能驱动多少个后续门输入。TTL标准系列的扇出系数通常是10也就是说一个输出端最多接10个输入端超过这个数信号电平就会劣化。做复杂电路时如果一个输出要分给很多路信号需要在中间加缓冲器比如74LS244来增强驱动能力。这个细节在简单实验中不太明显但做到比较大规模的电路时就非常关键了。如果你学会了基础的逻辑门排列组合后续有几个方向可以玩得很深。一个是做一个小型CPU——用74系列芯片做出一个能执行简单指令的处理器网上有完整的开源项目做完之后再回头看“排列组合”这四个字感受会很不一样。另一个是学习硬件描述语言Verilog或VHDL用代码描述逻辑电路然后烧到FPGA里验证——这时你写的每一行代码最终都会被综合工具映射成真实逻辑门的排列组合。有了手工搭电路的基础写HDL的时候你对硬件行为的直觉会扎实得多。还有一点现在芯片采购比以前方便太多了网上下单第二天就能到。但我真心建议学习阶段还是要在面包板上亲手搭几次电路。因为面包板上的排列组合是看得见摸得着的——哪根线接错了、哪个引脚悬空了逼着你把电路逻辑从头到尾理一遍。这个“物理接触”的过程是仿真软件替代不了的。
返回列表