95年版verdi是什么怎么去写有符号数的运算

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

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

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

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

verilog中最简单的加减乘除运算对于有符号数和无符号数其实是有很大区别的现总结几点如下: 

例子:对输入a,b取平均值,然后赋值给c輸出

1.a,b均为无符号数结果正确

2.a,b中一个为有符号数(a),另一个为无符号数(b),编译器会自动将无符号数(b)转换成有符号数这样就成了2个有符号数之間的运算了,结果是个有符号数此时

1>如果a+b结果为正数(最高位为0),那么结果正确

2>如果a+b结果为负数(最高位为1)那么结果错误,因为移位運算新移入的位将用0来填补此时负数将变为正数,显然错误

所以综上,在进行有符号数运算的时候最好像如下这样写:

这样就可以避免不必要的错误

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

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

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

  另外,尽量不要使有符号数与无符号数进行混合计算只要有一个无符号數的运算单元,整个算式将被将成无符号数进行计算如将上例中b改为无符号的20,则仿真结果如下:

我要回帖

更多关于 verdi是什么 的文章

 

随机推荐