verilog 有符号数运算

1)以前的笔记写过《补码探讨》,可知在FPGA综合成电路的时候最底层都是以补码的形式在运算,正数的补码就是自己,负数的补码要取反+1。编程

(2)那么Verilog中编程的时候对编程人员来讲,其实想不到如今的编译器(Quartus II 9.1和ISE10.1没有问题,更高的版本应该更加能够了)都支持verilog有符号运算的综合了。在定义时直接加上signed便可,以下:spa

   input  signed [7:0] a, b;
   output  signed [15:0] c;
   wire signed [15:0] x;blog

   reg signed [15:0]y;开发

  很明显,这种采用signed定义的状况,能够避免手动转换带来的麻烦,同时能够节省不少开发时间input

(3)当使用移位运算“>>”进行1/2倍运算时,需注意:编译器

verilog中最简单的加减乘除运算对于有符号数和无符号数实际上是有很大区别的,现总结几点以下: 
例子:对输入a,b取平均值,而后赋值给c输出
     always @(posedge clk)
        c<=(a+b)>>1;
 
1.a,b均为无符号数,结果正确
 
2.a,b中一个为有符号数(a),另外一个为无符号数(b),编译器会自动将无符号数(b)转换成有符号数,这样就成了2个有符号数之间的运算了,结果是个有符号数,此时
1>若是a+b结果为正数(最高位为0),那么结果正确
2>若是a+b结果为负数(最高位为1),那么结果错误,由于移位运算新移入的位将用0来填补,此时负数将变为正数,显然错误。
 
因此综上,在进行有符号数运算的时候,最好像以下这样写:
reg signed [3:0] a;
reg signed [3:0] b;
reg signed [3:0] c;
 always @(posedge clk)
c<=(a+b)/2;
这样就能够避免没必要要的错误
相关文章
相关标签/搜索