4

我在这里有一个约克熔岩函数,我想在堪萨斯熔岩中重写。但它不想工作,我不知道我应该这样做。有人可以帮我吗?

{-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]

现在我试图在堪萨斯熔岩中写这个,它们是一个延迟函数,但我得到了奇怪的结果。下面的代码生成了我,其参数与第一个示例相同:

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'   
4

1 回答 1

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

Lava 模拟器的这个输出意味着第一个输出是high在第一个循环中,并且没有模拟器输入来告诉更多的值。类似地,第二个输出在第一个循环和high第二个循环中是未定义的;并且第三个输出在两个周期和high第三个周期中未定义。

这很有意义,因为在第一个周期中第二个输出没有设置为任何值:延迟的输入信号还没有时间到达那里。

结果与 York Lava 不同的原因是 York Lava 的delay原语似乎需要在第一个时钟周期之前使用一个额外的值。不过,我不确定这是可合成的。

于 2015-02-24T03:54:44.660 回答