2021.7.24—chisel vec部分的代码有更新,之前有点错误!!!
一、FIR Filter介绍现在假设我们需要实现一个FIR滤波器,其实就是实现以下功能:
class My4ElementFir(b0: Int, b1: Int, b2: Int, b3: Int) extends Module {
val io = IO(new Bundle {
val in = Input(UInt(8.W))
val out = Output(UInt(8.W))
})
val x_n1 = RegNext(io.in, 0.U)
val x_n2 = RegNext(x_n1, 0.U)
val x_n3 = RegNext(x_n2, 0.U)
io.out := io.in * b0.U(8.W) + x_n1 * b1.U(8.W) +
x_n2 * b2.U(8.W) + x_n3 * b3.U(8.W)
}
可以看到,当系数数量固定时,我们只需要简单的定义几个寄存器,然后按照公式计算出输出即可。这种写法很直观,也比较简单,但是前提是必须知道系数的个数,否则并不知道定义几个寄存器。
三、系数个数不固定的写法(使用集合或Vec)当系数个数不固定的时候,我们就需要使用scala的集合或者chisel的Vec来实现以上功能。此时在代码逻辑上就比原来稍微复杂了一丢丢,但其实只要实现数据在集合或者Vec中移位即可。
- 使用scala的集合
class MyManyElementFir(consts: Seq[UInt], bitWidth: Int) extends Module {
val io = IO(new Bundle {
val in = Input(UInt(bitWidth.W))
val out = Output(UInt(bitWidth.W))
})
val regs = mutable.ArrayBuffer[UInt]()
for(i
关注
打赏