Ошибки регистра сдвига в Haskell/Kansas Lava

Я получил кусок кода из бумаги Канзас-Лава, которая работает.

counter :: Signal CLK Bool -> Signal CLK Bool -> Signal CLK Int
counter restart inc = loop
  where
    reg = register 0 loop
    reg' = mux restart (0, reg)
    loop = mux inc (reg' + 1, reg')

Теперь я попытался сделать то же самое в другой функции, с другой функциональностью, это не работает.

shiftReg_d2f :: Signal CLK Bool -> Signal CLK Bool -> [Signal CLK Bool] -> [Signal CLK Bool] -> [Signal CLK Bool]
shiftReg_d2f load shift wordIn fieldIn = fieldOut
  where
    fieldOut = register 0 fieldOut''
    shiftField = drop (length wordIn) fieldOut ++ wordIn
    fieldOut' = muxl shift fieldOut shiftField
    fieldOut'' = muxl load fieldOut' fieldIn

Теперь я получаю следующие ошибки:

  • Не удалось найти ожидаемый тип [Signal i0 Bool] с фактическим типом Signal clk0 a0 (3x)
  • Не удалось найти ожидаемый тип Signal i0 Bool с фактическим типом [Signal i0 Bool]
  • Не удалось найти ожидаемый тип Signal i Bool -> Signal i Bool -> Signal i Bool с фактическим типом Signal i Bool

Что я делаю не так?

Спасибо за помощь

1 ответ

Решение

Проблема в том, что вы путаете Signal clk [a] с [Signal clk a], Первый в принципе не работает в настройках HDL, поскольку его ширина не ограничена и может изменяться от цикла к циклу.

Вместо этого вы можете определить fieldOut Проволока по проводам. Ключевым моментом является то, что данные

fieldIn =  [x0, x1, x2, x3]
wordIn =   [w0, w1, w2]
fieldOut = [y0, y1, y2, y3]

Ваш вывод должен быть одним из

if load:   [x0, x1, x2, x3] = fieldIn
if shift:  [y3, w0, w1, w2] = drop (lenght wordIn) fieldOut ++ wordIn
otherwise: [y0, y1, y2, y3] = fieldOut

Так что молнии над fieldIn а также drop (length wordIn) fieldOut ++ wordIn мы можем генерировать это постепенно:

shiftReg_d2f :: Signal CLK Bool -> Signal CLK Bool -> [Signal CLK Bool] -> [Signal CLK Bool] -> [Signal CLK Bool]
shiftReg_d2f load shift wordIn fieldIn = fieldOut
  where
    fieldOut = zipWith toOutput fieldIn (drop (length wordIn) fieldOut ++ wordIn)
    toOutput input shifted = r
      where
        r = register False $ mux load (mux shift (r, shifted), input)
Другие вопросы по тегам