ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

加法器与译码器实战:从74LS283到74LS138的数电实验指南

2026/10/6 4:56:15 拓冰建站 浏览量
加法器与译码器实战:从74LS283到74LS138的数电实验指南 大学数电实验里加法器和译码器几乎是最常被拿来练手的两类组合逻辑电路。我当年第一次在面包板上点亮数码管用的就是74LS283加法器和4511译码器这套组合接线接得手忙脚乱却也是那一次彻底把“组合逻辑”四个字搞懂了。这篇总结想把这两块内容放到一起讲加法器解决的是“二进制怎么算”译码器解决的是“二进制怎么用”它们背后其实是同一套输入输出映射思维。如果你正在写数电实验报告、准备笔试面试或者打算用74系列芯片做点小设计这篇文章应该能帮你省下不少查资料的时间。1. 加法器从真值表到芯片级实现1.1 半加器和全加器加法的最小单元半加器是加法器里最基础的积木输入只有两个1位二进制数A和B输出一个和S与一个进位C。它的真值表很简单输入A输入B和S进位C0000011010101101看这张表就明白了和S就是A和B的异或进位C就是A和B的与所以用门电路实现半加器只需要一个异或门和一个与门。很多课程作业会让你用与非门搭半加器思路是把异或转化成四个与非门的组合这一步是“用与非门实现基本逻辑”的经典练习。半加器的问题在于它不处理来自低位的进位所以只能做1位加法。真要算多位二进制数每一位都可能收到来自低位的进位这就引出了全加器。全加器增加了一个输入Cin低位进位输出变成S和Cout。全加器的逻辑关系是SA⊕B⊕CinCoutABCin(A⊕B)。理解全加器的时候我喜欢把它看成一个“带进位的投票器”三个输入里只要有至少两个1Cout就是1如果1的个数是奇数S就是1。这个直觉比死记公式好使。多位加法器就是把一串全加器按位串起来每一位的Cout接到高一位的Cin。为什么全加器才是构建加法器的基本单元而不是半加器举个最直观的例子算83也就是10000011最低位相加就产生进位这个进位要一路影响上去。只靠半加器根本没法表达这种“位与位之间的传递”。1.2 行波进位加法器为什么慢、慢在哪把N个全加器一字排开从最低位开始逐级向上进位这就是行波进位加法器Ripple Carry Adder。我最早在实验里搭的就是这种结构verilog里写个for循环也能瞬间生成电路图看起来特别规整一个全加器接一个全加器像串糖葫芦。行波进位加法器的致命问题是速度。最坏情况下进位要从最低位一路“漫”到最高位。比如计算11110001最低位产生进位第二位的和变成0又产生进位第三位同样第四位同样最终最高位才输出正确结果。如果每一个全加器完成进位输出需要tpd时间那么一个4位行波进位加法器在最坏情况下要等4倍的tpdN位就要N倍。位数一多这种结构就完全跑不快了。做笔试题的时候常考“四位行波进位加法器的最坏延迟”。这时候别只算进位路径还要注意最后一位的求和输出时间。正确思路是最坏延迟 (N-1)级进位传播延迟 最后一级的求和延迟因为最高位的S要等Cin到了之后才能稳定。很多人一上来就算4级进位延迟忘了最后还需要一级异或门答案就差了一点点。1.3 超前进位与并行前缀加法器快的代价行波加法器慢是因为进位是逐级产生的。超前进位加法器CLA的思路很直接能不能不等低位慢慢算直接让每一位的进位由输入一次性决定于是引入两个中间量生成函数GAB传播函数PA⊕B。进位公式可以写成C_{i1}G_iP_iC_i。把这个公式展开就能看到效果C1G0P0C0C2G1P1G0P1P0C0C3G2P2G1P2P1G0P2P1P0C0。所有进位都能用最开始的输入C0和每一级的G、P直接算出来原理上只要两级门电路就能完成所有进位的计算所以叫“超前进位”。代价是表达式越来越长门的扇入越来越大硬件开销成倍涨。4位CLA已经很费门了做16位、32位再展开就是灾难。面试或者复试经常会出现Brent-Kung并行前缀加法器这个词。它本质上是在超前进位的基础上把进位链组织成树形的前缀计算结构通过“并行”的方式让进位同时计算同时避免了表达式爆炸。你不需要背电路细节只要记住它是一种“用面积换时间”的树形优化介于行波和全展开之间综合权衡了延迟和资源面试基本就能过关。1.4 用74LS283与门电路实现加法器实验里很少有人真的用一堆门搭四位加法器多数直接上手74LS283。这是一片4位超前进位加法器芯片内部已经把P、G和进位逻辑做好了外部只需要接输入和读输出。引脚很规律A1~A4和B1~B4是两组4位输入C0是进位输入S1~S4是和输出C4是进位输出。做多位扩展时把低位的C4接到高位的C0就行。我在实验室指导过学弟做“两位十进制加法器”用的就是两片74LS283。第一片算低4位第二片算高4位第一片的C4接第二片的C0这样最多能算8位二进制数对课程设计来说绰绰有余。如果老师要求用门电路搭半加器或者全加器那多半是为了考察“与或非实现加法器”的基本功。全加器可以用两个半加器加一个或门拼出来第一个半加器算AB得到临时和与临时进位第二个半加器把临时和与Cin相加最终进位由两次进位相或得到。这个结构推导一遍考试时画图就不慌了。注意接门电路芯片时电源和地接反会让芯片瞬间发烫甚至烧掉。我见过不止一个同学把VCC和GND搞混那味道和冒烟的场面一次就能记住。养成上电前先用万用表蜂鸣档量一下电源两端的好习惯能省很多学费。2. 译码器把二进制翻译成看得懂的信号2.1 译码器的本质n个输入映射到2^n个互斥输出译码器的核心逻辑一句话就能讲完把n位二进制码“翻译”成2^n个输出中的某一个有效信号。比如2线-4线译码器输入A1A0有00、01、10、11四种组合输出对应的Y0、Y1、Y2、Y3只有一个被选中。3线-8线译码器就是输入8种组合输出8条线里选一条。这个“输入组合对应唯一输出”的性质让译码器成了地址选择的主力。你想用几根线控制一大堆外设本质上就是在做译码比如用4根地址线选16个寄存器或者用3根线控制8个LED译码器就是干这个的。更深一层的价值在于译码器的每个输出对应一个最小项。回顾一下数电里的最小项概念n个变量的全部最小项正好有2^n个译码器的输出把最小项整整齐齐摆在了那里。所以“译码器一个与非门”就能实现任意组合逻辑函数这是中规模集成电路实现逻辑函数的标准套路。考试题经常给一个三变量函数让你用3线-8线译码器和与非门实现本质上是把函数表达式写成最小项之和然后把需要的最小项通过与非门合并起来。2.2 74LS138最常用的3线-8线译码器74LS138可以说是数电实验里的明星芯片。它有3个地址输入A2A1A08个输出Y0~Y7输出是低电平有效也就是被选中的那一路输出0其余输出1。芯片还带了3个使能端G1是高电平有效G2A和G2B是低电平有效。三个使能条件必须同时满足G11、G2A0、G2B0芯片才真正开始译码否则所有输出都保持高电平“无效”状态。低电平有效这个设计初次接触很容易踩坑。我当年用138点亮LED的时候想着“选中哪个就亮哪个”直接把输出接LED正极结果全部不亮或者反着亮。实际上应该把输出接到LED的阴极被选中输出0时电流从电源经电阻和LED流入芯片灯才亮。因为使能端足够灵活两片138拼成4线-16线译码器是实验常见题。方法也直接16个地址的低3位A2A1A0同时接到两片138高位A3用来选择哪一片工作。A30时让第一片使能、第二片禁用A31时反过来。这样输入0000~0111对应第一片Y0~Y7输入1000~1111对应第二片Y0~Y7拼起来就是16个互斥输出。2.3 数码管驱动4511和7448的关键区别数码管本质上是8个LED七段加小数点公共端接电源再接限流电阻段选端输入高电平点亮的是共阴数码管公共端接地的则是共阳数码管。驱动数码管不能直接把BCD码接到段上需要一片“BCD-七段译码器”把4位二进制数翻译成7个段信号。实验里常用的4511和7448功能都是BCD转七段但细节差别很大。4511是高电平有效输出适合共阴数码管内部自带锁存功能LE端控制数据可以锁住不乱闪。7448也是高电平有效输出适合共阴管但它是集电极开路输出必须接上拉电阻到电源否则输出上不去数码管亮度也会异常。还有一款74LS47是低电平有效输出接共阳数码管。芯片输出有效电平适配数码管是否需要上拉附加特性4511高电平共阴否内部锁存LE控制7448高电平共阴是集电极开路可驱动灯测试74LS47低电平共阳是驱动能力强这个表格我强烈建议你抄到实验报告里。很多同学设计没问题实物不亮最后发现是共阴共阳选错或者忘记给7448加上拉电阻。一个简单的判断方法看数码管的公共脚公共脚接VCC就是共阳接GND就是共阴然后按表选芯片。2.4 用两片138搭出4线-16线译码器的实操细节既然前面提到了4线-16线扩展我把接线过程拆细一点照着做基本不会错。第一步把两片74LS138的低位地址输入A2、A1、A0并联都接到外部输入的A2、A1、A0。第二步把外部最高位A3接到第一片138的G1同时通过一个非门取反后接到第二片138的G1。第三步两片的G2A和G2B都接地。这样当A31时第一片使能A30时第二片使能两片轮流工作输出端并在一起作为16路输出。这里有个容易出错的地方外部输入的A3是高电平有效但第一片使能需要G11所以A3直接接G1没问题第二片要A30才使能必须经过非门千万别把A3直接接到G2上就算完。我在指导实验时发现很多同学把A3接到G2A以为低电平有效就行但此时两片会同时满足或同时不满足使能条件输出就全乱了。扩展完的16路输出依然是低电平有效如果想驱动LED记得参考2.2里的说法把LED阴极接输出端阳极通过限流电阻接VCC。3. 加法器和译码器联动一个完整的实验系统3.1 加法结果怎么变成数码管显示单独做加法器和单独做译码器都只是“会动”的电路真正把数电串起来的是联动。最简单的联动场景是用74LS283算两个4位二进制数相加结果通过译码器显示到数码管上。加法器输出的是二进制结果人没办法一眼看懂必须转成七段码或者BCD码才能显示翻译这一步就交给译码器。要做“两位数以内的十进制加法”实验一般这样接第一片283算个位输入是两个BCD码A和B输出S1~S4送给一片4511驱动个位数码管进位C4就是十位再接一片4511驱动十位数码管。两组BCD码用8个拨码开关控制每4个一组对应0~9。拨动开关数码管上就能看到两个十进制数相加的结果。这里有一个必须提前想清楚的地方个位相加最大是99119已经超过了一位BCD码能表示的9所以十位数码管显示的就是进位C4。但如果你在两片4511之间加了一排电阻或者反相器接法不同显示就会出错。建议按数据手册把LE端接在固定有效电平上比如4511的LE接地保证数据实时更新如果实验板上LE接的是脉冲信号还要确认时序是否跟得上。3.2 动态扫描显示用138给多个数码管排队如果一个系统要显示4位数给每一位配一片4511成本高不说布线也乱成一团。实验里更常用的方案是动态扫描而74LS138在这里的作用就从“翻译”变成了“选通”把多个数码管的段选信号并联在一起位选信号由138轮流选中。具体做法是所有数码管的a~g并联到同一组七段码位选端分别接到138的8个输出经过驱动管或者直接控制三极管138的输入由一个计数器或者手动信号周期性地循环扫描。刷新频率足够快时人眼有视觉暂留余晖效应看到的效果就像所有位同时点亮一样。扫描频率一般要高于50Hz否则会看到明显的闪烁。我做过一次实验频率掉到30Hz以下数码管抖得人眼睛疼查了半天才发现是计数器的时钟频率设低了。动态扫描让译码器不再只是一个“显示翻译器”而是一个“时分复用选择器”。这个思路在真实嵌入式系统里非常常见LED点阵屏、数码管仪表很多都是这样一个端口驱动多位显示用扫描的方式降低成本。3.3 从计算器到流水灯加法器和译码器的更多玩法把加法器和译码器放在一起还可以做不少有意思的小设计。比如做一个“地址发生器流水灯”用一个4位加法器让它的输出从0递增到15再把输出接给4线-16线译码器译码器的16路输出分别控制16个LED。加法器每加1译码器就点亮下一盏灯流水灯的效果就出来了。加法器在这里扮演的是“计数器”角色虽然它本身没有寄存功能但配合一个寄存器或者手动按键就能生成递增地址。这个设计虽然简单却包含了一个很核心的思想运算单元加法器负责产生数据译码器负责把数据解码成物理世界的动作。后面做CPU课程设计时地址译码、指令译码都是这套逻辑的放大版。更进阶一点可以用译码器实现查表运算把某个函数的结果预先“编码”在译码器的接线里输入一组数输出对应的控制信号。比如用加法器的输出选通不同行的继电器、LED阵列、报警器等效于用硬件实现一张查表表项。这种“组合逻辑查表”的思路就是现在FPGA里LUT查找表的雏形之一从数电实验开始理解它对你后面学可编程逻辑很有帮助。4. 实验排坑与调试经验4.1 竞争冒险与毛刺为什么示波器上总有不该有的脉冲组合逻辑电路最大的坑是信号在不同路径上的传播延迟不一样。同一个逻辑门的输入信号一路从近处来一路绕了很远才到它们到达的时间有先有后输出就会出现一个极窄的错误脉冲这就是竞争冒险。加法器的进位链是毛刺的重灾区尤其在做多位加法时一个输入变化可能引起一连串进位传播中途任何一个节点的短暂错误都会被放大。我在实验里遇到过这样的情况加法器计算结果在逻辑分析仪上看起来完全正确但接到后一级电路后会偶然触发错误动作后来用示波器一量发现输出端有很多几纳秒宽的小毛刺。这基本就是竞争冒险没跑了。处理毛刺有几条路一是在输出端加D触发器让结果在稳定之后再由时钟沿采样这是最常用的方法二是通过增加冗余项消除特定的竞争冒险比如在卡诺图里把相邻的1圈在一起加一个多余项三是输出端加RC低通滤波把窄毛刺滤掉。对实验课来说“用时钟沿采样结果”是最简单可靠的方案道理就和拍照片要在人站稳之后按快门一样。4.2 引脚、电平和悬空的坑数电实验里设计出错的概率其实很低大部分问题都出在线没插对、电平没理解对、引脚悬空这老三样上。我总结过一份排查清单每次实验前先过一遍74LS138的G2A和G2B必须接地G1必须接高三个使能条件只要漏一个输出全错。有些实验板型号是74HC138引脚兼容但工作电压范围不同查手册时别混用。拨码开关的闭合逻辑不一定是你想的那样。按下是0还是1不同板子不一样接线前先用万用表量一下公共端和输出端的电压比瞎猜靠谱。不用的芯片输入引脚不要悬空。TTL芯片输入端悬空会引入干扰严重的时候输出随机跳变看起来像灵异事件实际就是悬空惹的祸。不用的输入引脚该接地接地该接高接高别省这点线。面包板的两条电源轨不是全程导通的中间常有断开点。我在实验室里不止一次遇到同一个板子上两个芯片一个亮一个不亮查到最后都是电源轨断点。解决方案很简单从电源两端分别引线或者用万用表蜂鸣档量一遍整条轨。4.3 数码管不亮或乱码的排查顺序数码管相关的问题有一个固定的排查路径按顺序走下去通常几分钟就能定位。第一步确认共阴共阳选对没有这是最基础也最容易被忽略的第二步确认限流电阻有没有接阻值一般在220欧到1千欧之间太小容易过流太大亮度不够第三步用万用表测译码器输出端的电压以4511为例高电平有效输出应该在2V以上如果只有零点几伏芯片可能没工作第四步检查锁存端LE如果LE被接成了无效电平输入数据变了输出也不会变数码管就“死”在那里。有一个“最笨但最有效”的排查办法把译码器的输出引脚逐个手动接高电平和低电平如果数码管能亮说明问题出在译码器之前如果手动接都不亮那就是数码管、电阻或者公共端接法的问题。这种分段隔离的方法帮我省了非常多时间比对着电路图干瞪眼高效得多。4.4 实验报告怎么写才不像在凑字数很多同学的实验报告就是电路图加一句“实验成功”老师一眼就能看出没深入思考。我写报告和带实验的经验是报告里一定要有“设计目标-输入输出定义-关键验证-问题解决”这条线。设计目标不能说“验证加法器功能”而要说“设计一个支持两位BCD码输入的十进制加法器用数码管显示0到19的结果”输入输出要列表说明哪个拨码控制什么、哪一位是进位让读者不用猜。关键验证部分最好放上示波器截图或者真值表实测值这比写一百字“实验现象与理论一致”都有说服力。至于问题解决写一个“问题描述-排查过程-最终解决”的小结哪怕只是“数码管乱码检查后发现是LE端没接有效电平”也能体现你真正动过手。这个结构同样适用于面试里讲项目面试官问“你做过什么”你讲一次完整的排错经历比把原理背一遍更让人信服。最后再分享一个从实验里带出来的习惯给每块芯片的电源和地之间加0.1uF去耦电容尤其在面包板上做加法器和译码器联动时。当年我总觉得这是多此一举直到有一次现场演示数码管毫无规律地乱跳查了半天才发现是电源纹波太大加上去耦电容之后立刻稳定。数字电路的设计逻辑可以很清晰但物理世界永远会给你一点“惊喜”而调试这些惊喜的过程才是数电实验真正教给我的东西。