2

我目前正在研究一个将 C 转换为 VHDL 的框架,并且我陷入了长除法的实现。事实上,我的框架只能处理 32 位变量,因此解析 C long long 变量将产生 2 个 VHDL 变量,一个包含最重要的部分,一个包含最不重要的部分。所以总结一下,从这里:

long long a = 1LL;

将生成的 VHDL 将类似于:

var30 <= 00000000000000000000000000000000;
var31 <= 00000000000000000000000000000001;

现在我的问题是:我如何划分 2 个 long long 参数(在 VHDL 中),因为它们被分成 2 个变量?我对加法/减法没有问题,因为我可以独立处理最重要的部分(分别是最小的部分)(只是传播的进位),但我真的不知道如何执行除法,因为有了这个一种操作,最小和最重要的部分真的绑定在一起......如果有人有想法,将不胜感激

PS:乘法我有同样的问题

编辑:我都处理有符号/无符号变量,结果应该是一个 64 位变量

4

1 回答 1

0

对于乘法和除法问题,您可以将问题分解如下:考虑每个 64 位值,x 可以表示为k*x.hi+x.lo其中 x.hi 是高 32 位,x.lo 是低 32 位,k = 2^32。所以对于乘法:

a*b = (a.hi*k+a.lo)*(b.hi*k+b.lo)
    = a.hi*b.hi*k*k + (a.hi*b.lo + a.lo*b.hi)*k + a.lo*b.lo

如果你只想要一个 64 位的结果,那么第一项就会消失,你会得到:

a*b = (a.hi*b.lo + a.lo*b.hi)*k + a.lo*b.lo

请记住,通常乘法会使位数加倍,因此上述表达式中的每个 32 位 x 32 位乘法将生成一个 64 位项。在某些情况下,您只需要低 32 位(上述表达式中的前两项),但对于最后一项,您需要低 32 位和高 32 位。

于 2012-08-28T10:25:03.617 回答