本節主要對有符號數的十進制與二進制表示以及一些數值變換進行簡單的總結。
定義一個寬度為 DW 的二進制補碼格式的數據 dbin ,其表示的有符號十進制數字為 ddec 。
reg [DW-1:0] dbin ;
- 十進制有符號數轉二進制補碼
正數的補碼為原碼。
假如十進制數 ddec 為負數,則計算其對應的二進制補碼的方法主要有 2 種:
◆將ddec 最高位符號位改寫為 1,剩余數值部分取反加一
例如,4bit 數字 -6 的數值部分為 4'b0110,取反加一后為 4'b0010,高位改寫后為 4 'b1010。
dbin = {1'b1, ~3'b110 + 1'b1} ; //4'b1010
◆將負數 ddec 直接與其代表的最大數值范圍數相加(有人稱之為模數)
例如,4bit 數字 -6 與 16(2 的 4 次冪)的和為 10, 即對應 4'b1010。
dbin = ddec + (1< 4) ; //4'b1010
- 二級制補碼轉十進制有符號數
當 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
- 絕對值
求 dbin 的絕對值邏輯如下:
dbin_abs = (dbin[DW-1]? ~dbin : dbin) + 1'b1 ;
例如,4bit 數字 -6 的補碼為 4'b1010,取反加 1 后的值為 4'b0110(6),即為 -6 的絕對值。
但如果 dbin 為正數,加 1 后的值比其真正的絕對值要大 1,此步操作只是為了讓正數部分的絕對值數量與負數部分一致。因為一定位寬下,由于 0 值的存在,有符號數表示的負數數量會比正數多 1 個。
- 有符號數轉無符號數
將有符號數擴展成為無符號數的邏輯如下:
dbin_unsigned = {!dbin[DW-1], dbin[DW-2:0]) ;
例如 4'b1010 (-6) -> 4'b0010 (2),4'b0010 (2) -> 4'b1010 (10) 。
其實轉換原則是將數據代表的數值范圍移動到 0 以上,有符號數轉換成無符號數之后,數據相對間的差并沒有改變。
- 擴展符號位
計算時有時會根據需要對有符號數位寬進行擴展。假設位寬增量為 W,擴展邏輯如下:
dbin_extend = {{(W){dbin[DW-1]}}, dbin} ;
擴展原則就是將信號代表符號位的最高位,填充至擴展的高位數據位中。
例如 4'b1010 (-6) 擴展到 8bit 為 8'b11111010,計算其對應的負數仍然是 -6。
-
二進制
+關注
關注
2文章
795瀏覽量
41643 -
Verilog
+關注
關注
28文章
1351瀏覽量
110077
發布評論請先 登錄
相關推薦
評論