二进制译码、one-hot 和优先级编码器有何区别?
更新时间:2026-09-21。问题驱动短答页。仲裁见 round-robin 仲裁、FIFO/仲裁基础、onehot round-robin,RTL 结构见 case vs if-else。
一句话回答
这三者解决不同问题:二进制译码器(decoder)把一个 n 位二进制值“展开”成 2ⁿ 根选择线,同一时刻只有对应那一根有效,常用于寄存器/存储器地址译码;one-hot(独热)是一种“用 2ⁿ 位、恰好一位为 1 来表示 2ⁿ 个状态/编号”的编码,判断当前状态只需看一根线、组合逻辑简单速度快、每次翻转位数少,但要的触发器/线多;优先级编码器(priority encoder)面对可能同时有效的多个输入,按预设优先级(通常编号最高/最低)只输出最高优先那个的二进制编号,并常带一个“有有效请求”标志,典型用于中断控制器和总线仲裁。面积上 one-hot 随状态数线性多用寄存器、二进制译码扇出指数增长,优先级编码器则是一条与时序强相关的链式逻辑。
对照
| 电路 | 输入→输出 | 同时多有效 | 典型用途 |
|---|---|---|---|
| 二进制译码器 | n 位 → 2ⁿ 根线 | 输入本就是唯一编号 | 地址/片选译码 |
| one-hot 编码 | 2ⁿ 状态 ↔ 2ⁿ 位(1 位有效) | 设计上保证唯一 | FSM 状态、mux 选择 |
| 优先级编码器 | 2ⁿ 根请求 → n 位编号+valid | 允许,取最高优先 | 中断、仲裁 |
与 RTL 写法的对应
- 译码器:
case (addr) ...或assign sel = 1'sb1 << addr(按地址独热展开)。 - one-hot FSM:每个状态一个触发器,跳转只操作少数位;状态多、分支判定简单时速度快,见 FSM 设计。
- 优先级编码器:天然是 if-else if 链/
priority case,请求越多链越长,见 case vs if-else;要公平可在前面加 round-robin 预处理,见 round-robin。
面积/速度/功耗取舍
- 二进制译码:门数随 n 近似 2ⁿ 增长,大地址译码扇出大,靠使能分级。
- one-hot:状态寄存器数 = 状态数(比二进制编码多用触发器),但次态和输出逻辑简单,速度高、毛刺少、动态翻转功耗低,适合 FPGA(LUT+FF 丰富)和大状态机。
- 优先级编码:逻辑紧凑但串行链延迟随输入数增长,高速宽输入要改成并行前缀或分级仲裁。
- 低功耗场景 one-hot 因每拍翻转线少常更省电,见 低功耗方法。
常见坑
- 以为 one-hot 一定省面积:它省组合逻辑却费触发器。
- one-hot 状态机没有“非法状态恢复”,进入多 1/全 0 态后死机,见 健壮 FSM。
- 把优先级编码器写成并行 case,丢掉中断优先级语义。
- 宽优先级链不做流水/分级,关键路径违例,见 关键路径。
总结
译码器把 n 位二进制展开为 2ⁿ 根唯一生效的选择线做地址/片选,one-hot 用 2ⁿ 位中恰一位有效来表示状态、判定简单速度快翻转少但费寄存器,优先级编码器则在多个同时请求中按优先级输出最高者的二进制编号加 valid、服务中断与仲裁;选择时 one-hot 重 FF 轻组合适合大 FSM/FPGA,二进制译码扇出随指数增长需分级,优先级编码器是时序敏感的串行链,宽带宽下要并行化。