我有以下 CLaSH 功能:
toBCD :: Word8 -> Vec 3 Word8
toBCD x =
x `div` 100 :>
(x `div` 10) `mod` 10 :>
x `mod` 10 :>
Nil
当然,生成的 HDL 模块是不可综合的,因为除以 2 的非幂常数。所以我想把它变成一个查找表,然后放到一个小的异步ROM中。
起初,我认为这样做就足够了
romBCD :: Word8 -> Vec 3 Word8
romBCD = asyncROM $ fmap toBCD $ iterate d256 succ 0
但生成的 VHDL 仍然包含计算toBCD 0
,toBCD 1
等的公式。我想要的是获得仅包含 256x24 表中的预先计算值的 VHDL。
我发现的一种解决方法是romBCD
通过 Template Haskell 计算 's 内容:
romBCD = asyncRom $(listToVecTH $ fmap toBCD [minBound .. maxBound])
但这会强制 的定义romBCD
位于一个单独的模块中,而不是toBCD
.