Преобразование функции Йорк Лава в Канзас Лава
У меня здесь есть функция Йорк Лава, которую я хочу переписать в Канзас Лаве. Но он не хочет работать, и я не знаю, должен ли я это делать на самом деле. Может кто-нибудь помочь мне с этим, пожалуйста?
{-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
Примитив, кажется, принимает дополнительное значение, которое будет использоваться перед первым тактовым циклом. Я не уверен, что это синтезируемый, хотя.