本節主要對有符號數的十進製與二進製表示以及一些數值變換進行簡單的總結。
定義一個寬度為 DW 的二進製補碼格式的數據 dbin ,其表示的有符號十進製數字為 ddec 。
reg [DW-1:0] dbin ;
1. 十進製有符號數轉二進製補碼
正數的補碼為原碼。
假如十進製數 ddec 為負數,則計算其對應的二進製補碼的方法主要有 2 種:
將ddec 最高位符號位改寫為 1,剩餘數值部分取反加一
例如,4bit 數字 -6 的數值部分為 4'b0110,取反加一後為 4'b0010,高位改寫後為 4'b1010。
dbin = {1'b1, ~3'b110 + 3'b1} ; //4'b1010
將負數 ddec 直接與其代表的最大數值範圍數相加(有人稱之為模數)
例如,4bit 數字 -6 與 16(2 的 4 次冪)的和為 10, 即對應 4'b1010。
dbin = ddec + (1<<4) ; //4'b1010
2. 二級製補碼轉十進製有符號數
當 dbin 最高位為 0 時,其數值大小即為其表示的十進製正數。
當 dbin 最高位為 1 時,計算其表示的十進製有符號數方法主要有 2 種:
將 dbin 取反加一,並增加符號位
例如,4bit 數字 -6 的補碼為 4'b1010,取反加一後為 4'b0110,增加符號位後為 -6。
ddec = -(~4'b1010 + 1'b1) ; //-6
將 dbin 代表的無符號數值與其代表的最大數值範圍數直接相減
例如,4bit 數字 -6 的補碼為 4'b1010,即無符號數值為 10,10 減 16 便可得到 -6 。
ddec = dbin - (1<<4) ; //-6
3. 絕對值
求 dbin 的絕對值邏輯如下:
dbin_abs = (dbin[DW-1]? ~dbin : dbin) + 1'b1 ;
例如,4bit 數字 -6 的補碼為 4'b1010,取反加 1 後的值為 4'b0110(6),即為 -6 的絕對值。
但如果 dbin 為正數,加 1 後的值比其真正的絕對值要大 1,此步操作隻是為了讓正數部分的絕對值數量與負數部分一致。因為一定位寬下,由於 0 值的存在,有符號數表示的負數數量會比正數多 1 個。
4. 有符號數轉無符號數
將有符號數擴展成為無符號數的邏輯如下:
dbin_unsigned = {!dbin[DW-1], dbin[DW-2:0]) ;
例如:
4'b1010 (-6) -> 4'b0010 (2),4'b0010 (2) -> 4'b1010 (10)
其實轉換原則是將數據代表的數值範圍移動到 0 以上,有符號數轉換成無符號數之後,數據相對間的差並沒有改變。
5. 擴展符號位
計算時有時會根據需要對有符號數位寬進行擴展。假設位寬增量為 W,擴展邏輯如下:
dbin_extend = {{(W){dbin[DW-1]}}, dbin} ;
擴展原則就是將信號代表符號位的最高位,填充至擴展的高位數據位中。
例如 4'b1010 (-6) 擴展到 8bit 為 8'b11111010,計算其對應的負數仍然是 -6。