Verilog 數(shù)值轉(zhuǎn)換

2022-05-19 11:22 更新

本節(jié)主要對有符號數(shù)的十進制與二進制表示以及一些數(shù)值變換進行簡單的總結。

定義一個寬度為 DW 的二進制補碼格式的數(shù)據(jù) dbin ,其表示的有符號十進制數(shù)字為 ddec 。

reg [DW-1:0]     dbin ;

十進制有符號數(shù)轉(zhuǎn)二進制補碼

正數(shù)的補碼為原碼。

假如十進制數(shù) ddec 為負數(shù),則計算其對應的二進制補碼的方法主要有 2 種:

將ddec 最高位符號位改寫為 1,剩余數(shù)值部分取反加一

例如,4bit 數(shù)字 -6 的數(shù)值部分為 4'b0110,取反加一后為 4'b0010,高位改寫后為 4'b1010。

dbin = {1'b1, ~3'b110 + 3'b1} ;    //4'b1010

將負數(shù) ddec 直接與其代表的最大數(shù)值范圍數(shù)相加(有人稱之為模數(shù))

例如,4bit 數(shù)字 -6 與 16(2 的 4 次冪)的和為 10, 即對應 4'b1010。

dbin = ddec + (1<<4) ;        //4'b1010

二級制補碼轉(zhuǎn)十進制有符號數(shù)

當 dbin 最高位為 0 時,其數(shù)值大小即為其表示的十進制正數(shù)。

當 dbin 最高位為 1 時,計算其表示的十進制有符號數(shù)方法主要有 2 種:

將 dbin 取反加一,并增加符號位

例如,4bit 數(shù)字 -6 的補碼為 4'b1010,取反加一后為 4'b0110,增加符號位后為 -6。

ddec = -(~4'b1010 + 1'b1) ;  //-6

將 dbin 代表的無符號數(shù)值與其代表的最大數(shù)值范圍數(shù)直接相減

例如,4bit 數(shù)字 -6 的補碼為 4'b1010,即無符號數(shù)值為 10,10 減 16 便可得到 -6 。

ddec = dbin - (1<<4) ;  //-6

絕對值

求 dbin 的絕對值邏輯如下:

dbin_abs = (dbin[DW-1]? ~dbin : dbin) + 1'b1 ;

例如,4bit 數(shù)字 -6 的補碼為 4'b1010,取反加 1 后的值為 4'b0110(6),即為 -6 的絕對值。

但如果 dbin 為正數(shù),加 1 后的值比其真正的絕對值要大 1,此步操作只是為了讓正數(shù)部分的絕對值數(shù)量與負數(shù)部分一致。因為一定位寬下,由于 0 值的存在,有符號數(shù)表示的負數(shù)數(shù)量會比正數(shù)多 1 個。

有符號數(shù)轉(zhuǎn)無符號數(shù)

將有符號數(shù)擴展成為無符號數(shù)的邏輯如下:

dbin_unsigned = {!dbin[DW-1], dbin[DW-2:0]) ;

例如:

4'b1010 (-6) -> 4'b0010 (2),4'b0010 (2) -> 4'b1010 (10)

其實轉(zhuǎn)換原則是將數(shù)據(jù)代表的數(shù)值范圍移動到 0 以上,有符號數(shù)轉(zhuǎn)換成無符號數(shù)之后,數(shù)據(jù)相對間的差并沒有改變。

擴展符號位

計算時有時會根據(jù)需要對有符號數(shù)位寬進行擴展。假設位寬增量為 W,擴展邏輯如下:

dbin_extend = {{(W){dbin[DW-1]}}, dbin} ;

擴展原則就是將信號代表符號位的最高位,填充至擴展的高位數(shù)據(jù)位中。

例如 4'b1010 (-6) 擴展到 8bit 為 8'b11111010,計算其對應的負數(shù)仍然是 -6。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號