У меня есть следующая функция CLaSH:
toBCD :: Word8 -> Vec 3 Word8
toBCD x =
x `div` 100 :>
(x `div` 10) `mod` 10 :>
x `mod` 10 :>
Nil
Конечно, полученный модуль HDL является несинтезируемым из-за деления на непостоянную степень 2 константы.Поэтому я хотел бы вместо этого превратить его в справочную таблицу и поместить в небольшое асинхронное ПЗУ.
Сначала я подумал, что будет достаточно сделать что-то вроде
romBCD :: Word8 -> Vec 3 Word8
romBCD = asyncROM $ fmap toBCD $ iterate d256 succ 0
но полученный VHDL по-прежнему содержит формулу для вычисления toBCD 0
, toBCD 1
и т. д. Вместо этого я хотел бы получить VHDL, который просто содержит предварительно вычисленные значения в таблице 256x24.
Один обходной путь Ifound должен был вычислить содержимое romBCD
с помощью Template Haskell:
romBCD = asyncRom $(listToVecTH $ fmap toBCD [minBound .. maxBound])
, но тогда вынуждает определение romBCD
находиться в отдельном модуле, чем toBCD
.