Verilog中的有符號數和無符號數

verilog符號數問題主要涉及【常數】、【變量】、【運算符】。

一、整型數
1、十進制數
普通十進制數一律被認爲是有符號數,如

32 //有符號數
-15 //有符號數
1
2
2、基數格式的表示法
基數格式表示情況下,數的符號要明確聲明,如

8'sh51 //8位有符號數01010001
6'so72 //6位有符號數111010,即十進制數下的-6 
1
2
對於未聲明符號位的,按無符號數處理

4'd2 //4位無符號數
'hAF //32位16進制數,無符號。注意未聲明長度的,統一按32位長度處理
1
2
二、變量
當將一個常數賦值給某個變量時,仿真器如何解釋這個常數的值,最終取決於這個變量的符號形式,此時常數的符號僅僅決定常數的各位取1還是0而已。
將一個有符號常量賦值給一個無符號變量可能會出現意想不到的結果。

reg [5 : 0] burst_data;
burst_data = -4'd12;//-4'd12轉換成二進制數爲110100,而burst_data爲無符號reg型變量,
                    //所以最終將儲存在其中的二進制數翻譯成52
1
2
3
作爲對比有:

integer burst_data;
burst_data = -4'd12;//-4'd12轉換成二進制數爲110100,integer爲有符號型整形變量,
                    //所以最終將儲存在其中的二進制數翻譯成有符號數-12
1
2
3
下面對常用變量類型的符號情況做一下總結。

1、wire
wire型變量要明確聲明其符號。

wire [signed] [[msb:lsb]] net1;
1
2、reg
reg型變量要明確聲明其符號。

reg [signed] [[msb:lsb]] reg1;
1
3、integer
integer型變量不必也不允許聲明符號,其中存儲的二進制數本身就代表有符號數。

integer interger1;
1
三、算數操作符
在一個表達式中混合使用有符號操作數和無符號操作數時,必須非常小心。
只要有一個操作數時有符號的,在運算開始前,所有其他的操作數都被轉換成了無符號數。

'd2+4'sb1001//第一個操作數爲無符號數,第二個操作數爲有符號數,故第二個數被認爲是無符號數9,結果爲9+2=11
1
爲了完成有符號數的運算,可以使用 $signed 和 ¥unsigned系統函數控制操作數的符號行爲。

$signed('d2)+4'sb1001 //-5
--------------------- 
版權聲明:本文爲CSDN博主「PPOP95」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/a453697601/article/details/85056699

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章