1

我从堪萨斯熔岩纸上得到了一段代码,它有效。

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

我做错了什么?

谢谢您的帮助

4

1 回答 1

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)
于 2015-02-24T04:57:53.330 回答