天天看點

Chisel Tutorial(九)——狀态單元

以下内容依據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)) 
           

繼續閱讀