尧图精选

编码器与译码器:数字电路中的“翻译官”原理与应用解析

🕒 发布时间:2026/9/6 11:47:16 📁 来源:尧图网络
1. 先从“翻译官”说起为什么编码器和译码器总是成对出现学数字电路的人几乎绕不开编码器Encoder和译码器Decoder。很多人一开始学的时候容易把它们当成两个孤立的功能模块背真值表、画逻辑图、做习题但学完之后脑子里还是散的——不知道这东西到底用在哪也不知道为什么教材非要把它们放在一起讲。我个人的理解是编码器和译码器本质上就是数字世界里的“翻译官”和“反翻译官”。编码器负责把人能理解的信息比如按键编号、十进制数字翻译成机器能处理的二进制代码译码器则反过来把二进制代码翻译回人能理解或者电路能直接驱动的信号形式。如果把数字系统比作一个快递分拣中心编码器就是“收件员”——把每个包裹贴上条形码译码器就是“派件员”——扫条形码把包裹送到对应的货口。两边一进一出整个系统才能跑起来。这篇内容不打算只贴真值表和逻辑图我会把编码器、译码器的工作原理、分类、典型芯片、以及在实际项目里怎么选型、怎么接、怎么避坑一次讲清楚。不管是准备考试的学生还是刚接触数字电路设计的工程师都能在里面找到自己能用的东西。2. 编码器的核心逻辑从“人看的数字”到“机器看的代码”2.1 普通编码器的定义与工作过程先说最基础的。编码器做的事情可以用一句话概括在某一时刻多个输入里只允许一个有效输出对应的二进制编码。假设我们有 8 个输入I0 到 I7对应十进制数字 0 到 7输出是 3 位二进制代码Y2 Y1 Y0。按下 I3输出就是 011按下 I5输出就是 101。这就是典型的 8-3 线编码器。用真值表来表达就是输入输出 Y2 Y1 Y0I0 有效000I1 有效001I2 有效010I3 有效011I4 有效100I5 有效101I6 有效110I7 有效111从这张表里可以推出输出逻辑表达式Y2 I4 I5 I6 I7Y1 I2 I3 I6 I7Y0 I1 I3 I5 I7根据这个表达式就可以用或门搭建出编码器电路。思路很简单记住一个口诀“看输出找输入谁在这个输出位上是 1就把谁或进来”。我在给学生讲的时候常用一个类比这就好比全班同学投票选代表每个输出位是一个“票仓”凡是希望这位代表当选的同学都要把票投进来。2.2 优先编码器解决“多个输入同时有效”的麻烦普通编码器有一个硬伤它假设同一时刻只有一路输入有效。但在真实的场景里这个假设几乎不成立。比如键盘矩阵扫描的时候用户可能手一抖同时按下了两个键传感器报警系统里可能同时来了两路告警。如果没有特殊处理输出就会乱掉。优先编码器就是专门解决这个问题的。它的规则是当多个输入同时有效时只对优先级最高的那个输入进行编码。优先级从设计之初就定死常见做法是编号大的优先。拿 74LS148 举例这是一颗非常经典的 8-3 线优先编码器芯片。它总共有 16 个引脚除了电源和地主要的功能引脚包括8 个输入I0 ~ I7低电平有效即输入为 0 时表示有信号3 个输出Y2 ~ Y0低电平有效选通输入端 EI低电平有效选通输出端 EO优先编码输出端 GS这里有个特别容易搞混的点这些引脚名称上带撇号或者名字带“非”的都是低电平有效。也就是说你给 EI 接低电平芯片才工作输入 I7 为低电平表示第 7 路有请求。实际使用时EI 使能端不接低电平芯片输出全是高电平整个编码器等于“罢工”。我遇到过不少刚接触的同学把 EI 悬空结果测试时怎么都不出数据查了半天发现是使能端没拉低。数字电路里悬空引脚是最大的坑之一尤其是这种控制引脚一定要按手册里的推荐接法接死。74LS148 的优先级逻辑是这样的I7 优先级最高I0 优先级最低。当 EI 0 时芯片处于正常工作状态如果没有任何输入有效所有输入都为 1则 GS 输出高电平EO 输出低电平只要有任意一个输入有效GS 就输出低电平表示“有编码请求”。2.3 键盘扫描里编码器怎么用的说了这么多理论举一个实际例子。假设你在做一个 8 按键的输入面板每个按键对应一个功能。用普通 IO 口一个一个读8 个按键就要占 8 个 IO太浪费了。用 74LS148 就可以把 8 个按键压缩成 3 根数据线 1 根状态线。按键一端接 GND另一端接芯片的输入引脚平时输入被上拉电阻拉高按键按下时拉低。这样每按下一个键芯片就输出对应的 3 位编码同时 GS 引脚拉低告诉你“有键被按下”。主控芯片只需要读 3 根数据线 1 根状态线就能确定哪个键被按下省下的 IO 可以用来接显示屏或者通信接口。这种方案有一个需要注意的地方如果两个键同时按下74LS148 会优先输出编号大的那个另外那个按键就会被“吃掉”。如果你的应用场景里需要同时识别多个按键比如游戏手柄的组合键那就不能用这种方案得改用矩阵键盘加逐行扫描的方式。3. 译码器的核心逻辑从二进制代码到“唯一的输出”3.1 译码器是编码器的“逆运算”如果说编码器是把信息压缩成二进制代码那译码器就是把这个过程反过来——把二进制代码还原成对应的、唯一的输出信号。以最常见的 3-8 译码器 74LS138 为例。它有 3 个地址输入C、B、A8 个输出Y0 ~ Y7。输入一个 3 位二进制数对应的那一路输出有效其他路全部无效。输入 C B A有效输出000Y0001Y1010Y2011Y3100Y4101Y5110Y6111Y774LS138 的输出是低电平有效所以“有效”的意思就是输出 0无效输出 1。这个细节特别容易在考试和笔试里丢分很多人习惯性地以为有效就是输出高电平但 74 系列里低电平有效的芯片非常常见一定要看数据手册确认而不是靠猜。74LS138 除了 3 个地址输入还有 3 个使能端G1高电平有效、G2A 和 G2B低电平有效。三个使能端全部满足条件芯片才工作。这个设计在实际电路里非常有用后面讲地址译码的时候还会专门提到。3.2 用“先确定行再确定列”理解二进制译码的本质二进制译码的原理用生活中的例子特别好解释你去电影院找座位票上写的是“3排5号”你只需要先找到第 3 排高位译码再找到第 5 号座位低位译码就能精准定位。3-8 译码器就是帮你完成“定位”的动作你给我一个“门牌号”我告诉你哪一盏灯亮。更准确地讲译码器内部做的事情是**“最小项生成”**。三个输入变量 C、B、A 一共能产生 8 个最小项每个最小项对应一种输入组合8 个输出各自对应一个最小项。比如 Y5 C · B · A也就是当 C1、B0、A1 时Y5 输出有效。这也是为什么译码器可以用来实现任意组合逻辑函数——任何一个逻辑函数都可以展开成最小项之和的形式只要把对应的译码器输出接出来再通过一个或门或者与非门就可以实现。这在早期的可编程逻辑器件比如 PLA、PAL中是很核心的思想。3.3 为什么3-8译码器能构成更大的译码器很多同学学完 3-8 译码器之后会遇到一个扩展问题我想做一个 4-16 译码器怎么办答案是用两片 3-8 译码器。方法是把 4 位输入的最高位D作为片选信号当 D0 时第一片译码器工作输出对应低 8 路当 D1 时第二片译码器工作输出对应高 8 路。具体接法是把两片的地址输入 A、B、C 并联第一片的 G1 接 D通过反相器第二片的 G1 直接接 D两片的 G2A 和 G2B 都接地。这样设计的关键在于任意一个时刻只有一片译码器处于工作状态另一片被禁止。被禁止的那片输出全是高电平不会干扰工作片的输出。如果需要把两片输出接到同一组线上只需要在外面加一组与非门做线或逻辑即可。这种“片选”思路不仅在译码器扩展里用在存储器扩展、外设总线扩展里也是通用的套路。学会 3-8 译码器的扩展方法后面看单片机地址空间分配会轻松很多。4. 进阶应用用译码器实现地址空间分配4.1 从“芯片选择”看懂译码器的工程项目意义译码器在数字系统里最重要的应用之一就是地址译码。这个概念对只学过理论、没做过系统设计的初学者来说可能有点抽象但只要经历过一次“给外设分配地址”的过程就会彻底明白。想象这样一个场景你的单片机有 64KB 地址空间也就是 16 根地址线 A0~A15。现在你要接两片存储器芯片每片 32KB各占一半空间。怎么让单片机知道访问地址 0x0000~0x7FFF 时选中第一片访问 0x8000~0xFFFF 时选中第二片答案就是用 A15 这根最高位地址线做译码。A150 时选中第一片A151 时选中第二片。如果只有两根片选线这么接就够了但如果外设更多比如八片 8KB 的芯片就需要用 74LS138 这样的 3-8 译码器把 A15、A14、A13 三根地址线译码成 8 路片选信号分别接到 8 片芯片的片选引脚上。4.2 这样做的好处是什么这种设计最大的好处是地址空间可以被精确地切成若干个大小相等的块每块对应一个外设互不冲突。举个例子。用 74LS138 做一个译码电路输入接 A15、A14、A13输出 Y0~Y7 分别接八片 8KB 芯片的片选端。那么Y0 对应地址范围0x0000 ~ 0x3FFFY1 对应地址范围0x4000 ~ 0x7FFFY2 对应地址范围0x8000 ~ 0xBFFFY3 对应地址范围0xC000 ~ 0xFFFF这样单片机访问某个地址时只有对应的那一片芯片被选中其余芯片的数据线都处于高阻态不会“打架”。如果你做过总线扩展应该能体会这种“地址译码”方案的优雅之处用 3 根线管理 8 个设备代价只是加一片几毛钱的 74LS138。4.3 实操怎么计算地址范围和译码关系自己动手设计地址译码时最关键的步骤是画出地址位分配表。我通常这样做先确定总地址线数量比如 16 根。确定每片外设需要的地址范围比如 8KB 2^13占用低 13 位地址线 A0~A12。确定片选译码需要用的高地址线16 - 13 3 根即 A15、A14、A13。把外设编号和译码器输出对应起来第 0 片接 Y0第 1 片接 Y1依此类推。写出每片外设的地址范围片 0 为 0000 0000 0000 0000 ~ 0001 1111 1111 1111即 0x0000~0x1FFF片 1 为 0010 0000 0000 0000 ~ 0011 1111 1111 1111即 0x2000~0x3FFF依此类推。整个过程说白了就是用高地址位做“区域选择”低地址位做“区域内偏移”。这和门牌号的逻辑一模一样前面几位代表街道后面几位代表门牌号。在实际工程中还要注意一个问题如果某些地址位没有参与译码比如只用 A15、A14不用 A13那么同一块物理地址会出现“镜像”——同一个外设会在多个地址范围被访问到。这在设计阶段不是大问题但如果后续要调试会带来一些困惑。所以建议要么把所有未用的高位地址线都参与译码要么统一接固定电平避免地址重叠。5. 编码器和译码器的延伸形态显示译码与优先级管理5.1 七段显示译码器让数字“看得见”除了二进制译码器工程上还有一种译码器极为常用那就是七段显示译码器。它的作用是把 4 位 BCD 码二进制编码的十进制数转换成七段数码管各段的亮灭控制信号。典型芯片是 74LS47共阳数码管用和 74LS48共阴数码管用。两者的逻辑功能相同但输出极性相反接错数码管类型会导致数码管完全不亮或者显示乱码。选型之前一定要先确认你的数码管是共阳还是共阴——这个方法很简单用万用表二极管档测一下公共脚和段脚之间的导通方向就能判断。七段译码器的内部逻辑其实不复杂。7 个输出段 a~g每一个都是一个逻辑函数输入是 4 位 BCD 码 D3 D2 D1 D0。比如 a 段最上面那一横在显示数字 0、2、3、5、6、7、8、9 时需要点亮a D3 D2 D1 D0 D3 D2 D1 D0 D3 D2 D1 D0 D3 D2 D1 D0 D3 D2 D1 D0 D3 D2 D1 D0 D3 D2 D1 D0 D3 D2 D1 D0这个表达式看起来很吓人但实际上就是“列出所有需要点亮 a 段的输入组合然后逐项相加”。真值表才是七段译码器设计的基础表达式只是从真值表里整理出来的产物。实际工程中除非你要做芯片内部的逻辑设计否则直接用 74LS48 就好不用自己去搭门电路。但理解这个过程很重要因为面试和考试经常从这里出题而且也能帮助你理解“组合逻辑设计”的基本套路列出真值表 → 写出表达式 → 化简 → 画电路。5.2 编码器 vs 译码器一张表看懂区别学完两者的基础之后很多人还是会混淆。我用一张表把它们的核心区别列出来维度编码器译码器方向多输入 → 少输出少输入 → 多输出典型规模8-3 线、10-4 线3-8 线、4-16 线输入含义多个信号中一个有效一组二进制代码输出含义对应二进制编码唯一有效的输出线典型芯片74LS148、74LS14774LS138、74LS154关键词压缩、编码、优先恢复、选择、片选打个比方编码器是“把 8 个按钮的信息压缩进 3 根线”译码器是“把 3 根线的信息展开成 8 个灯”。一个是漏斗收紧一个是漏斗放开。5.3 优先编码器在中断系统里的应用优先编码器的应用不止键盘扫描。在单片机的中断控制器里经常有多个中断源同时请求的情况CPU 需要知道先处理哪一个。这个时候优先编码器就派上用场了。以 8259A 可编程中断控制器为例它内部就有类似于优先编码器的逻辑多路中断请求输入经过优先级判决后输出当前最高优先级中断的编号。这个编号就是 CPU 可以直接识别的中断向量号的一部分。虽然 8259A 内部实现比 74LS148 复杂得多还涉及到嵌套、屏蔽等功能但底层的“多路输入 → 优先判决 → 编码输出”思路是完全一致的。如果你手头有逻辑分析仪可以试着把一个 74LS148 的输出接到单片机的中断引脚上模拟多路中断源同时触发的场景观察输出编码的切换过程。这个实验做一次比背十遍真值表都管用。6. 实战基于 74LS138 的 8 路 LED 流水灯控制器6.1 项目需求与电路设计理论讲再多不动手都是空的。这里分享一个我常用来带新人的小项目用 74LS138 驱动 8 路 LED实现流水灯效果。项目需求8 个 LED 依次点亮每次只有 1 个亮循环往复。电路连接方式是74LS138 的地址输入 A、B、C 接单片机的三个 IO 口PA0、PA1、PA2。使能端 G1 接高电平G2A 和 G2B 接地。输出 Y0 ~ Y7 各串联一个 330Ω 限流电阻接到 LED 的阴极。LED 的阳极统一接 VCC5V。这里要注意74LS138 输出低电平有效。所以 LED 是“阴极接输出、阳极接电源”的接法。当某一输出引脚拉低时对应的 LED 两端有电压差就会点亮。如果你把 LED 极性接反会发现所有灯都不亮——这个错误我见过太多次了。6.2 软件控制逻辑单片机的代码逻辑非常直接从 0 到 7 循环把数字写到 PA0~PA2 这三个引脚上。比如 STM32 的 GPIO 操作代码大概长这样uint8_t led_index 0; while (1) { // 假设 PA0、PA1、PA2 对应 A、B、C 输入 GPIOA-ODR (GPIOA-ODR ~(0x07 0)) | (led_index 0x07); led_index (led_index 1) 0x07; HAL_Delay(200); // 200ms 间隔 }这段代码的核心思路是把 led_index 的低 3 位映射到 PA0~PA2。led_index 从 0 变到 774LS138 的输出就从 Y0 切换到 Y7对应的 LED 依次点亮。用 3 根 IO 控制 8 个 LED这种“IO 扩展”的思路在很多嵌入式项目里都会用到。比如矩阵按键扫描、数码管位选、多路模拟开关选择等都是同一个套路。6.3 调试过程中最容易踩的坑这个项目看着简单但实际调试时容易出问题的地方不少列几个我踩过的使能端悬空G1、G2A、G2B 任何一个没有正确接好输出全都不正常。用万用表量一下这几个引脚的电压很快就能定位。地址线顺序接反A、B、C 三根线和 PA0、PA1、PA2 的对应关系如果不对LED 的亮灯顺序会乱掉。调试的时候用二进制数 0、1、2、3... 依次写入对比实际亮灯顺序就能发现是哪根线接反了。上电瞬间的随机状态单片机 IO 口上电瞬间可能输出不确定电平导致 74LS138 的输入短暂处于非预期状态。如果对安全性有要求可以在程序初始化时先设置好 GPIO 输出值再配置为输出模式或者在外面加上下拉电阻。7. 编码器与译码器的工程选型建议7.1 常用芯片速查做实际项目时选对芯片能节省大量时间。我整理了几颗常用芯片的关键参数和适用场景芯片型号功能逻辑特点典型应用74LS1488-3 优先编码器低电平有效输入/输出键盘扫描、中断优先判决74LS14710-4 优先编码器BCD 输出十进制按键编码74LS1383-8 译码器低电平有效输出地址译码、片选74LS1544-16 译码器低电平有效输出大规模地址译码、多路选择74LS47BCD-七段译码器低电平有效输出共阳数码管显示74LS48BCD-七段译码器高电平有效输出共阴数码管显示除了 74LS 系列现在做嵌入式项目更常见的是用 CPLD 或 FPGA 在内部实现编码器和译码器功能。两者的应用场景不太一样74 系列适合低速、简单、成本敏感的场景CPLD/FPGA 适合需要灵活配置、多路并行处理、复杂逻辑的场景。7.2 速度、电平与驱动能力选型的时候除了功能匹配还要关注三个参数传播延时74LS 系列典型延时在 10~30ns 级别高速系统要考虑时序是否满足。电平标准74LS 系列是 TTL 电平高电平最小 2.0V低电平最大 0.8V。如果用 3.3V 的单片机直接驱动要注意电平兼容问题。有些 3.3V 器件输出高电平只有 2.4V 左右可能达不到 TTL 的输入高电平阈值解决办法是换用 74HC 系列CMOS 电平或者加电平转换芯片。驱动能力74LS138 单个输出的灌电流约为 8mA驱动一个 LED限流电阻 330Ω电流大约 8mA刚好够但如果要驱动继电器、蜂鸣器这类电流较大的负载必须加三极管或 MOSFET 驱动不能直接接。7.3 工业现场里的编码器别和“旋转编码器”搞混这里要特别提醒一句“编码器”这个词在工业自动化领域通常指旋转编码器Rotary Encoder而不是数字电路里讲的编码器芯片。旋转编码器是一种把旋转位移转换成电信号的传感器分增量式和绝对式两种。增量式输出 A、B 两相正交脉冲用来测转速和方向绝对式输出一组二进制码或者 SSI 协议的数据用来读取绝对位置。很多做嵌入式的人第一次搜“编码器”资料时会搜到一堆和“旋转编码器”相关的内容反而把数字电路里的编码器芯片搞糊涂了。两者的关系不大一个是逻辑功能模块一个是物理传感器。理解这一点可以避免查资料时走弯路。如果你做的是电机控制那“编码器”大概率指的是旋转编码器选型时候关注的是分辨率PPR、输出方式推挽、集电极开路、差分线驱动和机械接口。这和本文讲的 74LS148 完全是两个方向。8. 把编码器和译码器用活的几个小经验最后分享几个我在实际项目里积累的经验权当是给后来者的一点参考。第一先画框图再查手册。不要一上来就翻真值表。先把整个系统的数据流向画清楚谁是输入、谁是输出、中间经过哪些模块、哪些信号需要转换。编码器和译码器只是数据通路上的一环想要设计合理必须从系统层面看问题。第二能组合就不串接。有些同学为了节省 IO喜欢把多个编码器串起来用。这当然可以实现但传播延时会累积而且故障排查难度成倍上升。如果不是资源真的非常紧张尽量用一颗规模更大的译码器比如 74LS154 替代两片 74LS138系统的可靠性会好很多。第三手工焊接和调试时准备一颗备用芯片。74LS 系列芯片很便宜但静电和过流很容易损坏。我在实验室见过不少“芯片时好时坏”的怪故障最后排查下来都是芯片内部已经损伤。换一颗新片子问题立刻消失。所以调试前先确认电源电压没接反、输出引脚没有直接短路再插电测试。第四不要忽略电源去耦。数字芯片在工作时电源引脚上的电流是动态变化的。如果不在芯片的电源引脚旁边放一颗 0.1uF 的陶瓷电容尽量靠近芯片放置高速开关时会产生电源噪声严重时会影响系统稳定性。这个习惯从做最小系统板的第一天就要养成。编码器和译码器虽然是最基础的数字电路模块但它们背后涉及的思想——编码、解码、优先级、片选、最小项——几乎是整个数字系统设计的缩影。把这两个模块吃透后面学存储器的地址扩展、总线的仲裁逻辑、可编程逻辑器件的工作原理都会觉得顺理成章很多。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →