risc-v中文社区

 找回密码
 立即注册
查看: 1052|回复: 0

[原创] ShiftRegister类型寄存器

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2021-8-19 13:03:09 | 显示全部楼层 |阅读模式
ShiftRegister也是在util包下,表示移位寄存器
def apply[T <: Data](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) //递归调用apply  in:T必须是硬件类型
        } else {
          in
        }
}
def apply[T <: Data](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[T])则根据Aggregate来推断;如果传递的是硬件类型也是一样的推断,初始值则由init:T来传递。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-5-4 14:13 , Processed in 0.026181 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表