1. 程式人生 > >Chisel Tutorial(九)——狀態單元

Chisel Tutorial(九)——狀態單元

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