FPGA:使用查找将范围除以固定数字table
FPGA: Divide range by fixed number using a look-up table
我已经在支持硬件乘法的 FPGA 中实现了一个块。这个块几乎不使用任何逻辑元素来做一些除法,因为它能够使用一些内部 DSP。
这个块必须移植到另一个设计,但这里我少了 2k 逻辑元件,没有硬件乘法器。
我的想法是通过在内存中查找 table 来实现这个除法,只是因为我有 60 kbit 可用,但我很难找到正确的方法来做到这一点。这是我需要做的:
使用很少的逻辑元素将 62720 到 65279 的数字除以 20。四舍五入后我只得到 128 个不同的结果,所以 table 不应该那么重,但我的问题是删除所有相似的结果并仍然使用 table 来查找精确除法的结果。
table 的第一个条目如下所示:
62720/20 = 3136
62721/20 = 3136
62722/20 = 3136
62723/20 = 3136
62724/20 = 3136
62725/20 = 3136
62726/20 = 3136
62727/20 = 3136
62728/20 = 3136
62729/20 = 3136
62730/20 = 3137
62731/20 = 3137
62732/20 = 3137
62733/20 = 3137
62734/20 = 3137
62735/20 = 3137
62736/20 = 3137
62737/20 = 3137
62738/20 = 3137
62739/20 = 3137
62740/20 = 3137
62741/20 = 3137
62742/20 = 3137
62743/20 = 3137
62744/20 = 3137
62745/20 = 3137
62746/20 = 3137
62747/20 = 3137
62748/20 = 3137
62749/20 = 3137
62750/20 = 3138
62751/20 = 3138
62752/20 = 3138
62753/20 = 3138
62754/20 = 3138
62755/20 = 3138
...
对于每个结果,我有 20 个相似的结果,除了第一个 3136 只给了我 10 个相似的结果。我的想法是为这个模式写几行,但就是想不通。
请告诉我您对此的看法。它不一定是完整的解决方案,只是一些输入,因为我被卡住了 :) 谢谢。
减去 62710(不是 62720,以使第一个范围与其他范围大小相同。)。请注意 20=5*4 除以 4(省略两个 LSB)。您现在可以适应 LUT 的范围要小得多。
还从每个 LUT 条目中减去 3072。 (您只需设置 2 位即可将其添加回去:无需加法器)。
在某些FPGA技术中,结果小于1024深8宽,1个BlockRam。
要进行更多操作(例如除以 5),需要进行一些数学分析以确保您没有错误舍入。
我已经在支持硬件乘法的 FPGA 中实现了一个块。这个块几乎不使用任何逻辑元素来做一些除法,因为它能够使用一些内部 DSP。
这个块必须移植到另一个设计,但这里我少了 2k 逻辑元件,没有硬件乘法器。
我的想法是通过在内存中查找 table 来实现这个除法,只是因为我有 60 kbit 可用,但我很难找到正确的方法来做到这一点。这是我需要做的:
使用很少的逻辑元素将 62720 到 65279 的数字除以 20。四舍五入后我只得到 128 个不同的结果,所以 table 不应该那么重,但我的问题是删除所有相似的结果并仍然使用 table 来查找精确除法的结果。
table 的第一个条目如下所示:
62720/20 = 3136
62721/20 = 3136
62722/20 = 3136
62723/20 = 3136
62724/20 = 3136
62725/20 = 3136
62726/20 = 3136
62727/20 = 3136
62728/20 = 3136
62729/20 = 3136
62730/20 = 3137
62731/20 = 3137
62732/20 = 3137
62733/20 = 3137
62734/20 = 3137
62735/20 = 3137
62736/20 = 3137
62737/20 = 3137
62738/20 = 3137
62739/20 = 3137
62740/20 = 3137
62741/20 = 3137
62742/20 = 3137
62743/20 = 3137
62744/20 = 3137
62745/20 = 3137
62746/20 = 3137
62747/20 = 3137
62748/20 = 3137
62749/20 = 3137
62750/20 = 3138
62751/20 = 3138
62752/20 = 3138
62753/20 = 3138
62754/20 = 3138
62755/20 = 3138
...
对于每个结果,我有 20 个相似的结果,除了第一个 3136 只给了我 10 个相似的结果。我的想法是为这个模式写几行,但就是想不通。
请告诉我您对此的看法。它不一定是完整的解决方案,只是一些输入,因为我被卡住了 :) 谢谢。
减去 62710(不是 62720,以使第一个范围与其他范围大小相同。)。请注意 20=5*4 除以 4(省略两个 LSB)。您现在可以适应 LUT 的范围要小得多。
还从每个 LUT 条目中减去 3072。 (您只需设置 2 位即可将其添加回去:无需加法器)。
在某些FPGA技术中,结果小于1024深8宽,1个BlockRam。
要进行更多操作(例如除以 5),需要进行一些数学分析以确保您没有错误舍入。