(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;
這樣就可以避免不必要的錯誤
帶符號數的編碼
這裡對定義不再贅述,直接記錄計算方法和心得。原碼 非常直觀的機器碼,與真值差別不大。正數前補0,後面照抄 負數前補1,後邊照抄。小數相同處理方法。反碼 解決負數加法運算問題,將減法運算轉換為加法運算。正數前補0,後面照抄 負數前補1,真值部分0變1,1變0 1001 11001 10110 結果 補...
帶符號數的表示
上一節,我們學習了進製計數制及其相互轉換,這次我們來看下計算機中帶符號數的表示 在一般算術表示中使用 和 來表示正數與負數,而在計算機中使用 0 和 1 來表示正數和負數 用 或 表示正負的數叫真值 用 0 或 1 表示正負的數叫機器數 原碼表示 二進位制數的最高位表示符號,0表示正,1表示負,數值...
Verilog 有符號數與無符號數運算
無符號數運算,左值位寬不夠,發生截斷的現象 2.兩個無符號數運算,賦值給乙個有符號的數。可以看出,右側先按照無符號數進行運算,取得的運算結果按照左側的符號進行資料顯示。3.兩個無符號數運算,無符號數賦負值 補碼 按照該補碼對應的正值進行處理。結果同上。4.有符號數和無符號數運算,賦值給有符號數。補碼...