Преобразование функции York Lava в Kansas Lava

У меня есть функция 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'   

person Daan Mouha    schedule 09.05.2014    source источник
comment
Можете ли вы быть немного более конкретным о том, каким должен быть правильный вывод?   -  person Robert Harvey    schedule 09.05.2014
comment
n означает, насколько большим будет список. inp — это вход в low или high. Выход — это inp ++ n умножить на низкие значения out = [inp, low, low, low, ..., n] Пример: n = 2 вход = высокий выход = [высокий, низкий] Второй пример: n = 5 вход = низкий выход = [низкий, низкий, низкий, низкий, низкий]   -  person Daan Mouha    schedule 09.05.2014
comment
(1) Вы уверены, что последний фрагмент соответствует ошибке, которую вы вставили над ним? Я не понимаю, как специализация i на CLK приведет к Couldn't match expected type '[Signal i0 Bool]' with actual type 'Signal clk0 a0'. (2) Какой тип выведет GHC(i) для sipo, если вы на мгновение удалите подпись?   -  person duplode    schedule 09.05.2014
comment
Хорошо, я забыл что-то добавить в свой код в комментарии, чтобы эта ошибка не применялась к этому фрагменту кода. Но я не получаю правильный вывод   -  person Daan Mouha    schedule 11.05.2014


Ответы (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

Этот вывод симулятора Lava означает, что первый вывод равен high в первом цикле, и нет ввода симулятора, чтобы сообщить дальнейшие значения. Точно так же второй выход не определен в первом цикле и high во втором; и третий выход не определен для двух циклов и high в третьем.

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

Причина, по которой результат отличается от York Lava, заключается в том, что примитив York Lava delay, по-видимому, принимает дополнительное значение, которое будет использоваться перед первым тактовым циклом. Хотя я не уверен, что это можно синтезировать.

person Cactus    schedule 24.02.2015