Verilog 有符號數 signed

首先記住,有符號數的運算全都是補碼的方式

在Verilog裏面,可以使用有符號數據進行運算,定義時使用signed,例如
reg signed[7:0] adder; //定義了一個reg型有符號8位變量 adder
在Verilog中,數據是以補碼形式存儲的,正數補碼還是本身,負數補碼是除符號位取反加一。例如:
上邊定義的adder賦值爲-3,則-3的二進制爲1000 0011,這個叫原碼,其補碼爲1111 1101,adder中真實存儲的是1111 1101(補碼)。
在運算的過程中也是使用補碼的。那爲什麼我們在testbench中輸出該值的時候(默認十進制)仍然顯示的是-3呢,個人覺得是因爲在顯示的過程中,IDE做好了補碼到原碼的轉換。
在寄存器裏面存儲的數據是1111 1101,按照有符號十進制顯示是-3,按照無符號顯示是253,按照十六進制顯示FD,當然,按照二進制顯示是1111 1101。
所以,無論是-3、253還是FD,對應的二進制都是1111 1101,只不過顯示格式不同,那系統是怎麼知道一個8位寄存器中1111 1101這個二進制表示的是-3還是253呢,這就是定義該寄存器時使用signed的作用了,signed表示有符號,此時的1111 1101表示的是-3,若是沒有signed,則默認是無符號類型,那麼此時的1111 1101表示的就是253。
另外,有符號數1000 0000表示的-128(比較特殊,不能用原碼補碼概念來理解,記住就好),所以8位寄存器表示的數據範圍是-128~0~127,共256個數。無符號8位表示的數據範圍是0~255,也是256個數。
————————————————
版權聲明:本文爲CSDN博主「hutuxiaozi77」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/hutuxiaozi77/article/details/78762631

下面看3個例子:
-------------------------------------------------------------
reg [7:0]   temp1, temp2, temp3, temp4, temp5, temp6 ;  
temp1 = 8'd18;
        temp2 = -8'd18;
        temp3 = 8'sd18;
        temp4 = -12/3;
        temp5 = -8'd12/3;
        temp6 = -8'sd12/3;
-------------------------------------------------------------
以下是仿真的結果;

先看前3個
8'd18表示輸入的是無符號的十進制數18
      -8'd18表示輸入的是-18,所以結果爲11101110
      8'sd18表示輸入的是有符號的18
再看後3個
-12/3      的結果爲-4的補碼
-8'd12/3 的結果比較奇怪,因爲-8'sd12可以分解爲 -(8'd12)/3,就是11110100/3,結果爲01010001
-8'sd12/3的結果爲-4的補碼
這裏可以看出,加上了s後,在運算的時候編譯器把數當作有符號數計算,不加s時,即使是補碼的負數,也會直接當作無符號數處理。
————————————————
版權聲明:本文爲CSDN博主「永不放棄EX」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u013564276/article/details/48730355

 

更多參考:

https://www.cnblogs.com/yuphone/archive/2010/12/12/1903647.html

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