我目前正在研究一个将C转换为VHDL的框架,而我正在坚持执行长分区。实际上,我的框架只能处理32位变量,因此解析C long long变量将导致2个VHDL变量,一个包含最重要的部分,一个包含最不重要的部分。总而言之,从这个:
long long a = 1LL;
将生成的VHDL类似于:
var30 <= 00000000000000000000000000000000;
var31 <= 00000000000000000000000000000001;
现在我的问题是:我如何划分2个长long参数(在VHDL中),因为它们被分成2个变量?我对加法/减法没有任何问题,因为我可以独立地工作(最小的)重要的部分(只是一个传播的传播),但我真的不知道如何进行分裂,因为通过这种操作,最小和最重要的部分真的绑定在一起......如果有人有想法,那将非常感激
PS:我对乘法有同样的问题
编辑:我都处理有符号/无符号变量,结果应该是64位变量
答案 0 :(得分: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位。