Haskell/Kansas Lava移位寄存器错误
我从堪萨斯熔岩报上得到一段代码,这很有效Haskell/Kansas Lava移位寄存器错误,haskell,hdl,lava,Haskell,Hdl,Lava,我从堪萨斯熔岩报上得到一段代码,这很有效 counter :: Signal CLK Bool -> Signal CLK Bool -> Signal CLK Int counter restart inc = loop where reg = register 0 loop reg' = mux restart (0, reg) loop = mux inc (reg' + 1, reg') 现在我试着在另一个函数中做同样的事情,用另一个函数,这不起
counter :: Signal CLK Bool -> Signal CLK Bool -> Signal CLK Int
counter restart inc = loop
where
reg = register 0 loop
reg' = mux restart (0, reg)
loop = mux inc (reg' + 1, reg')
现在我试着在另一个函数中做同样的事情,用另一个函数,这不起作用
shiftReg_d2f :: Signal CLK Bool -> Signal CLK Bool -> [Signal CLK Bool] -> [Signal CLK Bool] -> [Signal CLK Bool]
shiftReg_d2f load shift wordIn fieldIn = fieldOut
where
fieldOut = register 0 fieldOut''
shiftField = drop (length wordIn) fieldOut ++ wordIn
fieldOut' = muxl shift fieldOut shiftField
fieldOut'' = muxl load fieldOut' fieldIn
现在我得到以下错误:
- 无法将预期类型
与实际类型[信号i0 Bool]
(3x)匹配信号clk0 a0
- 无法将预期类型
与实际类型信号i0 Bool
[信号i0 Bool]
- 无法将预期类型
与实际类型信号i Bool->Signal i Bool->Signal i Bool
信号i Bool
感谢您的帮助问题是您将
信号时钟[a]
与[Signal clk a]
混淆了。前者在HDL设置中基本上是不可行的,因为它的宽度是无限的,并且可能随着周期的变化而变化
您可以做的是逐线定义fieldOut
。关键的洞察是给定的输入
fieldIn = [x0, x1, x2, x3]
wordIn = [w0, w1, w2]
fieldOut = [y0, y1, y2, y3]
您的输出需要是其中之一
if load: [x0, x1, x2, x3] = fieldIn
if shift: [y3, w0, w1, w2] = drop (lenght wordIn) fieldOut ++ wordIn
otherwise: [y0, y1, y2, y3] = fieldOut
因此,通过压缩fieldIn
和drop(length wordIn)fieldOut++wordIn
我们可以一点一点地生成它:
shiftReg_d2f :: Signal CLK Bool -> Signal CLK Bool -> [Signal CLK Bool] -> [Signal CLK Bool] -> [Signal CLK Bool]
shiftReg_d2f load shift wordIn fieldIn = fieldOut
where
fieldOut = zipWith toOutput fieldIn (drop (length wordIn) fieldOut ++ wordIn)
toOutput input shifted = r
where
r = register False $ mux load (mux shift (r, shifted), input)