verilog 有符號數運算


1)之前的筆記寫過《補碼探討》,可知在FPGA綜合成電路的時候最底層都是以補碼的形式在運算,正數的補碼就是本身,負數的補碼要取反+1。

(2)那么Verilog中編程的時候對編程人員來說,其實想不到現在的編譯器(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定義的情況,可以避免手動轉換帶來的麻煩,同時可以節省很多開發時間

(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;
這樣就可以避免不必要的錯誤


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM