我在这里有一个York Lava函数,我想在Kansas Lava中重写。但它不想工作,我不知道我应该这样做。 有人可以帮帮我吗?
{-Serial In - Parallel Out shiftregister. The serial bit is inserted at
the least significant bit position. The data is shifted LSB -> MSB
each and every clock cycle-}
sipo :: Int -- ^ The number of bits in the output word.
-> Bit -- ^ The input bit.
-> [Bit] -- ^ The output word.
sipo 1 inp = [inp]
sipo n inp = inp : rest
where
inp' = delay low inp
rest = sipo (n-1) inp'
上面这个函数给出了一些例子的正确结果:
n = 3
inp = high
out = [high, low, low]
n= 5
inp = high
out = [high, low, low, low, low]
现在我试图在Kansas Lava中写这个,它们是一个延迟功能,但我得到了奇怪的结果。 下面的代码生成我,使用与第一个示例相同的参数:
n = 3
inp = high
out = [high?, high., high!] (don't know what that means)
sipo :: (Clock clk)
=> Int -- ^ The number of bits in the output word.
-> Signal clk Bool -- ^ The input bit.
-> [Signal clk Bool] -- ^ The output word.
sipo 1 inp = [inp]
sipo n inp = inp : rest
where
inp' = delay inp
rest = sipo (n-1) inp'
答案 0 :(得分:2)
您的代码完全符合预期。
在GHCi的模拟器中试用你的功能,结果是:
*Main> sipo 3 (high :: Signal CLK Bool)
[high,? | high .,? | ? | high .]
阅读方式是:
sipo 3 high !! 0 = high
sipo 3 high !! 1 = ? | high
sipo 3 high !! 2 = ? | ? | high
熔岩模拟器的输出意味着第一个循环中的第一个输出为high
,并且没有模拟器输入来告知其他值。类似地,第二个输出在第一个周期中是未定义的,而在第二个周期中是high
;并且第三个输出未定义两个周期,第三个输出high
。
这很有道理,因为第二个输出在第一个周期中没有设置为任何东西:延迟输入信号还没有时间到达那里。
结果与York Lava不同的原因是York Lava的delay
原语似乎需要额外的值才能在第一个时钟周期之前使用。不过,我不确定它是否可以合成。