Преобразование функции Йорк Лава в Канзас Лава

У меня здесь есть функция Йорк Лава, которую я хочу переписать в Канзас Лаве. Но он не хочет работать, и я не знаю, должен ли я это делать на самом деле. Может кто-нибудь помочь мне с этим, пожалуйста?

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

1 ответ

Решение

Ваш код работает точно так, как ожидалось.

Испытание вашей функции в симуляторе от 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 в третьем.

Это имеет смысл, поскольку второй выход не настроен на что-либо в первом цикле: задержанный входной сигнал еще не успел туда попасть.

Причина, по которой результат отличается от Йорк Лава, в том, что Йорк Лава delay Примитив, кажется, принимает дополнительное значение, которое будет использоваться перед первым тактовым циклом. Я не уверен, что это синтезируемый, хотя.

Другие вопросы по тегам