Haskell/Kansas 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无法匹配

我做错了什么?

Thanks for the help

问题是你混淆了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)

最新更新