明德?lián)PFPGA連載課程第一階段第三章VERILOG(2)_第1頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、明德?lián)Pfpga連載課程第一階段第三章verilog(2)3.2 數(shù)字3.2.1數(shù)字表示方式 在中的數(shù)字表示方式,最常用的格式是:位寬>基數(shù)>數(shù)值>,如,4b1011。 位寬:描述常量所含位數(shù)的十進(jìn)制整數(shù),是可選項。4b1011中的4就是位寬。通俗理解就是4根線。假如沒有這一項,可以從常量的值判斷出。例如b1011可知位寬是4;b10010可判斷出位寬為5。 基數(shù):表示數(shù)值是多少進(jìn)制??梢允莃,b,d,d,o,o,h或者h(yuǎn),分離表示二進(jìn)制、十進(jìn)制、八進(jìn)制和十六進(jìn)制。假如沒有此項,則缺省默認(rèn)為十進(jìn)制數(shù)。 例如,二進(jìn)制的4b1011,可以寫成十進(jìn)制的4d11,也可以寫成十六進(jìn)制的4

2、hb,或者八進(jìn)制的4o13,還可以不寫基數(shù)挺直寫成11。不管怎么樣,只要二進(jìn)數(shù)相同,寫成十進(jìn)制、八進(jìn)制和十六進(jìn)制,都是同樣的數(shù)字。 數(shù)值:是由基數(shù)所打算的表示常量真切值的一串a(chǎn)scii碼。假如基數(shù)定義為 b或b,數(shù)值可以是0,1,x,x,z或z。假如基數(shù)定義為 o或o,數(shù)值還可以是2,3,4,5,6,7。假如基數(shù)定義為 h或h,數(shù)值還可以是8,9,a,b,c,d,e,f,a,b,c,d,e,f。對于基數(shù)為d或者d的狀況,數(shù)值符可以是隨意的十進(jìn)制數(shù):0到9。但不行以是x或z。 例如,4b12是錯誤的,由于b表示二進(jìn)制,數(shù)值只能是0、1、x或者z,不有是2。 32h12等同于32h00000012

3、,也就是數(shù)值未寫完整時,高位補(bǔ)0。3.2.2二進(jìn)制是基礎(chǔ) 在數(shù)字中,假如芯片a給芯片b傳遞數(shù)據(jù),例如傳遞0或者1信息??梢詫⑿酒琣和芯片b,通過一個管腳舉行相連。然后由芯片a控制該管腳為高電平或者低電平,通過凹凸電平來表示0和1。例如,芯片b檢測到該管腳為低電平常,表示收到0;當(dāng)芯片b檢測到該管腳為高電平常,表示收到1。假如用低電平表示收到1,用高電平表示收到0,這可不行以呢?固然可以,只要芯片a和芯片b事先協(xié)定。芯片a要發(fā)數(shù)字1時,會將該管腳置為低電平。芯片b檢測到該管腳為低電平,知道收到了數(shù)字1,通信完成。一個管腳擁有凹凸電平兩種狀態(tài),可以分離表示數(shù)字0和1兩種狀況。假如芯片a要發(fā)數(shù)字0、

4、1、2、3給芯片b,那該怎么辦呢? 可以讓芯片a和芯片b銜接兩根管腳,即兩條線,a和b。當(dāng)兩條線都為低電平常,表示發(fā)送數(shù)字0;當(dāng)a為高電平,b為低電平常,表示發(fā)送數(shù)字1;當(dāng)a為低電平,b為高電平常,表示發(fā)送數(shù)字2;當(dāng)兩條線都是高電平常,表示數(shù)字3。根據(jù)同樣的道理,芯片a要發(fā)送數(shù)據(jù)4,5,6,7給芯片b的時候,只要再添加一條線就可以了。三根線一共有8種狀態(tài),可以表示8個數(shù)字。 綜上所述,我們可能通過線的不同電平狀態(tài),表示不同的含義。有多少個不同狀態(tài),就可以表示多少個數(shù)字。假如芯片a要發(fā)送+1,-1,0,+2等數(shù)字給芯片b,這里有正負(fù)了,那又該如何表示呢?參考前面的思想,線的凹凸電平表示的含義,是

5、由芯片雙方向事先商定好的。既然是這樣,那么我們拿一根線出來,例如低電平表示正數(shù),高電平表示負(fù)數(shù)。上面就是三根線,我們用線c表示正負(fù),0表示正數(shù),1表示負(fù)數(shù)。用線a和線b表示數(shù)值。3b111,可以說明為十進(jìn)制數(shù)7,也可以說明為有符號數(shù)原碼“-3”,也可以說明為有符號數(shù)補(bǔ)碼“-1”,這取決于工程師對二進(jìn)制數(shù)的定義。只要這個定義不影響到電路之間的通信那就肯定不會有問題。 所以,數(shù)字中的“0”和“1”不僅可以表示含義,也可以表示其他意義,如正負(fù)符號等。同樣的道理,在數(shù)字電路中,二進(jìn)制數(shù)是其他如八進(jìn)制、十進(jìn)制、十六進(jìn)制、有符號數(shù)、無符號數(shù)、小數(shù)等的根本。在設(shè)計中,不清晰小數(shù)、有符號數(shù)的計算辦法,最根本的

6、緣由是不清晰這些數(shù)據(jù)所對應(yīng)的二進(jìn)制值。只要理解了它所對應(yīng)的二進(jìn)制值,無數(shù)問題都可以解決。 例如,有初學(xué)者常常問,fpga中如何實現(xiàn)小數(shù)計算,如“0.5+0.25”這個功能。首先,盡人皆知的,0.5+0.25的結(jié)果為0.75。 第二,我們可以考慮,0.5、0.25和0.75用二進(jìn)制該如何表示?這取決于工程師的做法,由于這種表示辦法有無數(shù)種,例如定點小數(shù),浮點小數(shù),甚至如前面所研究,用幾根線自行來定義,只要能正常通信,那就肯定沒有問題。 假設(shè),某工程師用三根線,自行定義了二進(jìn)制值所表示的小數(shù)值。為了解釋二進(jìn)制值的意義是可以任憑定義的,我特意將數(shù)字挨次打亂。固然,有讀者可能說為什么惟獨(dú)這幾種小數(shù)呢?

7、這是由于我假定本系統(tǒng)就惟獨(dú)這幾種數(shù)字,假如想表示更多數(shù)字,那就增強(qiáng)線就行了。 有了上面定義之后,要實現(xiàn)“0.5+0.25”就很簡單了,其實就是3b001和3b100“相加”,期望得到3b010。假如我們挺直用法3b001 + 3b100,結(jié)果為“101”了,不是想要的結(jié)果。那怎么辦呢?可以這么寫:固然,這是其中一種寫法??傊灰軐崿F(xiàn)所對應(yīng)的功能,結(jié)果正確就可以。有讀者問,按上面的表格0.1+0.8應(yīng)當(dāng)為0.9,但上面沒有0.9的表示。這個其實是設(shè)計者這個表格定義有缺陷,或者設(shè)計者認(rèn)為不會浮現(xiàn)這個狀況吧??傊?,筆者要表達(dá)的是,只要定義好所對應(yīng)的二進(jìn)制數(shù),無數(shù)功能是很簡單設(shè)計的。固然,實際的工

8、程中,我們通常會遵守商定成俗的做法,沒須要自己搞得另類。例如下面是常用的定點小數(shù)的定義?,F(xiàn)在要實現(xiàn)0+0.5=0.5,也就是3b000和3b100相加,期望能得到3b100。我們發(fā)覺挺直用二進(jìn)制3b000+3b100就可以得到3b100。 要實現(xiàn)0.125+0.75=0.8725,也就是3b001和3b110相加,期望能得到3b111。我們發(fā)覺挺直用二進(jìn)制3b001+3b110就可以得到3b111。 要0.5+0.75=1.25,這個1.25已經(jīng)超出了表示范圍,要不就增強(qiáng)信號位寬,要不只能表示小數(shù)位。假如只是表示小數(shù)位,那結(jié)果就是0.25。也就是3b100和3b110相加,期望得到3b010。

9、我們發(fā)覺3b100 + 3b110 = 4b1010,用3位表示就是3b010,也就是0.25了。 綜上所述,對于定點小數(shù)的計算很容易,就是挺直相加。3.2.3不定態(tài) 前面講過,數(shù)字電路惟獨(dú)高電平和低電平,分離表示1和0。但代碼中常常能看到x和z,如1bx,1bz。那么這個x和z是什么電平呢?答案是沒有實際的電平來對應(yīng)。這個x和z是更多地用來表示設(shè)計者的意圖或者用于目的,告知仿真器和綜合器怎么說明這段代碼。 x態(tài),稱之為不定態(tài),設(shè)計者常用于推斷條件,用于告知綜合工具,設(shè)計者不關(guān)懷它的電平是多少,是0還是1都可以。上面的例子,條件是din=4b10x0,這個條件等價于din=4b1000|din

10、=4b1010,其中“|”是“或”符號。明德?lián)P則建議,挺直寫成din=4b1000|din=4b1010,好于寫成“din=4b10x0”,挺直容易明白。 仿真的時候,有些信號產(chǎn)生了不定態(tài),那么設(shè)計者就要仔細(xì)分析,這個不定態(tài)是不是應(yīng)當(dāng)?shù)摹<偃缯娴牟魂P(guān)懷它是0還是1,那么可以不解決。但明德?lián)P建議,全部信號都不應(yīng)當(dāng)處于不定態(tài),是0還是1,寫清晰,不要給設(shè)計添加“思量”的棘手。3.2.4高阻態(tài)z態(tài),普通稱之為高阻態(tài),表示設(shè)計者不驅(qū)動這個信號(既不給0也不給1),通常用于三態(tài)門接口當(dāng)中。上圖就是三態(tài)的應(yīng)用案例。圖中的銜接總線對于cpu和fpga來說,既當(dāng)作輸入又當(dāng)作輸出,是雙向接口。普通的硬件電路中,

11、會將該線接上一個上拉(弱上拉)或下拉電阻(弱下拉)。 當(dāng)cpu和fpga都不驅(qū)動該總線時,a點保持為高電平。當(dāng)fpga不驅(qū)動該總線,cpu驅(qū)動該總線時,a點的值就由cpu打算。當(dāng)cpu不驅(qū)動該總線,fpga驅(qū)動該總線時,a點的值就由fpga打算。fpga和cpu不能同時驅(qū)動該總線,否則a的電平就不確定了。通常fpga和cpu何時驅(qū)動總線,是按協(xié)議事先商議好的。上圖是典型的i2c的時序。i2c的總線sda就是一個三態(tài)信號。i2c協(xié)議已規(guī)定好上面的時光中,哪段時光是由主設(shè)備驅(qū)動,哪段時光是由從設(shè)備驅(qū)動,雙方都要遵守協(xié)議,不能存在同時驅(qū)動的狀況。那么fpga在設(shè)計中,是如何做到“不驅(qū)動”這一行為呢?

12、這是由于fpga內(nèi)部有三態(tài)門。三態(tài)門是一個硬件,上圖是它的典型結(jié)構(gòu)。三態(tài)門有四個接口,例如上圖中的寫使能wr_en、寫數(shù)據(jù)wr_data、讀數(shù)據(jù)rd_data和與外面器件相連的三態(tài)信號data。 注重寫使能信號,當(dāng)該信號有效時,三態(tài)門會將wr_data的值賦給三態(tài)線data,此時data的值由wr_data打算,當(dāng)wr_data為0時,data值就為0;當(dāng)wr_data為1時,data值就為1。 當(dāng)寫使能信號無效時,則不管wr_data值是多少,都不會對外面的data值有影響,也就是不驅(qū)動。 那么在verilog中,是通過如下兩行代碼來描述這一功能的。綜合器看到這兩行代碼,就知道要綜合成三態(tài)門

13、了。 這個高阻z的作用就在于這里。而且注重到,硬件上用三態(tài)線是為了削減管腳,而在fpga內(nèi)部沒有須要削減連線,所以用法三態(tài)信號是沒故意義的。 也就是說,明德?lián)P的設(shè)計建議,fpga內(nèi)部不要用法高阻態(tài)“z”,沒有須要給自己添加“思量”的棘手。固然,用法了也不會報錯,也能實現(xiàn)功能。 總結(jié)一點,高阻態(tài)“z”是表示“不驅(qū)動總線”這個行為,事實上數(shù)字電路就是高電平或者低電平,不存在其他電平的狀況。3.2 數(shù)據(jù)類型 verilog hdl的信號類型有無數(shù)種,但主要包括兩種數(shù)據(jù)類型:線網(wǎng)類型(net type) 和寄存器類型(reg type)。明德?lián)P的設(shè)計,也是只會用法這兩個類型。3.2.1線網(wǎng)類型wire

14、 線網(wǎng)類型用于對結(jié)構(gòu)化器件之間的物理連線的建模。如器件的管腳,內(nèi)部器件如與門的輸出等。以上面的加法器為例,輸入信號a,b是由外部器件所驅(qū)動,異或門x1的輸出s1是與異或門x2輸入腳相連的物理銜接線,它由異或門x1所驅(qū)動。 因為線網(wǎng)類型代表的是物理銜接線,因此它不存貯規(guī)律值。必需由器件所驅(qū)動。通常由assign 舉行賦值。如 assign a = b c;wire 類型定義語法如下: wire msb: lsb wire1, wire2, . . .,wiren; msb 和lsb 定義了范圍,表示了位寬。例如7:0是8位位寬,也就是可以表示成8b0至8b1111_1111; msb和lsb必需

15、為常數(shù)值; 假如沒有定義范圍,缺省值為1位; 信號沒有定義數(shù)據(jù)類型時,缺省為wire 類型。 對數(shù)組類型,請按降序方式,如7:0 ;不要寫成0:7。wire 3:0 sat; / s a t 為4 位線型信號 wire cnt; /1 位線型信號 wire 0:31 kisp, pisp, lisp ;/ kisp, pisp, lisp 都是32位的線型信號,不建議這樣定義。3.3.2寄存器類型reg reg 是最常用的寄存器類型,寄存器類型通常用于對存儲單元的描述,如d型觸發(fā)器、rom 等。存儲器類型的信號當(dāng)在某種觸發(fā)機(jī)制下分配了一個值,在分配下一個值之時保留原值。但必需注重的是,reg

16、類型的變量,不一定是存儲單元,如在always 語句中舉行描述的必需用reg 類型的變量。 reg 類型定義語法如下: reg msb: lsb reg1, reg2, . . . r e g n; msb 和lsb 定義了范圍,表示了位寬。例如7:0是8位位寬,也就是可以表示成8b0至8b1111_1111; msb和lsb必需為常數(shù)值; 假如沒有定義范圍,缺省值為1位; 信號沒有定義數(shù)據(jù)類型時,缺省為wire 類型,不是reg型。 對數(shù)組類型,請按降序方式,如7:0 ;不要寫成0:7。例如:reg 3:0 sat; / s a t 為4 位寄存器。reg cnt; /1 位寄存器。reg 1:32 kisp, pisp, lisp ;3.3.3wire和reg定義的場合區(qū)別 reg型信號不一定生成寄存器。那么什么時候用法wire類型,什么時候用reg類型,明德?lián)P總結(jié)出一套辦法:在本模塊中,用法always設(shè)計的信號都定義為reg型;其他都用wire型。上面代碼中,cnt1是用always設(shè)計的,所以要用reg型。add_cnt1和end_cnt不是由always產(chǎn)生的,所以定義為wire型。上面代碼中,x是用always設(shè)計的,所以要定義為reg型。注重,實際的電路中,x不是寄存器,但我們?nèi)匀欢x為reg型。 上面是例化的代碼,其中

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論