joe 发表于 2021-8-18 09:47:57

chisel3中的寄存器---异步复位

最基本的时序电路元素是寄存器,寄存器是D触发器的集合,在fpga中一般用到四种触发器,
verilog代码中称之为寄存器reg变量,当然都是带有时钟使能的,只不过区分为是异步复位
还是同步复位:
FDPE 带时钟使能的异步置位寄存器(D Flip-Flop with Asynchronous Preset and Clock Enable)
FDCE 带时钟使能的异步复位寄存器
FDRE 带时钟使能的同步复位寄存器
FDSE 带时钟使能的同步置位寄存器
上述四种触发器,主要区别看第三个字符:
C:asynchronous clear 异步清除,清除表示复位为0
P: asynchronous preset 异步置位 置位表示置1
R:synchronous reset 同步复位,在同步中复位表示值为0
S:synchronous set 同步置位,在同步中置位表示值为1
在chisel <3.2.0中,所有的复位都是同步复位,如果想用异步复位寄存器则需要通过黑盒BlackBox。
从chisel 3.2.0开始支持同步和异步复位
class ResetTestModule extends RawModule {
val clk = IO(Input(Clock()))
val reset = IO(Input(Reset()))
val out = IO(Output(UInt(4.W)))
//MultiClock.scala中object withClockAndReset { def apply(clock:Clock,reset:Reset)(block: =>T):T=...}
//Creates a new Clock and Reset scope
//withClockAndReset返回值类型是后面的RegInit(0.U(4.W))即apply中的block的类型
val resetReg = withClockAndReset(clk,reset)(RegInit(0.U(4.W)))
resetReg := resetReg + 1.U
out := resetReg
}
上面代码中reset用Reset(),表示复位信号的类型需要自动推断,可以生成
同步复位也可以生成异步复位
比如,下面代码将复位强制转为异步复位:
class MyModule extends MultiIOModule{
        val io = IO(Output(....))
        //也是在MultiClock.scala中
        //object withClock{def apply(clock:Clock)(block: =>T):T=...}
        //Creates a new Clock scope
        withReset(reset.asAsyncReset()){ //reset是模块的默认复位信号,MultiIOModule抽象类中定义(默认时钟也是在里面定义的)
                //在本block块中的复位类型将是异步复位类型,超出block块则不是异步复位范围了
                val otherModule = Module(new OtherModule) //OtherModule是用户的其它模块代码,里面用到了时钟和复位信号
                otherModule.reset := Module.reset
                //其它代码。。。。
        }
        //超出withReset范围则还是原来的clock和reset
}


页: [1]
查看完整版本: chisel3中的寄存器---异步复位