Chisel Tutorial(九)——狀態單元
阿新 • • 發佈:2018-12-25
以下內容依據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))