Ошибки регистра сдвига в 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)