risc-v中文社区

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

[原创] chisel3中的寄存器---异步复位

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2021-8-18 09:47:57 | 显示全部楼层 |阅读模式
最基本的时序电路元素是寄存器,寄存器是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[T](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[T](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
}


回复

使用道具 举报

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

本版积分规则



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

GMT+8, 2024-5-4 18:48 , Processed in 0.014197 second(s), 17 queries .

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

Copyright © 2018-2021, risc-v open source

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