joe 发表于 2021-8-19 13:03:09

ShiftRegister类型寄存器

ShiftRegister也是在util包下,表示移位寄存器
def apply(in: T, n: Int, en: Bool = true.B): T = {
        // The order of tests reflects the expected use cases.
        if (n != 0) {
          RegEnable(apply(in, n-1, en), en) //递归调用applyin:T必须是硬件类型
        } else {
          in
        }
}
def apply(in: T, n: Int, resetData: T, en: Bool): T = {
        // The order of tests reflects the expected use cases.
        if (n != 0) { //in:T可以是chisel类型也可以是硬件类型,但肯定是硬件类型
          RegEnable(apply(in, n-1, resetData, en), resetData, en) //递归调用apply
        } else {
          in
        }
}
很明显,resetData表示当复位时本ShiftRegister寄存器的初值
其中,in:T 表示待移位的数据,n:Int 表示n个周期之后移位完成,
en:Bool表示,ShiftRegister使用例子:

从源码中可以看到,当给称位寄存器ShiftRegister传递in:T和init:T参数时,
可以从物理信号连接角度来想:
移位寄存器ShiftRegister,它的数据源可以是另一个硬件类型,比如Wire或Reg,IO/Input等,
既然是硬件类型,那么就不需要我们设置初始值了,可以想象初始值应该与传来的硬件类型的
值是一样的,如果我们非要赋一个初始值,那也不是不行,可以用第二个apply方法,
如果你传的是chisel类型,那么根据这个in:T类型进行自动推断(Bits则通过BITS推断,如果是
Element(如:Wire(UInt()),Wire(UInt(8.W)))则根据Element来推断,如果是Aggregate(如:
Bundle,Vec)则根据Aggregate来推断;如果传递的是硬件类型也是一样的推断,初始值则由init:T来传递。


页: [1]
查看完整版本: ShiftRegister类型寄存器