整数用补码表示,加减法补码运行。位数不同时扩展符号位。乘法时去掉符号位的数字位数相加(最大数相乘所占位数),再加上一位符号位进行扩展。http://blog.163.com/wsc_entity/blog/static/237312069201522052615522/
一直以来编写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定义的情况,可以避免手动转换带来的麻烦,同时可以节省很多开发时间,
另外,尽量不要使有符号数与无符号数进行混合计算。只要有一个无符号数的运算单元,整个算式将被将成无符号数进行计算
对于小数运算,小数可以通过整数除以2的多少次幂转换过来,所以小数运算可以转换为整数运算,这样可以通过右移来转换,乘以非整次幂可以展开为多次密的形式,节省乘法器