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]
    与实际类型
    信号clk0 a0
    (3x)匹配
  • 无法将预期类型
    信号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)