3

我有以下 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.

4

0 回答 0