您当前的位置: 首页 > 

耐心的小黑

暂无认证

  • 0浏览

    0关注

    323博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

chisel Vec/集合及其高阶函数使用(以FIR滤波器为例)

耐心的小黑 发布时间:2021-06-28 14:37:50 ,浏览量:0

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             
关注
打赏
1640088279
查看更多评论
0.0380s