wsc_entity

有符号位的乘法器FPGA算法


方法一:


一直以来编写FPGA有符号数运算时,尤其是进行乘法运算时,总是先将数转换为无符号数进行计算,然后再将计算的结果转换为有符号数,其实想不到现在的编译器(Quartus II 9.1和ISE10.1没有问题,更高的版本应该更加可以了)都支持verilog有符号运算的综合了。


  在定义时直接加上signed即可,如下:


   input  signed [7:0] a, b;

   output  signed [15:0] c;

   wire signed [15:0] x;


   reg signed [15:0]y;


  很明显,这种采用signed定义的情况,可以避免手动转换带来的麻烦,同时可以节省很多开发时间,


  另外,尽量不要使有符号数与无符号数进行混合计算。只要有一个无符号数的运算单元,整个算式将被将成无符号数进行计算




方法二:


首先看一下无符号数的乘法,根据乘数的数位计算位积,再将一系列位积相加。便可以得到两个无符号二进制数的乘积。这里可以选择移位的方式。比如out= in * 13,in为4位,则out为8位,的计算:assign out = a + a << 2 + a <<3;实现




如果in为一个有符号数,则不可以,则 in10 = (-in[msb]*2^msb + in[msb-1:0]);其中in10代表in的十进制表示。


例如: 十进制数-5 ;二进制表示1101,补码表示为1011 ; 带符号的数字在使用过程中一般用补码表示;1011 = in[3:0];


-5 = (-in[msb]*2^msb + in[msb-1:0]) = (-1*2^3 + 3) ;对带符号位的数字计算结果取补码即为十进制表示数值;


有符号位的乘法器FPGA算法 - wsc_entity - wsc_entity的博客

图1. 无符号数的乘法 (11*13 = 143)


 有符号位的乘法器FPGA算法 - wsc_entity - wsc_entity的博客   有符号位的乘法器FPGA算法 - wsc_entity - wsc_entity的博客

     

 图2.有符号数乘以无符号数。(-5*7=-35),注意由于是两个4位数相乘,所以进行了符号的扩展,扩展到了8位。并且扩展时候最高位加1.。(-5 二进制数表示 1101,补码是1011; 7 补码 0111;1101_1101由于是有符号相乘故低六位时有效数字为;第七位时符号位;第八位符号位的进位,忽略;所以结果是101_1101,补码是1100011 = -35)




这种情况一般用在一个变系数乘以一个固定系数的情况。以DA算法为例。 in10 = (-in[msb]*2^msb + in[msb-1:0]);低位跟普通DA算法相同,高位进行减法。(补充在DA算法中)

有符号位的乘法器FPGA算法 - wsc_entity - wsc_entity的博客


 图3.有符号数乘以有符号数。(-5*-3 = 15)。注意这里是两个有符号数相乘,所以结果位数为7(不是8),进行符号扩展时候注意。



评论

热度(1)