用两片74HC151数据选择器搭全加器:从真值表到面包板实战
发布时间:2026/10/6 11:36:14 作者:尧图编辑部 阅读量:1,286

做全加器是数字电路课必过的坎。教材里讲化简卡诺图、画门电路、列真值表一套流程下来逻辑很清楚但真到了实验室就发现——用74LS08、74LS32、74LS86这种门电路拼出一个全加器先得在面包板上接出七八条交叉线还要反复确认哪条线该进哪个门稍有疏漏波形就乱成一锅粥。如果你正好也是刚入门数字电路想让“纸面上的全加器”真正在面包板上跑起来建议你换个思路直接用两块74HC151数据选择器把真值表“烧”进芯片里二十几分钟就能搭出一个能点亮LED的全加器全程不画一张逻辑门连线图。这个方案的核心逻辑很简单74HC151是8选1数据选择器它有8个数据输入端和3个选择输入端只要把全加器的三个输入A、B、Cin接到芯片的选择端再把真值表对应的输出结果接到数据输入端芯片就能“查表”完成运算。这篇博文我会从全加器的真值表和逻辑表达式讲起再到74HC151的引脚解剖、完整接线图、通电验证以及常见故障排查最后聊聊怎么往四位加法器和Verilog方向延伸。整个过程非常适合数字电路入门者、电子爱好者和准备课程设计的同学照着接就能复现。1. 全加器原理与设计思路1.1 从半加器到全加器为什么多一个进位输入先理清一个基础概念。半加器只有两个输入A和B它只能完成低位二进制相加输出“和位S”与“进位Cout”但没有办法接收低位加过来的进位。真实的多位二进制加法是从最低位逐步向高位加的每一位除了要处理本位的A和B还要处理上一位产生的进位这个进位在数学运算里就叫CinCarry in。全加器就是为这个场景设计的组合逻辑电路输入有三个A、B、Cin输出有两个和位Sum以及向高一位输出的进位Cout。比如用二进制算1 1在最低位时A1、B1、Cin0正确结果是0进位1也就是二进制里的“10”。但如果上一位也传来了1那么A1、B1、Cin1时结果应该是1进位1也就是“11”。多出来的这个Cin正是全加器区别于半加器的关键。为什么不用半加器做多位加法因为半加器没有Cin只能加法器最末位。所谓“全加器”就是把低位的进位纳入计算是组成多位加法器的基本单元。1.2 真值表与逻辑表达式用异或和与或算清“和位”和“进位”全加器的真值表一共有8行因为三个输入变量A、B、Cin可以组成2的3次方共8种组合。这个表是整个项目的“上帝视角”后面所有接线都是围绕它展开的。ABCinSumCout0000000110010100110110010101011100111111根据真值表可以直接写出两个输出的逻辑表达式Sum A ⊕ B ⊕ Cin也就是三个输入逐位异或。Cout A·B A·Cin B·Cin也就是任意两个输入为1时进位输出就是1。和位表达式本质上就是异或逻辑的拓展这在数字逻辑教材里会称为“判奇电路”Sum1正好意味着三个输入中1的个数是奇数个。进位位的表达式也很好理解三个输入里只要有两个或两个以上是1就必须向高位进位。用标准逻辑门符号来画Sum用两级异或门即可实现Cout用一个“两两相与再相或”的结构就可以实现。但在真实电路里这样做会需要74LS86、74LS08、74LS32至少三块芯片而且互连线非常多所以我这次的思路不是用逻辑门硬拼而是借用数据选择器把真值表整体“存进去”。1.3 为什么用数据选择器组合电路中“以空间换时间”的典型思路数据选择器也叫多路选择器英文MUX它的典型功能就是从多个输入中选择一个送到输出。8选1的74HC151有8个数据输入端D0到D7输入选择端A、B、C输出端Y和反相输出端W。当选择端决定选中D_{i}时输出Y就等于D_{i}的电平。这里有个非常关键的点如果把一个逻辑函数的自变量接到选择端把函数值接到数据输入端那这颗MUX就能完整复现该函数的真值表。因为真值表本质上就是一个“输入组合→输出值”的映射表而MUX在每一组选择码下都只会把对应的一个数据脚连通到输出这恰好和真值表逐行对应。换句话说你不需要搭任何与门或门只要按真值表在D0到D7上接高或接低电平函数就实现了。用数据选择器搭全加器的完整目标是两片74HC151一片管Sum一片管Cout。两者共用A、B、Cin这三个选择输入所以控制线完全一致。它比门电路方案多占一颗芯片但布线简单得多也更接近现代数字芯片里“查找表LUT”的思想——后续学FPGA、Quartus或者Verilog时你会发现FPGA的LUT本质上就是“用SRAM存真值表再用选择器选出结果”连理念都是同一套。2. 74HC151 芯片解剖与“查表法”逻辑映射2.1 引脚排列与内部结构先看懂16只引脚的“分工”74HC151是一块16引脚的DIP芯片。拿到芯片后把缺口朝上、引脚朝下左上角是1脚逆时针方向依次排列。各引脚定义如下引脚名称功能1B选择输入端B2C选择输入端C3G\使能端低电平有效4D7数据输入75D6数据输入66D5数据输入57D4数据输入48GND电源地9D3数据输入310D2数据输入211D1数据输入112D0数据输入013Y同相输出端14W\反相输出端Y取反15A选择输入端A16VCC电源正极A、B、C三个选择引脚组合成二进制编码编码范围从000到111正好对应D0到D7。当G端为低电平时芯片正常工作当G端为高电平时输出被强制拉到低电平相当于整个芯片被禁用。这个使能信号非常有用可以方便地实现多片级联或者分时复用不过本次搭建全加器只需要把G端固定接地。74HC系列芯片内部是CMOS结构输入阻抗非常大功耗很低在5V供电下工作很稳定。这一点直接决定了接下来的接线策略不用的数据输入也不能悬空必须明确接到VCC或者GND否则会引入随机电平。2.2 数据选择器如何实现任意三变量逻辑函数要把任意一个三变量逻辑函数写进74HC151只要遵循四步先写出该函数的真值表再把三个输入变量A、B、C接入芯片的A、B、C选择引脚然后根据真值表上每一行对应的函数值把D0到D7接到VCC或GND最后把Y端作为函数输出。为什么这个映射能成立我们看芯片内部的译码逻辑当选择码是000时内部逻辑把D0到输出Y连通选择码是001时把D1连通依此类推。所以选择端所组成的二进制数实际上就是真值表左侧的“行号”你只需要在每一行对应的D引脚上准备该行的函数值输出就会自动和真值表一致。比如要实现三个输入的与函数F A·B·Cin真值表在第7行111时为1其他全为0。这时就给D7接VCCD0到D6全接GND。实际操作里为了让接线更好看也会把三个输入变量按不同顺序接到选择端比如把Cin接到A脚、把A接到C脚这时只要同步调整D0到D7的映射即可。本次项目中我会把全加器的A接到芯片A脚、B接到芯片B脚、Cin接到芯片C脚这样和真值表顺序完全一致不容易看错。2.3 真值表到D0~D7的映射一张表搞定两个输出现在来做最核心的工作。全加器有两个输出Sum和Cout需要一个芯片一个芯片分别配置。对于Sum芯片而言真值表的每一行就是选择码Sum列的值就是我们要写到D0~D7的值。把A、B、Cin依序接到选择端A、B、C后选择码ABC和D脚之间的对应关系是固定的。我们看Sum输出选择码ABC对应D脚Sum值Cout值000D000001D110010D210011D301100D410101D501110D601111D711所以用来输出Sum的那片74HC151D0~D7应该分别接到D0GND、D1VCC、D2VCC、D3GND、D4VCC、D5GND、D6GND、D7VCC。用来输出Cout的那片74HC151D0~D7应该分别接到D0GND、D1GND、D2GND、D3VCC、D4GND、D5VCC、D6VCC、D7VCC。这两组配置是全部接线工作的“灵魂”。只要这两组配置接对整个全加器的逻辑功能就完成了后续所有布线都是保证这个配置真正被送到芯片引脚而已。可以这样理解每片74HC151内部相当于一个八选一的“真值表查询器”而D0~D7就是这张表的内容表项两块芯片各存各的内容共用同一组查询地址。3. 完整接线流程两片 74HC151 搭建全加器3.1 物料准备与面包板供电布局动手之前先把物料准备齐。这次项目一共需要以下这些74HC151芯片两片面包板一块建议至少400孔以上5V直流电源USB供电器、实验室电源或者单片机开发板都可以三个拨码开关或按键开关模拟输入A、B、Cin两个LED用来显示输出Sum和Cout220Ω~470Ω电阻两个LED限流电阻0.1μF陶瓷电容一个去耦使用杜邦线若干尽量准备不同颜色方便区分信号、电源与地供电布局是整个面包板布线的前提。面包板通常上下各有一条横向的电源轨把5V接到上侧一条轨GND接到下侧一条轨然后把两片芯片的VCC脚16脚和GND脚8脚分别取到这两条轨上。一定不要让两条电源轨在面包板上短路到一块儿接电源轨之前先用万用表测一下确认没有短路。接着在靠近两片芯片的VCC引脚和GND引脚之间放置0.1μF去耦电容。这个电容非常重要它能滤除芯片开关时产生的电源尖峰防止输出状态切换时电源轨出现毛刺。很多面包板项目看起来逻辑没问题但LED乱闪往往就是因为省掉了去耦电容。3.2 求和输出通路接线图芯片1下面开始接第一片74HC151管Sum输出。按照引脚排列先把芯片插在面包板上注意缺口朝向确保左右两排引脚不短接。然后是关键的三根选择线全加器的输入A接到芯片的15脚A选择端全加器的输入B接到芯片的1脚B选择端全加器的输入Cin接到芯片的2脚C选择端三个输入端可以来自三个开关。我这里建议每个开关的一端接GND或VCC另一端接选择脚具体接法在3.4小节统一说明。现在先假设这三个信号线已经有了稳定的0V或5V电平。接下来是数据输入D0~D7的接线。这步是整个项目最容易出错的地方务必和上一小节的表一一核对。对于管Sum的芯片1D012脚接GNDD111脚接VCCD210脚接VCCD39脚接GNDD47脚接VCCD56脚接GNDD65脚接GNDD74脚接VCC然后把使能端G3脚接到GND让芯片始终处于工作状态。最后把输出Y13脚接到限流电阻一端电阻另一端串一个LED到GND这就算是把Sum信号引出来了。这里有个外观上的规律Sum芯片的数据脚在高和低之间反复交替看起来像是某种校验码波形。对照真值表你会发现D0~D7恰好按照“0、1、1、0、1、0、0、1”排列这正是“三输入异或”在8个最小项上的取值读起来像个回文结构挺容易记忆。3.3 进位输出通路接线图芯片2第二片74HC151管Cout输出。选择线三根和芯片1完全一样直接从芯片1的15脚、1脚、2脚并联过来即可也可以从开关侧并联接过来。切忌把A、B、Cin接到芯片2的不同顺序引脚上否则等于打乱了真值表映射。数据输入D0~D7按照Cout列配置D012脚接GNDD111脚接GNDD210脚接GNDD39脚接VCCD47脚接GNDD56脚接VCCD65脚接VCCD74脚接VCC然后把使能端G3脚接地输出Y13脚同样接限流电阻和LED到GND。这块芯片数据脚的规律更直观从D0到D7只有D3、D5、D6、D7是1其余是0。你可以在真值表上把Cout列中标1的四个组合——A0、B1、Cin1A1、B0、Cin1A1、B1、Cin0A1、B1、Cin1——圈出来看看四个位置正好是“任意两个输入为1”的情况核对起来一目了然。两片芯片都接好后把两个Y输出分别接到两个LED一个标记为Sum一个标记为Cout电源接上整个全加器电路就成型了。接线图用文字表示就长下面这样输入开关A ──▶ 芯片1/2的A选择端15脚 输入开关B ──▶ 芯片1/2的B选择端1脚 输入开关Cin─▶ 芯片1/2的C选择端2脚 芯片1Sum: D7 D6 D5 D4 D3 D2 D1 D0 选择端A、B、C 输出13脚Y V G G V G V V G 使能端3脚接GND ──▶ 电阻 ──▶ LED_Sum 芯片2Cout: D7 D6 D5 D4 D3 D2 D1 D0 选择端A、B、C 输出13脚Y V V V G V G G G 使能端3脚接GND ──▶ 电阻 ──▶ LED_CoutD0到D8的“原样映射”我采用了从低到高的顺序如果你插芯片时发现某些输入脚位置不太顺手完全可以自由调整D0~D7在面包板上的物理顺序只要每个D脚所接电平正确就行。3.4 输入开关与LED指示电路把8种状态“可视化”输入开关的设计直接决定你做实验时的手感。全加器有三个输入如果用一个三位拨码开关一侧接VCC另一侧接GND已经很容易但如果是按键开关就要关注电平的默认状态。最稳妥的做法是给三个选择脚各加一个10kΩ下拉电阻到GND再用开关把选择脚接到VCC。这样开关没按下时输入是0按下时变成1非常直观也没有悬空风险。如果你手头有单片机开发板或Arduino还可以用三个GPIO口直接输出高低电平通过串口或按键循环改变输入组合。这样测试8种状态就不用手拧开关调试效率会高很多。用GPIO驱动74HC151是安全的因为CMOS输入阻抗高几乎不向外索取电流。LED指示电路也要注意连接方式。我习惯把LED阳极接到Y输出阴极串一个220Ω电阻到GND。当Y输出高电平时LED点亮。如果你用的是5V供电220Ω~330Ω电阻都比较合适若用3.3V单片机供电电阻可以适当减小到100Ω。还要注意LED的正负极面包板上长引脚是阳极千万别接反不然测试时会得到“始终不亮”的错误信号。接完之后可以先做一个最直观的冒烟测试把A、B、Cin三个开关全部拨到0此时选择码是000Sum芯片会选中D0而D0接了GND所以Sum的LED应该熄灭Cout的LED也应该熄灭。如果发现两个灯都亮了那八成是芯片插反了或者D脚接错了先断电检查。4. 通电验证、故障排查与常见问题4.1 通电前检查清单接通电源之前花两分钟做一次快速检查能省下大量排查时间。按顺序确认这几项两片芯片的电源方向一致16脚都接VCC8脚都接GND。去耦电容确实并接在电源和地之间而且电容两端接触良好。三根选择线A、B、Cin不是悬空的通过开关和电阻有了明确的高低电平。两片芯片的G使能端都直接接GND没有被误接到VCC或悬空。所有D0~D7引脚都接了VCC或GND没有悬空的。LED的限流电阻已经串联好不能把LED直接接到5V和GND之间。如果以上都确认无误可以上电了。上电后用万用表测一下芯片16脚和8脚之间的电压应该在5V左右再测一下13脚Y端在没有改变输入时的静态电平可以判断芯片是否进入工作状态。Y端输出范围应该接近电源轨如果测到1V这种中间值多半是使能端没接地或输入悬空。4.2 手工遍历八种组合的验证方法全加器有8种输入组合把真值表抄在旁边一个一个拨动开关核对LED状态。我建议用表格记录每一组测试结果边测边填因为任何一处失误都可能导致后续判断混乱。测试顺序可以这样安排从000开始依次到001、010、011、100、101、110、111。每改一次输入观察Sum和Cout两个LED。对照预期结果输入ABC预期Sum预期Cout000灭灭001亮灭010亮灭011灭亮100亮灭101灭亮110灭亮111亮亮正常情况下八组测试全部和这张表吻合。实测时我发现最容易出现偏差的地方是“011”这一行——Sum应灭而Cout应亮。如果你的本能让灯混乱多半是D2、D3接反或者D6、D7接反。还有一种情况是Sum芯片的某几个数据脚接对了但Cout芯片的数据脚接错两个输出自然就对不上号了。如果手上还有逻辑分析仪或示波器可以把Y输出接上去手动切换输入并抓取波形。三个选择线如果交替变化Y上会出现依真值表变化的脉冲串。这算法上其实等价于把三个输入作为地址线连续读取存储的表项所以你可以观察到Y的时序跟D端口电平完全对应。用示波器看会更直观也能顺便观察芯片的传播延迟。4.3 常见故障速查表与排查逻辑在实际搭建过程中我遇到过不少奇奇怪怪的问题这里整理成一张速查表方便大家按症状直接定位。故障现象可能原因排查方法两个LED全灭电源没接好、使能端G悬空或接了高电平测16脚电压测3脚是否为0V两个LED全亮芯片插反、VCC/GND接反断电后拔下芯片重新核对缺口方向某个输入组合结果不对对应D脚接错对照映射表逐脚测量D脚电平所有结果整体混乱选择端A/B/C接反核对三条选择线是否按A、B、Cin次序接入同一个输入状态灯偶尔闪烁输入开关接触不良或选择线悬空用下拉电阻固定默认电平更换质量好的杜邦线Y输出始终低电平G端被拉高万用表测3脚电压排错时有个总原则先查供电再查使能然后查选择线最后查数据线。前端供电出错后面什么现象都可能出现所以不要一上来就怀疑芯片坏了。还有一个经验非常值得说当输出不符合预期时优先怀疑你自己接的线而不是芯片。74HC151这个级别的小规模逻辑芯片只要供电正确、输入不超压几乎不会损坏。过去很多同学在面包板上折腾半天最后发现不过是一根杜邦线接触不良或者某个脚插到了相邻孔里。所以面包板上的线要按照“垂直到底、水平排开”的方式整理尽量避免两根杜邦线在洞里相碰。4.4 关于电平兼容与接口细节的几个提醒如果你用的是74HC151而不是74LS151要特别注意输入电平的差异。74HC系列输入阈值大约是电源电压的一半也就是5V供电时高电平阈值约为3.5V低电平阈值约为1.5V所以和绝大多数TTL或CMOS器件都能对接。但74LS151的输入结构是TTL高电平阈值约2V输入电流也比较大如果前面驱动源功率不足就会造成逻辑不稳定。另外74HC151的W端是Y的反相输出在这个项目里暂时用不到。但如果有兴趣做“加法器的补码输出”之类的实验W端可以直接作为反相逻辑输出省掉一个反相器。这也是选择74HC151而非更常见的74HC153双4选1的额外好处之一。还有一点关于供电的提醒74HC系列可以在2V~6V范围工作但务必让输入信号高电平不要超过VCC0.5V。如果你用3.3V单片机去驱动5V供电的74HC151选择线信号高电平只有3.3V对5V供电的系统来说3.3V刚好卡在高电平阈值边缘长期来看不够可靠。这时的解决办法是给芯片也供3.3V电源或者给选择线加电平转换。5. 项目延伸从单级全加器到四位加法器5.1 从1位到4位行波进位加法器的实现与延迟单级全加器只是开头。真正有工程意义的是把多位全加器串联成一个4位加法器这才是CPU运算器的核心电路之一。用74HC151搭建四位加法器其实只做一件复制的事每一个二进制位放两个全加器芯片把低位的Cout接到高一位的Cin这样就把四个一位全加器串成了四位行波进位加法器。但只要你真正把四个全加器抄到面包板上就会发现一个问题它非常占空间8个芯片加上几十根跳线基本把一块面包板堆满了。而且因为进位是一级一级往上“滚”的每一级都有几十纳秒的传播延迟四级串起来最差情况下的延迟大约是一级延迟的四倍。这就是教科书中讲的“行波进位延迟”也是超前进位加法器存在的意义。用74HC151来搭四位加法器确实不是最优解花8个芯片的成本和时间不如直接上一个74LS283四位全加器芯片后者内部已经实现了超前进位。但从学习角度讲把老方案手工搭建一次看着四个LED正确算出“1011 0110 10001”你对进位传播的理解会彻底从“背概念”变成“亲眼所见”。所以我不反对用74HC151做教学演示只要你清楚它的定位是理解原理而非追求高效。5.2 Quartus / Verilog 里的四位全加器数字桌面上复刻如果你平时用Quartus做课程设计一定对“四位全加器”不陌生。在Quartus II 9.0里画四位全加器原理图可以直接调用半加器和或门元件搭两级结构也可以自己写几行Verilog来实现。当你用Verilog写module full_adder( input a, b, cin, output sum, cout ); assign {cout, sum} a b cin; endmodule这行代码最终被综合器映射到FPGA内部的查找表LUT里。LUT的实质就是一块小容量SRAM加一个多路选择器读出——说白了就是用存储器加MUX查表跟74HC151“把真值表存进D引脚”的思路几乎一模一样。区别是FPGA的LUT可以经由综合器自动填充内容而且规模更大。所以在Quartus里你写一个“四位全加器”综合后的结果其实是若干级LUT查表而不是传统意义上的门电路连线。这正是数字电路设计和硬件实现之间重要的桥梁真值表、布尔代数、数据选择器、LUT这四者在功能上是等价的只是抽象层次和实现方式不同。亲手用74HC151搭一次全加器再回头去看Quartus生成的RTL视图你会明显感觉到教材里的知识一下落地了。5.3 扩展玩法用74HC151实现更多组合逻辑这个项目用完你手头两片74HC151还能做很多事情。既然一片74HC151能实现任意三变量逻辑函数那么任何三输入单输出的组合逻辑比如三人多数表决器、三输入奇偶校验器、3线-8线译码器的部分逻辑、等值比较器都可以用同一套方法写进去接线测试。如果输入端不止三个还可以用多个MUX级联比如两片74HC151组成16选1配合四根选择线能实现四变量逻辑函数这也是“用数据选择器扩展组合逻辑”的经典练习。有了这次经验再回头看到“74HC151 全加器”的资料时你的视角就不会停留在“怎么接”上而是会自然地问为什么这么接真值表落在哪里换成别的芯片该改哪几根线这种迁移能力比单纯记住一个电路图重要得多。我自己的习惯是搭完这个项目后在桌面留一块面包板把Sum这一片拆下来然后把D0~D7改接成三个人表决器的取值十秒钟就完成了一个新逻辑电路。熟悉了这层“真值表进芯片”的路数之后你会觉得组合逻辑设计里最花时间的部分不再是布线而是思考真值表本身。最后分享一个实际测试中的小技巧如果你手边只有一片74HC151可以先只搭Sum部分Cout用另一块面包板上的门电路临时拼出来或者干脆先不接只验证“三个输入异或”的逻辑——这本身就是一个值得玩味的实验。等确认Sum输出完全正确再接上第二片芯片验证进位逐步推进会大大降低排查难度。这也是做任何数字逻辑实验都值得复制的工作方法先分层再集成别一上来就想着一次点亮全部功能。