代码之家  ›  专栏  ›  技术社区  ›  Cactus

在不经过模板Haskell的情况下将函数转换为预计算的查找表

  •  3
  • Cactus  · 技术社区  · 6 年前

    我有以下冲突函数:

    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 我想要的是得到VHDL,它只包含256x24表中的预计算值。

    我找到的一个解决办法是 romBCD 通过模板Haskell的内容:

    romBCD = asyncRom $(listToVecTH $ fmap toBCD [minBound .. maxBound])
    

    romBCD 在一个单独的模块中 toBCD

    0 回复  |  直到 6 年前