数字电路 第三章—第四节(编码器与译码器的核心原理与典型应用)
1. 编码器与译码器的基本概念想象一下你正在用摩斯电码发送求救信号短按代表点长按代表划。这个将信息转换为特定代码的过程就是编码而接收方将代码还原为原始信息的过程就是译码。在数字电路中编码器和译码器正是完成这种转换的核心组件。编码器Encoder的本质是一个信息压缩器。它接收多个输入信号通常是2^n个但同一时刻只允许一个有效输入然后输出对应的n位二进制编码。比如8线-3线编码器能将8个独立输入转换为3位二进制代码000到111。我在调试一个键盘电路时就遇到过典型应用每个按键按下时编码器会输出唯一的键值编码。译码器Decoder则正好相反是个信息解压器。它接收n位二进制输入在2^n个输出线中选择对应的一条置为有效。例如3线-8线译码器能把3位二进制数转换为8个输出信号中的一个。这就像快递分拣系统三位数的区域代码如101对应着8个出货口中的一个。它们最显著的区别在于编码器是多输入、少输出信息浓缩译码器是少输入、多输出信息展开实际项目中这两种器件常常配合使用。比如在早期计算机内存系统中CPU发出的地址信号先经过译码器选中特定内存芯片该芯片的数据再通过编码器传回CPU。这种配合能大幅减少所需线路数量——用10根地址线就能寻址1024个存储单元2^10。2. 编码器的核心原理与实现2.1 二进制编码器设计让我们以最基础的8线-3线编码器为例。其真值表如下输入(7-0)输出(Y2-Y0)0000000100000000010001000001000100000100001100010000100001000001010100000011010000000111通过观察真值表可以直接写出逻辑表达式Y2 I7 I6 I5 I4 Y1 I7 I6 I3 I2 Y0 I7 I5 I3 I1用Verilog实现的话代码非常直观module encoder_8to3( input [7:0] in, output reg [2:0] out ); always (*) begin casez(in) 8b00000001: out 3b000; 8b00000010: out 3b001; //...其他情况 8b10000000: out 3b111; default: out 3bxxx; endcase end endmodule2.2 优先编码器的进化普通编码器有个致命缺陷当多个输入同时有效时输出会混乱。这就催生了优先编码器——它会给输入分配优先级只响应最高优先级的输入。74HC148就是典型芯片其真值表特点是输入优先级从高到低排列。在FPGA项目中我曾用优先编码器处理中断请求。假设有四个中断源电源故障最高优先级通信超时传感器报警用户按键最低优先级对应的Verilog实现always (*) begin if(power_fault) irq_code 2b00; else if(timeout) irq_code 2b01; else if(sensor_alarm) irq_code 2b10; else if(button_press) irq_code 2b11; else irq_code 2b00; end3. 译码器的深度解析3.1 3线-8线译码器剖析这是最基础的译码器其真值表呈现完美的对称性输入(CBA)输出(Y7-Y0)0001111111000111111101010111110110111111011110011101111101110111111101011111111101111111逻辑表达式每个输出都对应一个最小项Y0 CBA Y1 CBA ... Y7 CBA在FPGA中实现时我更喜欢用位拼接方式module decoder_3to8( input [2:0] in, output reg [7:0] out ); always (*) begin out ~(1 in); // 将1左移in位后取反 end endmodule3.2 显示译码器的特殊之处七段数码管译码器是特殊的存在它需要将4位BCD码转换为7段驱动信号。不同之处在于输出不是独热码one-hot需要处理非常规输入1010-1111要考虑共阴/共阳接法我曾踩过一个坑忘记处理非常规输入导致显示乱码。正确的设计应该包含default分支case(bcd) 4d0: seg 7b1000000; // 0 //...0-9 default: seg 7b1111111; // 其他情况全灭 endcase4. 典型应用场景剖析4.1 内存地址译码在现代计算机中CPU的地址总线连接到译码器选中特定的内存模块。例如32位地址总线高4位用于片选16个内存模块低28位用于模块内寻址256MB空间这种层级译码大幅减少了选择线的数量。我在设计嵌入式系统时就用74HC138级联实现了对Flash、SDRAM和外围设备的选择。4.2 工业控制中的编码器旋转编码器是工业控制的常见部件它通过光电或磁电方式将机械转角转换为数字信号。增量式编码器输出两相脉冲通过相位差判断旋转方向绝对式编码器则直接输出位置代码类似我们讨论的数字编码器。在机器人关节控制项目中我曾用优先编码器处理多个限位开关信号。当机械臂接近极限位置时编码器会立即输出最高优先级报警代码触发急停机制。4.3 通信协议转换I2C扩展芯片PCA9548就是典型的译码器应用它通过3位地址选择8个I2C总线之一。而编码器则用于将多个从设备的中断请求编码后传给主控CPU。这种设计完美体现了编码器/译码器在减少线路数量方面的价值。