Chisel Tutorial(九)——状态单元

来源:互联网 发布:超级基因优化液排雷 编辑:程序博客网 时间:2024/05/20 05:29


以下内容依据2015-7-10版的Chisel 2.2 Tutorial整理

Chisel支持的最简单的状态单元就是上升沿触发的寄存器,可以使用如下方式例化:

val reg = Reg(next = in)

上述代码形成的电路就是:将输入赋值给输出,但是输出比输入延后一个时钟周期。此处没有申明变量reg的数据类型,Chisel会自动从输入变量in推测reg的类型。在Chisel中,clockreset都是全局信号,不需要显示声明。

使用寄存器可以组成许多有用的电路,如下是一个上升沿检测电路的代码,输入是一个boolean变量,如果检测到上升沿,那么输出true

def risingedge(x: Bool) = x && !Reg(next = x)

如下是一个计数器的代码,计数到最大值,然后从0开始重新计数:

def counter(max: UInt) = {  val x = Reg(init = UInt(0, max.getWidth))  x := Mux(x === max, UInt(0), x + UInt(1))  x}

寄存器x初始值为0,宽度是max.getWidth,当全局信号reset有效的时候,x就被初始化为0。利用计数器可以搭建许多电路,如下是一个脉冲发生电路,每n个周期产生一个脉冲:

def pulse(n: UInt) = counter(n - UInt(1)) === UInt(0)

进一步,可以组成方波发生器,如下:

def toggle(p: Bool) = {  val x = Reg(init = Bool(true))  x := mux(p, !x, x)  x}def squareWave(period: UInt) = toggle(pulse(period/2)) 



0 0