我从堪萨斯州的熔岩纸上得到了一段代码,这是可行的。
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
通过压缩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)