编码器
PriorityEncoder
PriorityEncoder 是 Chisel 中一个用于优先编码的函数。它接受一个布尔向量,返回其优先级最高(即索引最小)的高位的索引值。其常见用法包括处理多路选择器、优先级调度等场景。
点击查看代码
import chisel3._
import chisel3.util._
class PriorityEncoderExample extends Module {
val io = IO(new Bundle {
val in = Input(UInt(8.W)) // 8位输入
val out = Output(UInt(3.W)) // 输出优先级编码的索引
})
io.out := PriorityEncoder(io.in)
}
- 输入 io.in = "b00100100".U 时:
- PriorityEncoder 返回值是 2(因为第 2 位的 1 是优先级最高的高位)。
PriorityEncoderOH
PriorityEncoderOH 是 Chisel 提供的一个优先编码器的变体,与 PriorityEncoder 类似,但输出的是 One-Hot 编码。这意味着输出的结果中只有一个位是 1,表示输入向量中优先级最高的高位,而其他位为 0。
点击查看代码
import chisel3._
import chisel3.util._
class PriorityEncoderOHExample extends Module {
val io = IO(new Bundle {
val in = Input(UInt(8.W)) // 8 位输入
val out = Output(UInt(8.W)) // 输出 One-Hot 编码
})
io.out := PriorityEncoderOH(io.in)
}
输入和输出示例如下:
- 输入 io.in = "b00100100".U 时:
- PriorityEncoderOH 返回 0b00000100.U(表示索引 2)。
- 输入 io.in = "b00000000".U 时:
- 返回 0b00000000.U(没有优先级高的位)。
仲裁器
Arbiter
Arbiter 是 Chisel 中一个用于仲裁多个请求(requests)的模块。它会根据指定的优先级(默认为固定优先级)选择一个请求,将其授予(grant),同时输出该请求对应的数据。Arbiter 的常见用途是资源共享场景,例如多个模块竞争一个总线或处理器的访问权。
Arbiter 的工作原理
输入仲裁:
- 根据优先级选择一个有效请求(valid 为真)。
- 默认优先级是固定的,从编号 0 开始,编号越小优先级越高。
输出: - 输出被授予的请求数据到 io.out.bits。
- 将授予的请求编号输出到 io.chosen。
示例代码:
点击查看代码
import chisel3._
import chisel3.util._
class ArbiterExample extends Module {
val io = IO(new Bundle {
val reqs = Input(Vec(4, DecoupledIO(UInt(8.W)))) // 4 个输入请求
val grant = Output(DecoupledIO(UInt(8.W))) // 输出授予的请求
val chosen = Output(UInt(2.W)) // 授予请求的索引
})
val arbiter = Module(new Arbiter(UInt(8.W), 4)) // 4 路仲裁器
// 连接输入请求到 Arbiter
arbiter.io.in <> io.reqs
// 连接 Arbiter 输出
io.grant <> arbiter.io.out
io.chosen := arbiter.io.chosen
}
- 如果输入请求为:
点击查看代码
reqs(0).valid = true, reqs(0).bits = 42
reqs(1).valid = false
reqs(2).valid = true, reqs(2).bits = 100
reqs(3).valid = true, reqs(3).bits = 7
则:
- 输出 grant.bits = 42(优先级最高的请求是第 0 路)。
- 输出 chosen = 0。