11 / 37 · 概念
编码器与优先级:从多个请求中选择一个
区分独热编码器的输入假设,以及优先编码器的 valid 与选择结果。
课时内容可免费阅读,选课后可保存学习进度。
译码器的反向操作也需要条件
译码器译码器 激活与二进制编码对应的输出线的电路。带 enable 时,可在禁用状态下将所有输出置 0。了解更多将地址转换成独热独热码 多个位中恰好只有一个为 1 的表示。若也允许全部为 0,则应称为 one-hot-or-zero。了解更多选择线;编码器将有效输入的位置转换成地址。但普通独热编码器假设只有一个输入激活。多个输入同时为 1 时,必须额外规定报告哪个位置。
对于四位请求 ,规定编号较大的请求优先。所有输入为 0 时,令 valid=0、index=00。只凭 index=00 判断没有请求,会与 r0 请求混淆。
| 输入 r3r2r1r0 | valid | index |
|---|---|---|
| 1--- | 1 | 11 |
| 01-- | 1 | 10 |
| 001- | 1 | 01 |
| 0001 | 1 | 00 |
| 0000 | 0 | 00 |
表中的 - 表示无论为 0 还是 1,结果都相同,并不是允许输入仿真中的 X。各模式从上到下相互排斥。
输入 1011 时,index=11。输入 0110 时,r2 优先于 r1,因此 index=10。
查看波形数据
| 信号 | 波形 | 总线值 |
|---|---|---|
| requests | 234523 | 0000 → 0001 → 0011 → 0110 → 1011 → 1000 |
| valid | 01.... | |
| index | 2.345. | 00 → 01 → 10 → 11 |
RTL 应明确表达优先级
always_comb begin
valid = |request;
index = 2'b00;
if (request[3]) index = 2'd3;
else if (request[2]) index = 2'd2;
else if (request[1]) index = 2'd1;
end只有 request[0] 为 1 时,保留默认 index=0,并令 valid=1。为所有路径提供默认值,避免组合电路产生记忆行为。检查全部 16 种输入,并确认 valid=1 时,所选位确实为 1,且所有更高位均为 0。
选择与公平性是不同问题
若 r3 一直为 1,r0 就一直无法被选中。此电路只实现固定优先级。若要公平处理请求,就需要记住上次选择的仲裁方式,此时便成为时序电路。
实验 · 同时观察请求、选择地址与 grant
r3r2r1r0=1011; valid=1; index=11; grant=1000. 编号越大,优先级越高。valid=0 时,index 不表示选中了请求。
初始请求 1011 会选中 r3。关闭 r3 后选中 r1,此时 index=01、grant=0010。只要 r1 保持为 1,切换 r0 就不应改变选择结果。
比较点击“全部关闭”与只打开 r0 的结果。两种情况的 index 都是 00,但 valid 和 grant 不同。若后级电路只读取 index,就可能处理根本不存在的请求。
仅将所选请求位置置 1 的 grant,是对 index 与 valid 再次译码的结果。
需验证三个不变式:grant 至多含一个 1;grant 为 1 的位置确有请求;编号高于所选位置的所有请求都为 0。本实验不会消费请求,也不记忆先前选择。r3 持续激活时低优先级请求一直等待,正是固定优先级的特性。
自己试试
分别写出请求 0101 和 0001 的 index、valid、grant。请求为 0000 时,为什么不能仅因 index=00 就处理 r0?
阅读解释
0101 对应 index=10、valid=1、grant=0100。0001 对应 index=00、valid=1、grant=0001。0000 时 index=00 只是默认值;由于 valid=0、grant=0000,没有需要处理的请求。