以下内容依据2015-7-10版的Chisel 2.2 Tutorial整理
Chisel支持的最简单的状态单元就是上升沿触发的寄存器,可以使用如下方式例化:
val reg = Reg(next = in)
上述代码形成的电路就是:将输入赋值给输出,但是输出比输入延后一个时钟周期。此处没有申明变量reg的数据类型,Chisel会自动从输入变量in推测reg的类型。在Chisel中,clock、reset都是全局信号,不需要显示声明。
使用寄存器可以组成许多有用的电路,如下是一个上升沿检测电路的代码,输入是一个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))