verilog基础--sign表达式
下面我們來看看官方文檔,遇到別人寫的代碼不懂的,或者模棱兩可的語法,一定要親自去查閱官方的文檔,但是在查閱官方文檔之前,我們來看看基本的有符號和無符號在計算機中的表示方法,以及有符號二進制如何運算吧。
note:
反碼是什么 ?
正數的反碼就是原碼,負數的反碼等于原碼除符號位以外所有的位取反
符號在計算機中的表示
有符號數通常以2的補碼形式來表示,計算機為方便減法計算,在表示負數的時候,引入了補碼機制來把整數的減法變成整數的加法統一進行運算。
補碼:符號位保持不變,其余位取反加1
- 十進制變二進制
原碼–反碼–加一(補碼);
原碼:-8,-8的源碼是1【1000】,取反碼:1【0111】,補碼:1【1000】(十進制轉二進制)原碼:-4,-4的原碼是1100,取反碼:1011, 補碼:1100(十進制轉二進制)- 二進制變十進制:
減一 --反碼–原碼。
補碼:1000,-8 補碼:1100,說明此數是負數,減1,得1011,取反:0100,十進制4:因此為-4.二進制 加法 運算
- 帶符號二進制運算
在不超限溢出的前提下,如果計算結果為正數,那么補碼與原碼相同,得到的就是正確結果;如果計算結果為負數,還需要將補碼再轉換成原碼。
-4+2=1100+0010=1110 == = 》 1001(保持符號位不變取反)= = =》1010(加1)=-2
-6+7=1010+0111=10001 == = 》舍去溢出得0001
關于溢出,這個首先給定多少位數,心里就應該知道這取值范圍是多少,然后計算結果是否在規定范圍內,沒在這個范圍,那么必然就是產生溢出了。
當運算或其結果的位寬不同時,我們需要區分它究竟使用哪一種符號類型。因為不同的符號類型需要不同的擴展位。對于無符號數,前置一個0,即 所謂的零擴展位;對于有符號數來說,需要前置n個所謂的符號擴展位。比方說4位二進制表示的-5為1011;當其擴展成8位時,應該變為1111_1011,而不是0000_1011。
Verilog-1995中的有符號數按照如下操作。sum4 = a + {4{c[3]}, c};如果8bit的a無符號與4bit的有符號相加,我們需要手動控制將4bit的c的高位補其。
在 Verilog-2001中的有符號數引入了關鍵字signed和unsigned,就是為了解決1995中手動補充的問題。
verilog官方sign expression語法
上面的例子,我們就很好理解了,-4的二進制:1000_0100 取反:1111_1011 加1:1111_1100,經過unsigned后,取其在計算機中存儲的補碼形式為二進制
-4等價于-4’sd4,4bit有符號的負數,4在二進制位0100,取其負數為1100, 前面由于是8bit的regB位寬,我們前面都沒有用,補充0.
參考:
https://blog.csdn.net/qhw5279/article/details/79630912
http://www.cnblogs.com/Jamesjiang/p/8947252.html
https://blog.csdn.net/weiweiliulu/article/details/24316373
官方 IEEE 2005 verilog
總結
以上是生活随笔為你收集整理的verilog基础--sign表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: verilog基础—规范化参数定义par
- 下一篇: FPGA自定义UART传输(包含:mat