75.xilinx复数乘法器IP核调试
(8+3*j)*(5+7j) = 9+35j
正确的是 19+71j
分析出现的原因:(a+bj)* (c+dj) = (ac-bd)+j(ad+bc)
其中a,b,c,d都是16bit的有符号数,乘积的结果为保证不溢出需要32bit存储,最终的复数乘法结果是两个32bit数据的和差,为保证数据不溢出需要33bit存储,但上面IP核配置中选择的是32bit导致最终的结果会产生截位,有效数据存放在低bit,比如上述数据输出需要66bit存储,但ip核是AXI总线协议,数据是按字节来对齐的,因此输出数据位宽为80bit,高40bit为虚部(其中[72:40]为有效的33bit),低40bit为实部(其中[32:0]为有效的33bit),当选择的数据位宽不足33bit时会产生截位,如上面的选择输出32bit,截取时会截取数据的[32:1]bit到输出端口(截取高位),这样就会使得输出的数据相当于/2,并且上述复数运算结果中bit0刚好是1,进而导致数据输出运算错误。正确的结果为(9*2+1)+j(35*2+1)=19+71j与理论一致。
注意:①输入数据为{虚部,实部}
②当输出位宽选择不足进行截取的时候取的是高bit位
③这与普通的加减法有所不同,普通加减法当输出位宽小于所需位宽时会将低bit输出,舍弃高bit。