共计 1404 个字符,预计需要花费 4 分钟才能阅读完成。
从现实需求理解优先编码器
最近在用 STM32 做项目时遇到一个头疼的问题:当多个外部中断同时触发时,如何确保最重要的中断优先响应?这就像急诊室的分诊系统,心跳骤停的病人必须比普通感冒患者优先处理。这种场景正是优先编码器 (Priority Encoder) 大显身手的地方。

芯片选型:74HC148 vs CD4532
实验室常见的两款优先编码器芯片值得对比:
- 工作电压:74HC148 是 5V 供电,CD4532 支持 3 -18V 宽电压,更适合现代低功耗设计
- 响应速度:74HC148 传播延迟约 20ns,CD4532 约 120ns,前者适合高速场景
- 扩展性:CD4532 自带级联输出端(Enable Out),多片级联时布线更简洁
核心原理拆解
真值表背后的逻辑
CD4532 的 8 - 3 线编码真值表看似复杂,其实规律明显:
| 输入 D7-D0 | 输出 Q2-Q0 |
|---|---|
| 1XXXXXXX | 111 |
| 01XXXXXX | 110 |
| … | … |
| 00000001 | 001 |
| 00000000 | 000 |
用逻辑表达式表示就是:
Q2 = D7 + D6 + D5 + D4
Q1 = D7 + D6 + ~D5~D4(D3 + D2)
Q0 = D7 + ~D6(D5 + ~D4D3 + ~D4~D2D1)
级联扩展实战
当需要处理 16 个优先级信号时,可以这样级联:
+---------+ +---------+
D15-D8--| CD4532 | | CD4532 |--D7-D0
| EO |-------| EI |
+---------+ +---------+
高位片的 Enable Out 连接低位片的 Enable In,形成优先级链。
Verilog 建模与仿真
行为级模型
module CD4532 (input [7:0] D,
input EI, // Enable Input
output reg [2:0] Q,
output EO, GS
);
always @(*) begin
if (!EI) {Q,GS,EO} = 5'b000_0_1;
else casex(D)
8'b1XXXXXXX: {Q,GS,EO} = 5'b111_1_0;
8'b01XXXXXX: {Q,GS,EO} = 5'b110_1_0;
// ... 其他情况省略...
default: {Q,GS,EO} = 5'b000_0_1;
endcase
end
endmodule
测试用例
initial begin
EI = 0; #10; // 测试禁用状态
EI = 1; D = 8'b00010000; #10; // 测试 D4 触发
D = 8'b00100000; #10; // 测试优先级覆盖
$finish;
end
工程实践要点
信号防抖动设计
机械开关输入时需要 RC 滤波,时间常数计算:
τ = R×C > 抖动持续时间(通常 5 -20ms)
例如:R=10kΩ, C=1μF → τ=10ms
时序约束
特别注意输出使能 (OE) 的建立时间:
- OE 有效到输出稳定至少需要 120ns(CD4532 最大延迟)
- 级联系统中,前级 EO 到下级 EI 需增加缓冲器减小延迟
竞争冒险应对
当输入信号变化不同步时可能产生毛刺,解决方案:
- 关键路径插入 D 触发器同步
- 输出端并联 0.1μF 电容
- 采用格雷码编码降低跳变概率
思考题:电梯优先级系统
假设 8 层电梯需要处理同时发生的呼叫信号,其中:
- 消防信号最高优先级
- 高层 (5-8F) 比低层 (1-4F) 优先
- 同方向请求优先于反向请求
如何用 CD4532 配合逻辑门实现?提示:需要两级编码器分别处理楼层和方向信号。
通过这个完整案例,相信大家对优先编码器有了更立体的认识。下次遇到多优先级任务处理时,不妨考虑这颗经典的 CD4532 芯片。
正文完
