我从堪萨斯州的一份熔岩纸上得到了一段代码,这很管用。
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相匹配我做错什么了?
谢谢你的帮助
发布于 2015-02-24 04:57:53
问题是你把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)https://stackoverflow.com/questions/23512273
复制相似问题