Haskell / Kansas Lava移位寄存器错误

时间:2014-05-07 08:11:14

标签: 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')

现在我尝试在另一个功能中使用另一个功能,这不起作用。

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

现在我收到以下错误:

  • 无法将预期类型[Signal i0 Bool]与实际类型Signal clk0 a0(3x)
  • 匹配
  • 无法将预期类型Signal i0 Bool与实际类型[Signal i0 Bool]
  • 匹配
  • 无法将预期类型Signal i Bool -> Signal i Bool -> Signal i Bool与实际类型Signal i Bool
  • 匹配

我做错了什么?

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

问题是您将Signal clk [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

因此,通过压缩fieldIndrop (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)