共计 1349 个字符,预计需要花费 4 分钟才能阅读完成。
从现实需求理解优先编码器
在 STM32 中断控制系统中,当多个中断源同时触发时,处理器需要根据优先级决定响应顺序。例如:

- 电源故障中断(最高优先级)
- 外部设备数据就绪中断(中优先级)
- 定时器溢出中断(低优先级)
传统轮询方式会浪费 CPU 资源,而优先编码器 (Priority Encoder) 能自动输出最高优先级输入的二进制编码,这正是 CD4532 的用武之地。
器件选型对比:74HC148 vs CD4532
两种常用 8 - 3 优先编码器关键差异:
- 工作电压范围
- 74HC148:2V~6V(典型 5V CMOS 电平)
-
CD4532:3V~18V(宽电压设计)
-
传播延迟
- 74HC148:约 15ns @5V
-
CD4532:约 200ns @10V(速度较慢但抗干扰强)
-
特殊功能
- CD4532 独有的 ”Group Select” 引脚支持无缝级联
- 74HC148 输出为反码,需额外反相器
核心原理与实现
真值表解析
| 输入 D7-D0 | EO | GS | 输出 A2-A0 |
|---|---|---|---|
| 1XXXXXXX | 0 | 1 | 111 |
| 01XXXXXX | 0 | 1 | 110 |
| … | … | … | … |
| 00000000 | 1 | 0 | 000 |
逻辑表达式:
A2 = D7 + D6 + D5 + D4
A1 = D7 + D6 + D3'D2'D1D0 + D3'D2D1'D0 + ...
GS = D7 + D6 + ... + D0
级联扩展方案
+---------+
| CD4532 |
D15-D8 -->| 高位芯片 |-- EO --> 低位芯片 EI
| |
A2-A0 <--| |-- GS --> 系统级标志
+---------+
Verilog 建模实例
module pri_encoder_8to3 (input [7:0] D,
input EI, // 输入使能
output reg [2:0] A,
output GS, // 组选择
output EO // 输出使能
);
always @(*) begin
if (!EI) {A, GS, EO} = 5'b000_0_1;
else casex(D)
8'b1XXXXXXX: A = 3'b111;
8'b01XXXXXX: A = 3'b110;
// ... 其他优先级
default: A = 3'b000;
endcase
end
assign GS = EI & (|D);
assign EO = EI & ~(|D);
endmodule
测试平台代码片段:
initial begin
EI = 0; D = 8'b00000000; #10;
EI = 1; D = 8'b00010000; #10; // 应输出 101
D = 8'b00101000; #10; // 应输出 110
$finish;
end
工程实践要点
输入防抖动设计
RC 时间常数计算公式:
τ = R*C > 抖动持续时间(典型 20ms)例如:R=10kΩ, C=2.2μF => τ=22ms
时序约束关键
- 输出使能 (E_O) 信号需在输入稳定后至少保持 50ns
- 级联时高位芯片的 EO 到低位芯片 EI 需加缓冲器
竞争冒险解决方案
- 输出端并联 0.1μF 电容
- 在 Verilog 中使用非阻塞赋值
always @(posedge clk) begin A <= ...; // 非阻塞赋值 end
扩展思考:电梯优先级系统设计
假设需求:
1. 8 层电梯,高层优先(7 层 >6 层 >…>0 层)
2. 同时呼叫时响应最高楼层
3. 紧急呼叫(如消防信号)可抢占
尝试思考:
– 如何用 CD4532 实现基础优先级编码?
– 紧急信号应接入哪个控制引脚?
– 级联方案如何支持多部电梯协同?
(提示:紧急信号可连接 EI 使能端实现强制中断)
正文完
发表至: 未分类
近两天内
