☰
组合逻辑电路实验指南:从74HC门电路到三人表决器与数码管显示
2026/10/28 23:12:21 网站建设 项目流程

第一次把一片74HC00插上面包板的人,十有八九会撞上同一个场景:电源灯亮着,输出LED死活不亮,或者亮得忽明忽暗,手指一碰线又好了。组合逻辑电路实验看着是最“入门”的一类数字电路实验,从与门、或门、非门起步,一路做到译码器、数据选择器、加法器这些中规模芯片,可真正让人卡住的往往不是布尔代数和卡诺图,而是电平、悬空、去耦、布线这些硬件层面的琐碎细节。这篇实验指南想做的事情很直接:把从74HC门电路搭功能,到中规模芯片选型、验证、排错的整条路径摊开来讲一遍,该算的参数算给你看,该踩的坑提前标出来,能给出一份照着做就能跑通的实验记录。它适合正在做数字电路课程实验的学生、刚转硬件想补基础的软件工程师,也适合想给孩子搭一套逻辑电路启蒙套件的家长——只要你会用万用表,剩下的基本都能照做。

1. 整体设计思路:三层推进与一条主线

1.1 为什么按“门电路—中规模—系统”三层走

我见过不少实验报告,上来就是“用74HC138实现三人表决器”,接线图一画,真值表一贴,完事。这种做法能拿分,但拿不到能力。组合逻辑电路真正要练的是三种不同层级的思维,顺序不能乱。第一层是小规模门电路层,核心训练是把一个文字需求翻译成真值表、化简成表达式、再用有限种类的门(通常只有与非门和异或门)搭出来,这一层练的是“表达式到电路”的映射能力,也是后面所有工作的地基;第二层是中规模芯片层,训练的是“不再用门去堆,而是找一个现成的功能块,把变量映射到它的输入端口上”,这里的关键动作是查数据手册、读懂使能端极性、想清楚输出是高有效还是低有效;第三层是系统层,要处理显示、驱动、级联、接口这些“电路之外”的问题,比如数码管限流、LED亮度、进位链延迟。

按这个顺序推进有个很实在的好处:每一层出问题时,排查范围是收敛的。第一层出问题,九成是接线或表达式写错;第二层出问题,九成是使能端接反或输出极性读反;第三层出问题,九成是驱动能力不够或者位序接反。你要是跳过前两层直接上系统,一个“数码管显示乱码”的现象,可能是表达式错、可能是位序反、可能是极性反、也可能是限流电阻太大导致段电流不足,四五个方向一起怀疑,很容易耗掉一整天。

我的建议是给每一层都设一个明确的验收物:第一层的验收物是“一片74HC00搭出三人表决”,第二层的验收物是“一片74HC151实现同一个功能”,第三层的验收物是“把投票结果用数码管显示出来”。三个验收物串起来,就是一整套可复现的实验流程,也天然形成了一条从底层到系统的进阶路线。

1.2 器件选型:74HC、74LS、CD4000三条路怎么选

新手最容易在器件系列上犯迷糊。同样是“四2输入与非门”,74HC00、74LS00、CD4011三个型号价格差不多,但电气特性差得远,选错了会让实验过程变得莫名其妙。我个人的默认选择是74HC系列,理由很简单:宽压供电(2V到6V)、静态功耗几乎为零、输入阻抗极高、5V下的速度也够用,面包板上插拔不心疼。

74LS属于早期双极型工艺,5V固定供电,输入悬空时内部结构会把它拉成高电平,这一点对新手“友好”,因为它不会因为你忘了接输入就乱跳;但代价是每个门静态就要消耗几个毫瓦,输入低电平时还要往外灌0.4mA左右的电流,一片芯片十几个门,整板功耗和发热都上去了。CD4000系列电压范围最宽,能到十五六伏,抗干扰好,但速度慢,传输延迟在百纳秒量级,用它做动态实验会很难受。

对比维度74HC(CMOS)74LS(TTL)CD4000(CMOS)
供电电压2V–6V,常用5V固定5V3V–15V
输入悬空后果电平不确定,可能振荡发热默认被拉高电平不确定
静态功耗近乎为零每门数毫瓦近乎为零
输出驱动能力约±4mA(保证电平)约±8mA约±1mA
传输延迟(5V)十纳秒量级十纳秒量级百纳秒量级
适合场景通用实验、低功耗需要强驱动、快速高压、慢速、抗干扰

注意:混用系列要小心。74LS的输出高电平典型只有3.4V左右,勉强能过74HC在5V下的输入高门限(约0.7倍电源,即3.5V),处在临界状态,温度一变就可能误判。真要在同一块板上混,让74LS驱动74HC时中间加个10k上拉电阻,把高电平顶到5V。

选型这件事没有绝对对错,只有匹配。做课程实验、想反复改接线,74HC是最省心的;要做需要灌电流的显示驱动,74LS的输出能力确实更强;要在十几伏环境下工作,那就只能上CD4000。关键是先想清楚你的实验目标是什么,别让器件特性变成排查故障时的干扰项。

1.3 面包板、实验箱、仿真三者的分工

这三样东西经常被人对立起来讨论,其实它们解决的是不同阶段的问题。逻辑仿真软件(哪怕是最简单的开关加灯那种)解决的是“逻辑对不对”,你可以在十分钟内把真值表两的八行全跑一遍,确认表达式没化简错;面包板解决的是“电气上能不能跑”,它会毫不留情地暴露你悬空的输入、忘记的去耦、接触不良的跳线;实验箱解决的是“稳定性和可重复性”,芯片座固定、走线短、有现成的拨码开关和LED,适合做最终演示和记录数据。

我的实际流程是:先在纸上手推真值表和卡诺图,再用仿真软件跑一遍穷举验证,确认逻辑无误后上面包板,最后如果要写报告拍照片,再挪到实验箱上重搭一次。有人觉得这是重复劳动,但实测下来,这套流程反而最省时间——因为在面包板上排查“逻辑错误”是最费劲的,信号一多你根本分不清是表达式错了还是线虚了。把逻辑验证和电气验证分开做,问题定位会清晰很多。

面包板有个必须知道的物理特性:每列五个孔是连通的,中间沟槽把左右两半分隔开,两侧的电源轨在整条板上通常是连通的,但便宜的面包板经常在中间断开,需要你自己用短线把两段电源轨短接起来。这个细节坑过太多人——左半边芯片工作正常,右半边芯片死活不上电,量电压才发现电源轨不通。

2. 硬件地基:74HC的电气特性与接线规矩

2.1 电源、地与去耦电容的落位

74HC是CMOS器件,它的输入级是一对互补的MOS管,栅极本质上是一个几皮法的小电容。这个结构决定了它在静态时几乎不耗电,但在电平翻转的瞬间会产生一个不小的瞬态电流尖峰,用来给栅极电容充放电。如果电源走线有电感(面包板的弹簧片和杜邦线都是),这个尖峰会在芯片的电源脚上激起电压波动,轻则输出抖动,重则误触发。

解决办法就是去耦电容:每一片74HC的VCC和GND之间并一只0.1μF的陶瓷电容,物理位置尽量靠近芯片的电源脚,引线越短越好。别小看这一只几分钱的电容,它是整块板子稳定性的第一道防线。我习惯在电源入口处再并一只10μF的电解电容,用来吸收整板的低频波动,两者分工明确:0.1μF管高频尖峰,10μF管低频跌落。

接线顺序上有个小讲究:先把所有芯片的VCC和GND接好,通电,用万用表逐片量VCC脚对GND的电压,确认都在4.9V以上再开始接信号线。这个动作只要两分钟,但能挡掉后面一大半“莫名其妙不工作”的情况。我遇到过一片芯片因为GND脚虚接,量电源脚电压只有2.3V,输出全部处于中间电平,LED微微发亮,看起来像是驱动能力不足,实际上是接地没做好。

提示:74HC的供电范围是2V到6V,超过6V会直接击穿。用可调电源做实验时,先把电压调到5V、限流设到200mA再接入电路,能避免接反极性时烧掉一整排芯片。

2.2 悬空输入为什么必须处理

这一条是CMOS实验里最重要、也最容易被忽略的规矩:任何一个输入脚都不能悬空。原因在于CMOS输入的阻抗极高,输入电容上积累的电荷没有泄放路径,电位会停在一个不确定的值上,甚至停在电源电压的一半附近。这个位置恰好是互补对管同时导通的区域,芯片会从“几乎不耗电”瞬间变成“持续大电流”,摸上去明显发热,长时间还可能损坏。

更麻烦的是,悬空输入造成的不确定电平会被后面的门电路放大。你可能会看到一个输出LED在没有任何输入变化的情况下随机闪烁,或者用手靠近电路板它就变了状态——这种“灵异现象”九成以上是悬空输入在作祟。

处理办法很简单,但要彻底:所有未使用的输入脚,要么直接接VCC,要么直接接GND,二选一,不能留。有些场合不方便直接接电源,可以加一只10kΩ的上拉或下拉电阻,把电平钉死,同时不影响正常驱动。但要注意,未使用的输入不要图省事全部并在一起只接一个电阻,那样会在多个输入之间形成耦合通路,虽然大多数低速实验看不出问题,但属于不良习惯。

对于74HC138这类带多个使能端的芯片,尤其要留意:G1是高有效、G2A和G2B是低有效,三个使能端必须全部满足条件芯片才工作。做级联实验时,经常只接了其中两个,第三个悬空,结果整片芯片“没反应”,查半天以为芯片坏了。

2.3 扇出、延迟与负载的估算

“一个输出能带几个输入”这个问题,教科书上的答案和实际动手时的答案并不完全一样。从直流角度看,74HC输入的漏电流在微安甚至纳安量级,输出能提供的电流是毫安级,理论上一个输出可以带非常多的同类输入。但实际约束来自两个方面:一是容性负载,二是延迟累积。

面包板的相邻孔之间有2pF到5pF的寄生电容,一根十几厘米的杜邦线大概有几十皮法,示波器探头又是10pF到15pF。当输出驱动一大堆并联输入时,等效电容可能达到上百皮法,输出级的上升沿会被明显拉长。粗略估算,上升时间约等于输出阻抗乘以负载电容,74HC在5V下的输出阻抗大约几百欧,配上100pF,上升时间就接近几十纳秒,跟门本身的延迟是一个量级了。这时候如果后级对边沿敏感,就可能出问题。

工程上的经验值是:同一块面包板上,一个74HC输出带十个以内的同类输入基本不会出岔子;超过这个数,或者要把信号引出到另一块板子,就该考虑加一级缓冲(用74HC04或74HC244这类缓冲器),或者干脆把信号重新驱动一遍。

延迟方面,74HC门电路在5V下的传输延迟典型值在十纳秒量级,一片74HC138大概二十纳秒上下,74HC283四位加法器从输入到进位的延迟也在这个范围。这些数字单看很小,但级联起来就要算总账:四片74HC283串成16位加法器,最坏情况下进位要穿过四片,总延迟可能到七八十纳秒,这时如果后级是用边沿触发的电路去采样,就必须等够建立时间。

2.4 面包板布线的六条硬规矩

布线这件小事,直接决定你后面是花十分钟还是花三小时排错。我给自己定了几条不破的规矩,执行下来故障率明显下降。

第一条,信号线尽量短、尽量直,能横平竖直就别绕圈。绕长的线既是天线又是电容,容易拾取干扰。

第二条,电源线和信号线分开走,颜色区分。我固定用红色走VCC、黑色走GND、黄色和绿色走信号,这样一眼扫过去就能看出哪根线接错了,不用逐根追。

第三条,信号线不要跨过芯片本体,尤其是不要从芯片上方飞过去。跨过芯片的线容易被芯片引脚勾住,也容易在插拔时断开。

第四条,插拔任何芯片、改任何接线之前,先断电。带电插拔74HC是最常见的“芯片突然坏了”的原因,浪涌电流会击穿输入级。

第五条,每接完一个功能块就通电量一次,别等全部接完再上电。全部接完再上电,一旦不工作,你面对的是几十根线的可能性;分块验证,每次只需要怀疑新接的那几根。

第六条,不用的面包板孔不要插一截长线上去。悬空的导线就是一根天线,它会把周围的干扰耦合进电路,虽然多数时候不致命,但在做高阻节点(比如比较器输入、CMOS输入)时会制造麻烦。

3. 用小规模门电路搭出第一个可用功能

3.1 从真值表到最简表达式的完整手算流程

这一步看着简单,实际是最容易出错的地方,我把自己的固定流程写出来。拿到一句文字需求,第一步永远是列真值表,把输入变量的所有组合穷举出来,一行一行填输出,别跳步。三人表决这个例子,输入是A、B、C,输出Y表示“多数同意”,八行里只有三行是两个及以上为1,那就是011、101、110、111这四行输出为1(含全1)。

第二步画卡诺图。三变量卡诺图八格,按格雷码排布,横轴AB取00、01、11、10,纵轴C取0、1。把真值表里的1填进去,然后圈相邻的1。三人表决圈出来三个两格圈,分别覆盖AB、AC、BC,得到Y = AB + AC + BC。这一步不用追求“圈得最少”,先用最直观的圈法得到一个正确结果,后面再优化。

第三步是关键的一步:把与或式转成与非-与非式。因为我们手上只有74HC00这一种与非门,而74HC00一片只有四个门。转换的依据是德摩根定律,两次取反:Y = AB + AC + BC = ( (AB)' · (AC)' · (BC)' )'。也就是说,用三个与非门分别对三个乘积取反,再用第四个与非门把三个反相信号“与非”起来,正好四个门,一片74HC00搞定。

这个推导过程值得多念几遍,因为它就是“用有限种类门实现任意逻辑”的核心套路:任何与或式都能转成两级与非结构,第一级做乘积反相,第二级做求和反相。一旦你把这个转换变成肌肉记忆,看到任何需求都能立刻估算出需要几片芯片。

实操心得:手推完表达式别急着接线,先在仿真软件里把八行全跑一遍。这一步只要五分钟,但能拦住绝大多数化简错误。我吃过一次亏,卡诺图圈的时候把相邻关系看错了,化简出一个多一项的表达式,接上面包板后八行里错了三行,回头查了四十分钟才发现是纸上的错。

3.2 用74HC00搭半加器和全加器

半加器是最适合做第一次实战的功能块。它要输出和位S和进位C,真值表只有四行:S = A⊕B,C = AB。问题来了,异或用纯与非门实现需要四个门(经典结构:两个与非门做交叉耦合,两个做输出缓冲),加上进位那一个与非门,总共五个,一片74HC00不够。

这时候有两个选择。选择一是上两片74HC00,多花一片芯片;选择二是换成74HC86(四2输入异或门)加一片74HC08(四2输入与门),或者干脆用74HC86的异或门加一个与非门做进位。我的建议是第二种,因为它顺带教了你一课:选型的本质是权衡,当纯与非实现的门数超过一片芯片的容量时,专用的异或芯片就是更优解,它的内部已经帮你把这四个门做好了。

全加器则是两个半加器级联再加一个或门:第一级半加器处理A和B,得到中间和S1和进位C1;第二级把S1和Cin相加,得到和S和进位C2;最后C1和C2相或得到最终进位。用74HC86和74HC08各一片,再加一个74HC32(四2输入或门),三片芯片可以做一位全加器。这时候你再看74HC283——一片就能做四位带进位的加法,引脚还整齐,就会由衷地理解中规模芯片存在的意义。

这个对比不是白做的,它就是第三层思维的起点:当你用门电路搭一个功能要三片芯片、二十根线的时候,问问自己有没有现成的中规模芯片能一片搞定。有,就用它。

3.3 74HC86的三种实用用法

74HC86是一片四2输入异或门,看着功能单一,实际用途很活。第一种用法是可控反相器:把一个输入接控制信号K,另一个接数据D,输出Y = D⊕K。当K=0时Y=D,信号原样通过;当K=1时Y=D',信号被取反。这个结构在需要“按需取反”的场合非常好用,比如做原码补码转换的末级。

第二种用法是奇偶校验。多个信号级联异或,输出为1表示输入中1的个数是奇数,为0表示偶数。做四变量校验,用三个异或门串起来就行,输出就是一个奇偶校验位。这个结构在数据传输验证里很常见,用在实验里也很有说服力。

第三种用法是比较相等。A⊕B为0当且仅当A=B,所以对两个多位数的每一位分别异或,再用或非门把所有结果“或非”起来,输出为1就表示两个数相等。这就是74HC85这类比较器的基本原理,你自己用门搭一遍,再去看数据手册里比较器的内部框图,会发现一眼就懂了。

这三种用法的共同点是:它们都把异或门从一个“算术元件”还原成了一个“受控反相结构”,这个视角的转换其实挺有价值。异或门的所有花样玩法,本质都是在玩“控制位决定反不反相”这一个机制。

3.4 竞争冒险:毛刺是怎么被示波器抓到的

逻辑上成立,电路上不一定成立,这是组合逻辑最反直觉的地方。典型例子是Y = A + A',布尔代数告诉你它恒等于1,但实际电路里A走的是两条路径,一条经过门、另一条可能经过反相器,两条路径延迟不同。当A从0跳变到1的瞬间,反相器的输出还没来得及变低,会出现一个极窄的时间窗,两个输入同时为0,于是输出端掉下来一个尖峰,宽度等于反相器的延迟,大概十来纳秒。

这个尖峰叫毛刺,也叫冒险。它在慢速电路里几乎无害,因为后级不敏感;但如果后级接的是边沿触发的电路,这个毛刺就可能被当成一个有效跳变,导致系统状态错乱。

实测毛刺有讲究。用普通示波器的边沿触发,很难抓到随机出现的窄脉冲,因为触发点一直在变。我的做法是把示波器设成单次触发模式,触发电平设在正常高电平下方一点,然后反复拨动输入开关,总有一次能撞上。探头要用地弹簧(或者把探头的接地夹换成短弹簧),长接地线本身就是一个天线,会把周围干扰耦合进来,看到的波形根本分不清是电路本身的毛刺还是测量引入的噪声。

消除毛刺有几种办法。一是在卡诺图上增加冗余圈,把相邻的两个圈重叠一格,这个重叠项在布尔代数上是多余的(一致律),但物理上它挡住了切换时的瞬态路径,这是最干净的做法。二是输出端并一只几十皮法的电容,把窄脉冲滤掉,代价是牺牲了边沿速度,只适合对速度不敏感的场合。三是根本不去消除,而是在输出后面加一级触发器,等信号稳定后再采样,这是同步设计的基本思想。

注意:做竞争冒险实验时,如果什么都没看到,先别怀疑理论。检查一下输入信号是不是用了拨码开关——机械开关的抖动会掩盖十几纳秒的毛刺。这时候得用信号发生器给方波,或者用两个相位差可控的信号源。

4. 中规模芯片的验证套路

4.1 74HC138:低有效输出的读法与级联

74HC138是3线-8线译码器,三个地址输入A0、A1、A2,八个输出Y0到Y7,一个高有效使能G1,两个低有效使能G2A、G2B。这片芯片最反直觉的地方是输出低有效:地址选中哪一路,哪一路输出低电平,其余七路都是高。很多人第一次用,按真值表对着量,发现“选中”的那一路是0V,还以为芯片坏了。

读真值表时要养成一个习惯:先在脑子里把它翻译成“哪一个输出是低”。这样后面组合逻辑设计时才不会搞反极性。比如用它实现最小项之和,每个输出Yi对应最小项mi的非,所以要把几个输出“与”起来得到和项的正常形式,就必须用与非门——因为输入是反的,与非之后正好反反得正。

级联成4线-16线译码器是经典的进阶练习。做法是把高位地址A3接到两个138的G2A(一个直接接,一个经反相器接),两个芯片的A0到A2并联接低三位地址,G1接高、G2B接地。这样A3=0时左边一片工作,A3=1时右边一片工作,两个芯片的输出合起来就是十六路。这里面有个细节:不工作的那一片,输出全部是高电平,不会干扰总线,这正是低有效输出的好处——多路输出可以直接并接,谁拉低谁说话。

提示:74HC138的使能端经常被用来做地址扩展或者片选。设计的时候要明确,三个使能端是“与”的关系,全部满足才工作。如果你的电路里有一路信号是“低有效”,接G2A或G2B;如果是“高有效”,接G1,别接错。

4.2 74HC151:用一个多路选择器实现任意组合逻辑

74HC151是8选1数据选择器,三个选择端A、B、C,八个数据端D0到D7,一个低有效使能S,输出Y和它的反相W。它最实用的一个技巧叫“用MUX实现任意组合逻辑”,这个方法一旦掌握,很多看起来要用一堆门才能做的功能,一片芯片就解决了。

基本原理是这样的:把n个输入变量中的n-1个接到选择端,剩下的那一个变量接到数据端。为什么可以这样?因为函数对最后一个变量的依赖只有两种可能:要么这个变量取0时输出某个值、取1时输出另一个值,要么它与这个变量无关(输出恒0或恒1)。所以数据端只需要接四种东西之一:常量0、常量1、这个变量本身、这个变量的反相。八选一的数据端只有八个,正好够覆盖三个变量接选择端时剩下那个变量的所有情况。

三人表决用这个方法做,就是把A、B、C三个变量全部接到选择端(A接A0,B接A1,C接A2),然后按真值表把八个数据端直接接死:D0=D1=D2=D4=0,D3=D5=D6=D7=1。使能端S接地,输出Y就是表决结果。整个实现不需要任何门电路,一片74HC151加上八根接电源或地的短跳线,干净利落。

这个方法的代价是“浪费”——一个八选一的选择器实现一个只需要四个最小项的函数,看起来大材小用。但从实验角度看,它极大地降低了接线复杂度和出错概率,而且让你真正理解了MUX的本质:它就是一个用地址查表的硬件真值表。当你做更复杂的函数,比如四变量、五变量,这个方法的优势会更明显——四变量用一个八选一加一个反相器就能做,五变量也只要两片级联,远比用门去堆简洁。

4.3 74HC283:四位加法器的级联与进位延迟

74HC283是四位二进制全加器,A1到A4和B1到B4是两个操作数,C0是进位输入,S1到S4是和输出,C4是进位输出。位权上A1是最低位,A4是最高位,接线时很容易搞反,一旦接反,算出来的和会是一堆看似随机的数字,非常迷惑人。

级联成八位加法器很直接:低四位的C4接高四位的C0,两个芯片的对应位接好,输出按位拼起来。这里有个细节值得算一算:进位是串行传递的,低位的进位要经过一级芯片才能影响高位的结果。一片74HC283内部虽然有部分超前进位逻辑,但从C0到C4的延迟仍有十几纳秒。四片级联做16位加法器,最坏情况下进位要穿过四片的进位链,总延迟几十纳秒,这意味着如果你给输入一个变化,输出的稳定结果要等这么久才出来。

这个延迟在做静态显示实验时完全无感,但在做动态扫描或者需要高频运算的场合就必须考虑。解决办法有两种:一是并行进位,用额外的与门或门搭超前进位逻辑,提前算出每一位的进位;二是流水线,中间插入寄存器,把长进位链切开。这两种思路在后面的时序电路课程里会反复出现,现在先埋个种子。

用74HC283配合74HC85(四位数值比较器)和74HC151,其实已经能拼出一个简陋的ALU雏形:加法、比较、选择输出。我强烈建议做完基础实验后,把这个小系统搭一遍,它会让你对“计算机是怎么算数的”这件事有非常具体的感受,比看十页教科书都管用。

4.4 三种实现方式的横向对比

同一个功能用不同方式实现,到底差在哪?我拿三人表决器做了一次完整对比,数据来自实际接线和测量,不是纸上推演。

实现方式使用芯片接线根数(约)修改难度信号延迟适合场景
纯门电路(74HC00)1片12根低,改一处即可两级门,约20ns教学演示、理解原理
译码器+与非门(74HC138+74HC20)2片18根中,要改输出组合两级,约30ns需要多路输出的场合
数据选择器(74HC151)1片14根极低,改数据端即可一级,约15ns快速验证、函数复杂时

从这张表能看出几个反直觉的结论。第一,芯片数量和接线数量不是正相关的,译码器方案虽然只多一片,但因为要把四个输出引到与非门上,线反而最多。第二,数据选择器方案的修改成本最低,因为函数的变化只体现在八个数据端的0/1分布上,改一根跳线就行,不用动整体结构。第三,门电路方案的延迟不一定最优,因为两级与非的累积延迟未必比一片专用MUX短。

这也解释了为什么实际工程里,简单逻辑用门、复杂逻辑用MUX或者可编程器件,而译码器更多是用在地址译码这种“一路选中一路”的场合,而不是用来做通用组合逻辑。

5. 完整项目:三人表决器加数码管显示

5.1 需求拆解与方案对比

把前面所有零件拼成一个完整项目,需求是这样的:三个输入代表三个人投的赞成票,输出两路结果,一路是LED指示“是否通过”(两人及以上赞成即通过),另一路是数码管显示实际赞成票数(0到3)。这个需求把组合逻辑、中规模芯片、显示驱动三块都覆盖到了,是个非常合适的收官项目。

拆解下来是三个子功能。第一个是多数判定,用前面讲的任意一种方式实现。第二个是票数统计,本质是三个一位二进制数相加,用一片74HC283就能做:把A、B、C分别接到三个加数输入端,其余输入接地,输出就是0到3的二进制。第三个是显示,74HC283输出的是四位二进制(这里只用到低两位),需要转成七段码驱动数码管。

方案对比的焦点在第二个和第三个功能的衔接上。一种做法是票数用门电路自己搭一个两级加法(先A+B,再+C),但这样至少要用两片芯片,接线复杂;另一种做法是直接用74HC283,一片搞定,代价是四位加法器只用了两位,浪费。我选后者,理由很实在:接线越少,出错概率越低,而且74HC283的引脚排布规整,插在面包板上一眼就能看明白。

5.2 用74HC138加与非门实现多数判定

先接线。74HC138的A0、A1、A2分别接三个投票开关(每个开关配上10k下拉电阻,开关闭合时接VCC,断开时被拉低——这个下拉电阻不能省,否则开关断开时输入就是悬空状态)。G1接VCC,G2A和G2B接GND,三个使能端全部满足,芯片常开工作。八个输出里,Y3、Y5、Y6、Y7对应四个“通过”的最小项,这四个输出都是低有效。

接下来用一片74HC20(双4输入与非门)做合并。把Y3、Y5、Y6、Y7接到第一个与非门的四个输入,输出就是我们要的结果。这个逻辑值得推一遍:不通过的时候(比如输入000),Y3、Y5、Y6、Y7全部是高,四个高进与非门,输出低;通过的时候(比如011),对应的Y3是低,其余是高,与非门有一个输入为低,输出就是高。所以输出端直接给出高有效的“通过”信号,正好可以经限流电阻点亮LED。

这里有一个容易混淆的点:很多人一看“与非门”,就以为输出是反的,想再加一级反相。实际上因为138的输出本身是低有效,两次反相正好抵消,直接用就行。这个“反反得正”的思考过程,是组合逻辑设计里非常典型的一步。

LED的限流电阻要算一下。假设用红色LED,正向压降约1.9V,希望电流4mA(这个电流下74HC输出还能保证电平,同时亮度够用),供电5V,那么R = (5 - 1.9 - 0.1) / 0.004 = 750Ω,取标称值680Ω或1kΩ都可以。680Ω时电流约4.4mA,1kΩ时约3mA,都在合理范围。不要用220Ω这种小电阻,算下来电流十几毫安,虽然LED很亮,但74HC的输出会跌出保证电平的范围,还可能因为总电流超限导致整片芯片发热。

5.3 用74HC151实现同一功能

同样的多数判定,换一片74HC151。三个开关接A、B、C三个选择端,使能端S接地,八个数据端按真值表接死:D0、D1、D2、D4接GND,D3、D5、D6、D7接VCC。输出Y就是表决结果。

这个方案的接线体验和上一个完全不同。138方案里你要盯着八个输出找四个,还要把它们引到另一片芯片上;151方案里你只需要在八个数据端里填0和1,接完就完事,没有任何交叉。实测下来,151方案的接线时间大约是138方案的三分之二,而且几乎不会出错。

但151方案也有它的短板:如果你想同时输出“通过”和“不通过”两个信号,138方案里可以直接从Y0、Y1、Y2、Y4再取一组信号(虽然要再加一个与非门),而151只有一个Y和一个W,W正好是Y的反相,反而更方便。所以说方案优劣要看具体需求,不能一概而论。

实操心得:面包板上接八个数据端的时候,不要八根线都拉到电源轨上,那样线会缠成一团。我的做法是用两根短的“母线”分别沿芯片两侧走,一根接VCC一根接GND,数据端就近往上或往下插一根短线,看起来整齐,改起来也方便,一根线拔掉换个位置就行。

5.4 七段译码与限流电阻的完整计算

票数统计用74HC283:A1、A2、A3接三个投票开关,B端和C0全部接地,S1和S2就是票数的两位二进制(00到11)。这里有个细节,74HC283的输出S1是最低位,S2是次低位,接到译码器时位序不能反。

译码用74HC47(BCD到七段译码驱动器,输出高电平有效),它的输入端A、B、C、D中A是最低位,正好和74HC283的S1、S2对应,高位C、D接地。输出a到g对应七个段,接共阴极数码管。注意极性:74HC47输出高有效,配共阴极数码管;如果手上只有共阳数码管,就得用74HC48(输出低有效),或者加七路反相器,前者显然更省事。

限流电阻的计算是这一步的核心。共阴极数码管的每一段都是独立的LED,必须每段串一只电阻,不能只在整个数码管的公共端串一只——因为不同数字点亮的段数不同(显示1是两段,显示8是八段),公共端串一只电阻会导致显示1很亮、显示8很暗,这个现象非常明显。

具体数值:假设数码管每段红色LED压降1.8V,希望段电流3mA,74HC47输出高电平时内部有约0.3V压降,那么R = (5 - 1.8 - 0.3) / 0.003 = 966Ω,取标称值1kΩ。这时候看一个极端情况:显示数字8时八段全亮,总电流24mA,还在74HC47单芯片总电流承受范围内。如果取段电流5mA,八段全亮就是40mA,就接近很多芯片的总电流上限了,得考虑加三极管缓冲或者用专用驱动芯片。

显示数字点亮段数段电流3mA时总电流段电流5mA时总电流
0618mA30mA
126mA10mA
739mA15mA
8824mA40mA

从这张表能清楚看出为什么不能省限流电阻,也能看出为什么全亮的情况要单独核算。实际做实验时,如果发现显示8比显示1暗很多,八成就是电阻选小了或者公共端串了电阻。

6. 调试实录:故障速查与测量手法

6.1 静态测试与动态测试怎么分工

组合逻辑的验证分两步,顺序不能颠倒。静态测试是逐行给定输入组合,用万用表或者LED看输出电平,对照真值表一行一行核对。三个变量八行,四个变量十六行,虽然枯燥,但这是唯一能保证“穷举覆盖”的方法。很多人偷懒只测几行,结果恰好在没测的那几行里藏着接线错误,到演示时当场翻车。

静态测试要点是“一次只改一个输入”。如果同时拨两个开关,输出变了,你分不清是哪个输入的影响。我习惯按格雷码顺序拨:000、001、011、010、110、111、101、100,这样每次只有一个变量变化,观察起来最清楚,也顺便能发现竞争冒险导致的异常跳变。

动态测试是在输入快速变化时看输出行为,主要用来抓毛刺和测延迟。做法是用信号发生器给一路输入方波(频率从1kHz开始,逐步提高),其余输入固定,用示波器双通道同时看输入和输出,观察边沿的时间关系和是否有窄脉冲。频率提高到几百千赫兹时,面包板的寄生参数就开始显现了,输出波形会出现过冲和振铃,这时候不要慌,这是正常的传输线效应,低速逻辑电路不追求这个。

6.2 常见故障速查表

下面这张表是我这些年踩坑踩出来的,按“现象”索引,基本能覆盖九成的实验故障。

现象最可能的原因排查动作
全部输出恒为低或恒为高电源没接、GND虚接、芯片方向插反万用表量芯片VCC脚对GND电压,应在4.9V以上
单个输出无规律跳动输入悬空、附近有强干扰源查该门所有输入是否都有明确电平
输出电平处于中间值(2V左右)输入停在阈值区、芯片过载发热断开负载单独测,摸芯片是否发烫
部分芯片明显发热电源接反、输出短路、悬空输入导致直通立即断电,量VCC与GND之间电阻
级联后高位结果错进位线没接、位序接反单独测低位片,确认C4有正确进位输出
数码管显示乱码位序反、译码器极性错、段线错位用固定输入(如0001)测每一段是否对应正确
数码管某几段偏暗限流电阻过大、段线虚接量该段电压,短路电阻试亮度
拨开关时输出偶尔错一下开关抖动、竞争冒险换用信号发生器驱动,或用示波器抓毛刺
换了芯片就好了,过会儿又坏存在过流或过压,芯片在被反复损伤查限流电阻、查是否有5V直接灌入输出

这张表里最值得多说一句的是“芯片发热”。CMOS芯片在正常工作、没有负载的情况下应该是常温的,只要摸上去明显温热,就一定有异常。最常见的两种:一是某个输入悬空停在阈值区,内部对管同时导通;二是输出被强行拉到了相反的电源轨(比如输出高电平被外部短路到地),形成了大电流通路。这两种情况如果不及时断电,芯片基本就废了。

6.3 万用表、逻辑笔、示波器的使用要点

三种工具,各管一段,别指望一个搞定全部。

万用表测直流电压最准,但它有个陷阱:在CMOS高阻节点上,万用表的内阻(通常10MΩ)会把节点电位拉低,量出来是1.2V,你会以为信号有问题,实际上表笔一撤,节点就被上拉电阻拉回5V了。所以量高阻节点时,要意识到表笔本身在改变电路。

逻辑笔是判断高低电平的快手工具,阈值通常设在1.4V左右,高于就是高、低于就是低,中间闪烁表示脉冲。它的优点是快,一把抓起来就能点,缺点是不能告诉你具体电压,也看不出窄毛刺。做静态测试时,逻辑笔比万用表好用得多,尤其是要连续点十几个引脚的时候。

示波器是唯一的“真相工具”,能看波形、看边沿、看毛刺。但用示波器有两个坑:一是探头本身的电容(10pF到15pF)会加载到被测节点上,本来正常的电路可能因为探头接上去就变了行为,尤其在振荡器和高阻节点上;二是接地不良会引入大量假信号,看到一堆尖刺先别急着下结论,把探头的地线夹换成短的接地弹簧再测一遍。

注意:用示波器测74HC的输出,探头要打到10倍衰减档,1倍档的带宽只有几兆,看到的上升沿是假的(被探头自己滤平了)。10倍档配合示波器的20MHz带宽限制,是比较稳妥的组合。

7. 从面包板走向固化:验证清单与扩展方向

7.1 上板前的一份自检清单

在把面包板上的电路挪到实验箱、或者做成焊接板之前,我有一份固定的自检清单,逐条打勾,能挡掉绝大多数“换了地方就不工作”的情况。

第一条,所有芯片的电源和地都实测过电压,不是“我看到接了”。第二条,所有未使用的输入都有明确电平,没有悬空。第三条,每片芯片的电源脚旁都有0.1μF电容,且引线短。第四条,真值表的每一行都实测过,没有跳行。第五条,所有LED和数码管段都串了限流电阻,阻值算过不是估的。第六条,整板总电流测过一次,和预算值对得上(静态时应该在几十毫安以内)。第七条,所有接插件、开关、拨码开关都拨动过十次以上,确认没有接触不良。

这七条里,第六条最容易被忽略,也最能反映问题。如果静态电流比预算高出好几倍,说明有地方在偷偷导通电,通常就是悬空输入或者输出短路。

7.2 可以继续往下做的五个扩展实验

做完表决器和数码管,这套实验台其实还能撑起不少进阶内容,我列几个自己做过、难度递进的。

第一个是四位数值比较器,用74HC85搭一个“两个四位二进制数比大小”的电路,输出大于、等于、小于三路信号,配合LED显示。这个实验会让你对“级联时的级联输入”这个概念有体会,因为74HC85有专门的级联输入端口,多片串联时要处理这些端口的接法。

第二个是优先编码器,用74HC148做八路输入到三路二进制的编码,输出接数码管显示当前优先级最高的输入编号。这个实验的难点在于理解输入输出都是低有效,以及级联时的使能信号怎么传递。

第三个是代码转换器,比如把余三码转成8421BCD码,或者把格雷码转成二进制。这类实验的价值在于你会真正体会到“组合逻辑就是查表”,用74HC151或者74HC138加少量门都是很自然的实现方式。

第四个是简易ALU,把74HC283、74HC85、74HC151组合起来,用两三个开关选择运算类型,输出结果用数码管显示。这个系统不大,但它把前面所有零件都串起来了,做完之后你对“数据通路”这个概念会非常清楚。

第五个是用可编程逻辑器件替代整块面包板。把同样的表决器逻辑用硬件描述语言写一遍,烧到一块小规模的逻辑芯片上,对比一下接线量和修改成本。这个对比往往带来很强的冲击感——面包板上两天的活,代码里就是几行,改需求也只是改几行。但前提是你得先在面包板上做过一遍,否则你不知道那些代码在电气层面到底对应着什么。

8. 我个人在实际操作中的几点体会

搭了这么多遍组合逻辑电路,最后留下来最有用的其实是几个很朴素的习惯。接线前先在纸上把真值表写完整,别在脑子里推,脑子推的东西一接线就忘了;每接完一个功能块立刻通电验证,别攒着一起测,攒着测的调试时间通常是分块测的三倍以上;还有一个是给每根线做标记,用不同颜色的线区分电源、地、输入、输出,看起来是小事,但当你面对三十根线找不到故障点的时候,颜色就是你唯一的线索。

另外一句可能有点反常识的话:不要害怕用“大芯片”。很多新手觉得用74HC151实现三人表决是浪费,非要用一片74HC00才对得起观众。但实验的目的是把功能跑通、把原理吃透,不是做器件的最小化竞赛。用一片八选一实现一个四最小项的函数,你反而能更清楚地看到“组合逻辑就是一张查找表”这个本质,而用四个与非门去抠,你看到的只是门。先把功能做出来,再回头用门电路实现一遍做对比,两条路都走一遍,理解才是完整的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询