版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 有關(guān)verilog 算法及建模</p><p> 1 有關(guān)C、Veilog HDL、VHDL1</p><p> 1.1 C與Verilog1</p><p> 1.2 Verilog HDL與VHDL3</p><p> 2 有關(guān)Verilog 中的一些語(yǔ)法5</p><p>&
2、lt;b> 2.1 運(yùn)算符5</b></p><p> 2.2 Wire、reg、tri、memory型6</p><p> 2.3 assign和always語(yǔ)句6</p><p> 2.4 阻塞賦值和非阻塞賦值8</p><p> 2.5 Verilog中使用的一些關(guān)鍵字9</p>&
3、lt;p><b> 2.6 其他13</b></p><p> 3 有關(guān)Verilog建模15</p><p> 3.1軟核、固核、硬核15</p><p> 3.2 模塊設(shè)計(jì)流程15</p><p> 3.3 門級(jí)結(jié)構(gòu)16</p><p> 3.4 基本邏輯運(yùn)算16
4、</p><p> 3.5 控制邏輯16</p><p> 3.6 同步和異步17</p><p> 3.7 有限狀態(tài)機(jī)18</p><p> 3.8 綜合的一般原則21</p><p> 4 有關(guān)總線和時(shí)鐘22</p><p> 4.1 I2C 雙向二線制串行總線協(xié)議
5、22</p><p> 4.2時(shí)鐘發(fā)生器的形成(分頻的另外一種實(shí)現(xiàn)方式)22</p><p> 1 有關(guān)C、Veilog HDL、VHDL</p><p> 1.1 C與Verilog</p><p> C 語(yǔ)言配合Verilog HDL 來設(shè)計(jì)算法的硬件電路塊時(shí)考慮的三個(gè)主要問題:</p><p> &
6、#1048698; 為什么選擇C 語(yǔ)言與Verilog HDL 配合使用?</p><p> C 語(yǔ)言與Verilog HDL 的使用有何限制?</p><p> 如何利用C 來加速硬件的設(shè)計(jì)和故障檢測(cè)?</p><p> 1) 為什么選擇C 語(yǔ)言與Verilog 配合使用</p><p>
7、 首先,C 語(yǔ)言很靈活,查錯(cuò)功能強(qiáng),還可以通過PLI(編程語(yǔ)言接口)編寫自己的系任務(wù)直接與硬件仿真器(如Verilog-XL)結(jié)合使用。C 語(yǔ)言是目前世界上應(yīng)用最為廣泛的一種編程語(yǔ)言,因而C 程序的設(shè)計(jì)環(huán)境比Verilog HDL 的完整。此外,C 語(yǔ)言可應(yīng)用于許多領(lǐng)域,有可靠的編譯環(huán)境,語(yǔ)法完備,缺陷較少。</p><p> 比較起來, Verilog 語(yǔ)言只是針對(duì)硬件描述的,在別處使用(如用于算法表達(dá)等)并
8、不方便。而且Verilog 的仿真、綜合、查錯(cuò)工具等大部分軟件都是商業(yè)軟件,與C 語(yǔ)言相比缺乏長(zhǎng)期大量的使用,可靠性較差,亦有很多缺陷。所以,只有在C 語(yǔ)言的配合使用下,Verilog 才能更好地發(fā)揮作用。</p><p> 解決方法:面對(duì)上述問題,最好的方法是C 語(yǔ)言與Verilog 語(yǔ)言相輔相成,互相配合使用。這就是既要利用C 語(yǔ)言的完整性,又要結(jié)合Verilog 對(duì)硬件描述的精確性,來更快更好地設(shè)計(jì)出符合
9、性能要求的硬件電路系統(tǒng)。利用C 語(yǔ)言完善的查錯(cuò)和編譯環(huán)境,設(shè)計(jì)者可以先設(shè)計(jì)出一個(gè)功能正確的設(shè)計(jì)單元,以此作為設(shè)計(jì)比較的標(biāo)準(zhǔn)。然后,把C 程序一段一段地改寫成用并型結(jié)構(gòu)(類似于Verilog)描述的C 程序,此時(shí)還是在C 的環(huán)境里,使用的依然是C 語(yǔ)言。如果運(yùn)行結(jié)果都正確,就將C 語(yǔ)言關(guān)鍵字用Verilog 相應(yīng)的關(guān)鍵字替換,進(jìn)入Verilog 的環(huán)境。將測(cè)試輸入同時(shí)加到C 與Verilog 兩個(gè)單元,將其輸出做比較。這樣很容易發(fā)現(xiàn)問題的
10、所在,然后更正,再做測(cè)試,直至正確無誤。剩下的工作就交給后面的設(shè)計(jì)工程師繼續(xù)做。</p><p> 2) C 語(yǔ)言與Verilog 語(yǔ)言互相轉(zhuǎn)換中存在的問題</p><p> 這樣的混合語(yǔ)言設(shè)計(jì)流程往往會(huì)在兩種語(yǔ)言的轉(zhuǎn)換中會(huì)遇到許多難題。例如, 怎樣把</p><p> C 程序轉(zhuǎn)換成類似Verilog 結(jié)構(gòu)的C 程序,來增加并行度,以保證用硬件實(shí)現(xiàn)時(shí)運(yùn)行速度
11、達(dá)到設(shè)計(jì)要求;又如怎樣不使用C 中較抽象的語(yǔ)法:例如迭代,指針,不確定次數(shù)的循環(huán)等等,也能來表示算法(因?yàn)檗D(zhuǎn)換的目的是要用可綜合的Verilog 語(yǔ)句來代替C程序中的語(yǔ)句,而可用于綜合的Verilog 語(yǔ)法是相當(dāng)有限的,往往找不到相應(yīng)的關(guān)鍵字來替換)。</p><p> C 程序是一行接一行依次執(zhí)行的,屬于順序結(jié)構(gòu),而Verilog 描述的硬件是可以在同一</p><p> 時(shí)間同時(shí)運(yùn)
12、行的,屬于并行結(jié)構(gòu)。這兩者之間有很大的沖突。而Verilog 的仿真軟件也是順序執(zhí)行的,在時(shí)間關(guān)系上同實(shí)際的硬件是有差異的,可能會(huì)出現(xiàn)一些無法發(fā)現(xiàn)的問題。</p><p> Verilog 可用的輸出輸入函數(shù)很少。C 語(yǔ)言的花樣則很多,轉(zhuǎn)換過程中會(huì)遇到一些困難。</p><p> C 語(yǔ)言的函數(shù)調(diào)用與Verilog 中模塊的調(diào)用也有區(qū)別。C 程序調(diào)用函數(shù)是沒有延時(shí)特性的,一個(gè)函數(shù)是唯一
13、確定的,對(duì)同一個(gè)函數(shù)的不同調(diào)用是一樣的。而Verilog 中對(duì)模塊的不同調(diào)用是不同的,即使調(diào)用的是同一個(gè)模塊,必須用不同的名字來指定。Verilog的語(yǔ)法規(guī)則很死,限制很多,能用的判斷語(yǔ)句有限。仿真速度較慢,查錯(cuò)功能差,錯(cuò)誤信息不完整。仿真軟件通常也很昂貴,而且不一定可靠。C 語(yǔ)言沒有時(shí)間關(guān)系,轉(zhuǎn)換后的Verilog 程序必須要能做到?jīng)]有任何外加的人工延時(shí)信號(hào),也就是必須表達(dá)為有限狀態(tài)機(jī),即RTL 級(jí)的Verilog,否則將無法使用綜合
14、工具把Verilog 源代碼轉(zhuǎn)化為門級(jí)邏輯。</p><p> 3) 如何利用C 語(yǔ)言來加快硬件的設(shè)計(jì)和查錯(cuò)</p><p> 下表中列出了常用的C 與Verilog 相對(duì)應(yīng)的關(guān)鍵字與控制結(jié)構(gòu)</p><p> 下表中,列出了C 與Verilog 相對(duì)應(yīng)的運(yùn)算符</p><p> 從上面的討論我們可以總結(jié)如下:</p>
15、<p> C 語(yǔ)言與Verilog 硬件描述語(yǔ)言可以配合使用,輔助設(shè)計(jì)硬件</p><p> C 語(yǔ)言與Verilog 硬件描述語(yǔ)言很象,只要稍加限制,C 語(yǔ)言的程序很容易轉(zhuǎn)成Verilog</p><p><b> 的程序</b></p><p> 1.2 Verilog HDL與
16、VHDL</p><p> Verilog HDL和VHDL都是用于邏輯設(shè)計(jì)的硬件描述語(yǔ)言,并且都已成為IEEE標(biāo)準(zhǔn)。VHDL是在1987年成為IEEE標(biāo)準(zhǔn),Verilog HDL則在1995年才正式成為IEEE標(biāo)準(zhǔn)。之所以VHDL比Verilog HDL早成為IEEE標(biāo)準(zhǔn),這是因?yàn)閂HDL是美國(guó)軍方組織開發(fā)的,而Verilog HDL 則是從一個(gè)普通的民間公司的私有財(cái)產(chǎn)轉(zhuǎn)化而來,基于Verilog HDL的優(yōu)
17、越性,才成為的IEEE標(biāo)準(zhǔn),因而有更強(qiáng)的生命力。</p><p> VHDL 其英文全名為VHSIC Hardware Description Language,而VHSIC則是Very High Speed Integerated Circuit的縮寫詞,意為甚高速集成電路,故VHDL其準(zhǔn)確的中文譯名為甚高速集成電路的硬件描述語(yǔ)言。</p><p> Verilog HDL和VHDL
18、作為描述硬件電路設(shè)計(jì)的語(yǔ)言,其共同的特點(diǎn)在于:</p><p> 能形式化地抽象表示電路的結(jié)構(gòu)和行為、支持邏輯設(shè)計(jì)中層次與領(lǐng)域的描述、可借用高級(jí)語(yǔ)言的精巧結(jié)構(gòu)來簡(jiǎn)化電路的描述、具有電路仿真與驗(yàn)證機(jī)制以保證設(shè)計(jì)的正確性、支持電路描述由高層到低層的綜合轉(zhuǎn)換、硬件描述與實(shí)現(xiàn)工藝無關(guān)(有關(guān)工藝參數(shù)可通過語(yǔ)言提供的屬性包括進(jìn)去)、便于文檔管理、易于理解和設(shè)計(jì)重用。</p><p> 但是Veri
19、log HDL和VHDL又各有其自己的特點(diǎn)。由于Verilog HDL早在1983年就已推出,至今已有十三年的應(yīng)用歷史,因而Verilog HDL擁有更廣泛的設(shè)計(jì)群體,成熟的資源也遠(yuǎn)比VHDL豐富。與VHDL相比VerilogHDL的最大優(yōu)點(diǎn)是:它是一種非常容易掌握的硬件描述語(yǔ)言,只要有C語(yǔ)言的編程基礎(chǔ),通過二十學(xué)時(shí)的學(xué)習(xí),再加上一段實(shí)際操作,一般同學(xué)可在二至三個(gè)月內(nèi)掌握這種設(shè)計(jì)技術(shù)。而掌握VHDL設(shè)計(jì)技術(shù)就比較困難。這是</p&
20、gt;<p> 因?yàn)閂HDL不很直觀,需要有Ada編程基礎(chǔ),一般認(rèn)為至少需要半年以上的專業(yè)培訓(xùn),才能掌握VHDL的基本設(shè)計(jì)技術(shù)。目前版本的Verilog HDL和VHDL在行為級(jí)抽象建模的覆蓋范圍方面也有所不同。一般認(rèn)為Verilog HDL在系統(tǒng)級(jí)抽象方面比VHDL略差一些,而在門級(jí)開關(guān)電路描述方面比VHDL強(qiáng)得多。下面圖1-3是Verilog HDL和VHDL建模能力的比較圖示供讀者參考:</p>&l
21、t;p> Verilog HDL較為適合系統(tǒng)級(jí)(System)、算法級(jí)(Alogrithem)、寄存器傳輸級(jí)(RTL)、邏輯級(jí)(Logic)、門級(jí)(Gate)、電路開關(guān)級(jí)(Switch)設(shè)計(jì),而對(duì)于特大型(幾百萬門級(jí)以上)的系統(tǒng)級(jí)(System)設(shè)計(jì),則VHDL更為適合,由于這兩種HDL語(yǔ)言還在不斷地發(fā)展過程中,它們都會(huì)逐步地完善自己。</p><p> 美國(guó)和中國(guó)臺(tái)灣地區(qū)邏輯電路設(shè)計(jì)和制造廠家大都以V
22、erilog HDL 為主,中國(guó)大陸地區(qū)目前學(xué)習(xí)使用VHDL 的較多。到底選用VHDL 或是Verilog HDL 來配合C 一起用,就留給各位</p><p> 自行去決定。但從學(xué)習(xí)的角度來看,Verilog HDL 比較簡(jiǎn)單,也與C 語(yǔ)言較接近,容易掌握。從使用的角度,支持Verilog 硬件描述語(yǔ)言的半導(dǎo)體廠家也較支持VHDL 的多。</p><p> 2 有關(guān)Verilog 中
23、的一些語(yǔ)法</p><p><b> 2.1 運(yùn)算符</b></p><p><b> 位運(yùn)算符</b></p><p><b> 1) ~ //取反</b></p><p> 2) & //按位與</p><p> 3) | //按位
24、或</p><p> 4) ^ //按位異或</p><p> 5) ^~ //按位同或(異或非)</p><p><b> 邏輯運(yùn)算符</b></p><p> 在Verilog HDL語(yǔ)言中存在三種邏輯運(yùn)算符:</p><p><b> 1) && 邏輯與&
25、lt;/b></p><p><b> 2) || 邏輯或</b></p><p><b> 3) ! 邏輯非</b></p><p><b> 等式運(yùn)算符</b></p><p> 在Verilog HDL語(yǔ)言中存在四種等式運(yùn)算符:</p><
26、;p> 1) == (等于)</p><p> 2) != (不等于)</p><p> 3) === (等于)</p><p> 4) !== (不等于)</p><p> "=="和"!="又稱為邏輯等式運(yùn)算符。其結(jié)果由兩個(gè)操作數(shù)的值決定。由于操作數(shù)中某些位可能是不定值x和高阻值z(mì),
27、結(jié)果可能為不定值x。</p><p> 而"==="和"!=="運(yùn)算符則不同,它在對(duì)操作數(shù)進(jìn)行比較時(shí)對(duì)某些位的不定值x和高阻值z(mì)也進(jìn)行比較,兩個(gè)操作數(shù)必需完全一致,其結(jié)果才是1,否則為0。"==="和"!=="運(yùn)算符常用于case表達(dá)式的判別,所以又稱為"case等式運(yùn)算符"。</p><p&
28、gt;<b> 位移運(yùn)算符</b></p><p><b> 左移:右邊的添0</b></p><p> 右移:左邊的添0,移除的位舍去</p><p><b> 舉例:</b></p><p> 4’b1001<<1 = 5’b10010; 4’b100
29、1<<2 = 6’b100100;</p><p> 1<<6 = 32’b1000000; 4’b1001>>1 = 4’b0100; 4’b1001>>4 = 4’b0000;</p><p><b> 位拼接運(yùn)算符</b></p><p> 1.{a,b[3:0],w,3’b101}也
30、可以寫成為{a,b[3],b[2],b[1],b[0],w,1’b1,1’b0,1’b1}</p><p> 2.{4{w}} //這等同于{w,w,w,w}</p><p> 3.{b,{3{a,b}}} //這等同于{b,a,b,a,b,a,b}</p><p><b> 負(fù)數(shù):</b></p><p> 一
31、個(gè)數(shù)字可以被定義為負(fù)數(shù),只需在位寬表達(dá)式前加一個(gè)減號(hào),減號(hào)必須寫在數(shù)字定義表達(dá)式的最前面。注意減號(hào)不可以放在位寬和進(jìn)制之間也不可以放在進(jìn)制和具體的數(shù)之間。見下例:-8'd5 //這個(gè)表達(dá)式代表5的補(bǔ)數(shù)(用八位二進(jìn)制數(shù)表示)</p><p> 2.2 Wire、reg、tri、memory型</p><p> wire型變量通常是用來表示單個(gè)門驅(qū)動(dòng)或連續(xù)賦值語(yǔ)句驅(qū)動(dòng)的網(wǎng)絡(luò)型數(shù)據(jù)
32、,tri型變量則用來表示多驅(qū)動(dòng)器驅(qū)動(dòng)的網(wǎng)絡(luò)型數(shù)據(jù)。如果wire型或tri型變量沒有定義邏輯強(qiáng)度(logic strength),在多驅(qū)動(dòng)源的情況下,邏輯值會(huì)發(fā)生沖突從而產(chǎn)生不確定值。</p><p> wire型數(shù)據(jù)常用來表示用于以assign關(guān)鍵字指定的組合邏輯信號(hào)。Verilog程序模塊中輸入輸出信號(hào)類型缺省時(shí)自動(dòng)定義為wire型。</p><p> 寄存器是數(shù)據(jù)儲(chǔ)存單元的抽象。寄
33、存器數(shù)據(jù)類型的關(guān)鍵字是reg,通過賦值語(yǔ)句可以改變寄存器儲(chǔ)存的值,其作用與改變觸發(fā)器儲(chǔ)存的值相當(dāng)。reg類型數(shù)據(jù)的缺省初始值為不定值x。</p><p> reg型數(shù)據(jù)常用來表示用于“always”模塊內(nèi)的指定信號(hào),常代表觸發(fā)器。通常,在設(shè)計(jì)中要由“always”塊通過使用行為描述語(yǔ)句來表達(dá)邏輯關(guān)系。在“always”塊內(nèi)被賦值的每一個(gè)信號(hào)都必須定義成reg, reg型只表示被定義的信號(hào)將用在“always”塊
34、內(nèi),理解這一點(diǎn)很重要。并不是說reg型信號(hào)一定是寄存器或觸發(fā)器的輸出。雖然reg型信號(hào)常常是寄存器或觸發(fā)器的輸出,但并不一定總是這樣。</p><p> Verilog HDL通過對(duì)reg型變量建立數(shù)組來對(duì)存儲(chǔ)器建模,可以描述RAM型存儲(chǔ)器,ROM存儲(chǔ)器和reg文件。數(shù)組中的每一個(gè)單元通過一個(gè)數(shù)組索引進(jìn)行尋址。在Verilog語(yǔ)言中沒有多維數(shù)組存在。 memory型數(shù)據(jù)是通過擴(kuò)展reg型數(shù)據(jù)的地址范圍來生成的。
35、</p><p> reg [7:0] mema[255:0];</p><p> 這個(gè)例子定義了一個(gè)名為mema的存儲(chǔ)器,該存儲(chǔ)器有256個(gè)8位的存儲(chǔ)器。該存儲(chǔ)器的地址范圍是0到255。</p><p> 盡管memory型數(shù)據(jù)和reg型數(shù)據(jù)的定義格式很相似,但要注意其不同之處。如一個(gè)由n個(gè)1位寄存器構(gòu)成的存儲(chǔ)器組是不同于一個(gè)n位的寄存器的。見下例:<
36、/p><p> reg [n-1:0] rega; //一個(gè)n位的寄存器</p><p> reg mema [n-1:0]; //一個(gè)由n個(gè)1位寄存器構(gòu)成的存儲(chǔ)器組</p><p> 一個(gè)n位的寄存器可以在一條賦值語(yǔ)句里進(jìn)行賦值,而一個(gè)完整的存儲(chǔ)器則不行。見下例:</p><p> rega =0; //合法賦值語(yǔ)句</p>
37、<p> mema =0; //非法賦值語(yǔ)句</p><p> 如果想對(duì)memory中的存儲(chǔ)單元進(jìn)行讀寫操作,必須指定該單元在存儲(chǔ)器中的地址。下面的寫法是正確的。</p><p> mema[3]=0; //給memory中的第3個(gè)存儲(chǔ)單元賦值為0。</p><p> 2.3 assign和always語(yǔ)句</p><p&g
38、t; 模塊中最重要的部分是邏輯功能定義部分。有三種方法可在模塊中產(chǎn)生邏輯。</p><p> 1).用“assign”聲明語(yǔ)句</p><p> 采用“assign”語(yǔ)句是描述組合邏輯最常用的方法之一。</p><p> 如: assign a = b & c;</p><p><b> 2).用實(shí)例元件</
39、b></p><p> 如: and and_inst( q, a, b );</p><p> 采用實(shí)例元件的方法象在電路圖輸入方式下,調(diào)入庫(kù)元件一樣。鍵入元件的名字和相連的引腳即可,表示在設(shè)計(jì)中用到一個(gè)跟與門(and)一樣的名為and_inst的與門,其輸入端為a, b,輸出為q。要求每個(gè)實(shí)例元件的名字必須是唯一的,以避免與其他調(diào)用與門(and)的實(shí)例混淆。</p>
40、;<p> 3).用“always”塊</p><p> “always”塊既可用于描述組合邏輯也可描述時(shí)序邏輯。</p><p> 如果用Verilog模塊實(shí)現(xiàn)一定的功能,首先應(yīng)該清楚哪些是同時(shí)發(fā)生的,哪些是順序發(fā)生的。上面三個(gè)例子分別采用了“assign”語(yǔ)句、實(shí)例元件和“always”塊。這三個(gè)例子描述的邏輯功能是同時(shí)執(zhí)行的。也就是說,如果把這三項(xiàng)寫到一個(gè) Ver
41、iIog 模塊文件中去,它們的次序不會(huì)影響邏輯實(shí)現(xiàn)的功能。這三項(xiàng)是同時(shí)執(zhí)行的,也就是并發(fā)的。</p><p> 然而,在“always”模塊內(nèi),邏輯是按照指定的順序執(zhí)行的?!癮lways”塊中的語(yǔ)句稱為“順序語(yǔ)句”,因?yàn)樗鼈兪琼樞驁?zhí)行的。請(qǐng)注意,兩個(gè)或更多的“always”模塊也是同時(shí)執(zhí)行的,但是模塊內(nèi)部的語(yǔ)句是順序執(zhí)行的。</p><p> always塊的語(yǔ)法原則:</p&g
42、t;<p> 1) 每個(gè)always塊只能有一個(gè)事件控制"@(event-expression)",而且要緊跟在always關(guān)鍵字后面。</p><p> 2) always塊可以表示時(shí)序邏輯或者組合邏輯,也可以用always塊既表示電平敏感的透明鎖存器又同時(shí)表示組合邏輯。但是不推薦使用這種描述方法,因?yàn)檫@容易產(chǎn)生錯(cuò)誤和多余的電平敏感的透明鎖存器。</p>&l
43、t;p> 3) 帶有posedge 或 negedge 關(guān)鍵字的事件表達(dá)式表示沿觸發(fā)的時(shí)序邏輯,沒有posedge 或negedge關(guān)鍵字的表示組合邏輯或電平敏感的鎖存器,或者兩種都表示。在表示時(shí)序和組合邏輯的事件控制表達(dá)式中如有多個(gè)沿和多個(gè)電平,其間必須用關(guān)鍵字 “ or ” 連接 。</p><p> 4) 每個(gè)表示時(shí)序always塊只能由一個(gè)時(shí)鐘跳變沿觸發(fā),置位或復(fù)位最好也由該時(shí)鐘跳變沿觸發(fā)。&l
44、t;/p><p> 5) 每個(gè)在always塊中賦值的信號(hào)都必需定義成reg型或整型。整型變量缺省為32bit,使用Verilog操作符可對(duì)其進(jìn)行二進(jìn)制求補(bǔ)的算術(shù)運(yùn)算。綜合器還支持整型量的范圍說明,這樣就允許產(chǎn)生不是32位的整型量。句法結(jié)構(gòu):integer[<msb>:<lsb>]<identifier>。</p><p> 6) always塊中應(yīng)該避
45、免組合反饋回路。每次執(zhí)行always塊時(shí),在生成組合邏輯的always塊中賦值的所有信號(hào)必需都有明確的值;否則,需要設(shè)計(jì)者在設(shè)計(jì)中加入電平敏感的鎖存器來保持賦值前的最后一個(gè)值,只有這樣綜合器才能正常生成電路。如果不這樣做綜合器會(huì)發(fā)出警告提示設(shè)計(jì)中插入了鎖存器。如果在設(shè)計(jì)中存在綜合器認(rèn)為不是電平敏感鎖存器的組合回路時(shí),綜合器會(huì)發(fā)出錯(cuò)誤信息(例如設(shè)計(jì)中有異步狀態(tài)機(jī)時(shí))。</p><p> 上面這一段不太好理解,讓我
46、們?cè)俳忉屢幌?這也就是說,用always塊設(shè)計(jì)純組合邏輯電路時(shí), 在生成組合邏輯的always塊中參與賦值的所有信號(hào)都必需有明確的值[即在賦值表達(dá)式右端參與賦值的信號(hào)都必需在always @(敏感電平列表)中列出],如果在賦值表達(dá)式右端引用了敏感電平列表中沒有列出的信號(hào),那么在綜合時(shí),將會(huì)為該沒有列出信號(hào)隱含地產(chǎn)生一個(gè)透明鎖存器,這是因?yàn)樵撔盘?hào)的變化不會(huì)立刻引起所賦值的變化,而必須等到敏感電平列表中某一個(gè)信號(hào)變化時(shí),它的作用才顯現(xiàn)出來,
47、也就是相當(dāng)于存在著一個(gè)透明鎖存器把該信號(hào)的變化暫存起來,待敏感電平列表中某一個(gè)信號(hào)變化時(shí)再起作用, 純組合邏輯電路不可能做到這一點(diǎn)。這樣,綜合后所得電路已經(jīng)不是純組合邏輯電路了,這時(shí)綜合器會(huì)發(fā)出警告提示設(shè)計(jì)中插入了鎖存器。見下例。</p><p> 例:input a,b,c;</p><p><b> reg e,d;</b></p><p&
48、gt; always @(a or b or c)</p><p><b> begin</b></p><p> e =d & a & b;</p><p> /* 因?yàn)閐沒有在敏感電平列表中,所以d變化時(shí),e不能立刻變化,要等到a或b或c變化時(shí)才體現(xiàn)出來,這就是說實(shí)際上相當(dāng)于存在一個(gè)電平敏感的透明鎖存器在起作用, 把
49、d信號(hào)的變化鎖存其中 */</p><p><b> d =e | c;</b></p><p><b> end</b></p><p> 邊沿觸發(fā)的always塊常常描述時(shí)序邏輯,如果符合可綜合風(fēng)格要求可用綜合工具自動(dòng)轉(zhuǎn)換為表示時(shí)序邏輯的寄存器組和門級(jí)邏輯,而電平觸發(fā)的always塊常常用來描述組合邏輯和帶鎖存器
50、的組合邏輯,如果符合可綜合風(fēng)格要求可轉(zhuǎn)換為表示組合邏輯的門級(jí)邏輯或帶鎖存器的組合邏輯。一個(gè)模塊中可以有多個(gè)always塊,它們都是并行運(yùn)行的。</p><p> 2.4 阻塞賦值和非阻塞賦值</p><p> 1.非阻塞(Non_Blocking)賦值方式( 如 b <= a; ) ,在描述時(shí)序邏輯的always 塊中用非阻塞賦值,則綜合成時(shí)序邏輯的電路結(jié)構(gòu)。</p>
51、<p> 1) 塊結(jié)束后才完成賦值操作。</p><p> 2) b的值并不是立刻就改變的。</p><p> 3) 這是一種比較常用的賦值方法。(特別在編寫可綜合模塊時(shí))</p><p> 2.阻塞(Blocking)賦值方式( 如 b = a; ) ,在描述組合邏輯的always 塊中用阻塞賦值,則綜合成組合邏輯的電路結(jié)構(gòu)。</p&g
52、t;<p> 1) 賦值語(yǔ)句執(zhí)行完后,塊才結(jié)束。</p><p> 2) b的值在賦值語(yǔ)句執(zhí)行完后立刻就改變的</p><p> 3) 可能會(huì)產(chǎn)生意想不到的結(jié)果。</p><p> 到目前為止,前面所舉的例子中的"always"模塊內(nèi)的reg型信號(hào)都是采用</p><p> 下面的這種賦值方式:b
53、<= a;</p><p> 這種方式的賦值并不是馬上執(zhí)行的,也就是說"always"塊內(nèi)的下一條語(yǔ)句執(zhí)行后,b并不等于a,而是保持原來的值。"always"塊結(jié)束后,才進(jìn)行賦值。而另一種賦值方式阻塞賦值方式,b = a;</p><p> 這種賦值方式是馬上執(zhí)行的。也就是說執(zhí)行下一條語(yǔ)句時(shí),b已等于a。</p><p&
54、gt; [例1]:always @( posedge clk )</p><p><b> begin</b></p><p><b> b<=a;</b></p><p><b> c<=b;</b></p><p><b> end</
55、b></p><p> [例1] 中的"always"塊中用了非阻塞賦值方式,定義了兩個(gè)reg型信號(hào)b和c,clk信號(hào)的上升沿到來時(shí),b就等于a,c就等于b,這里應(yīng)該用到了兩個(gè)觸發(fā)器。請(qǐng)注意:賦值是在"always"塊結(jié)束后執(zhí)行的,c應(yīng)為原來b的值。這個(gè)"always"塊實(shí)際描述的電路功能如下圖所示:</p><p>
56、[例2]: always @(posedge clk)</p><p><b> begin</b></p><p><b> b=a;</b></p><p><b> c=b;</b></p><p><b> end</b></p>
57、;<p> [例2]中的 "always"塊用了阻塞賦值方式。clk信號(hào)的上升沿到來時(shí),將發(fā)生如下的變化:b馬上取a的值,c馬上取b的值(即等于a),生成的電路圖如下所示只用了一個(gè)觸發(fā)器來寄存器a的值,又輸出給b和c。這大概不是設(shè)計(jì)者的初衷,如果采用[例1]所示的非阻塞賦值方式就可以避免這種錯(cuò)誤</p><p> 關(guān)于賦值語(yǔ)句的編寫規(guī)則:</p><p&g
58、t; 1) 時(shí)序電路建模時(shí),用非阻塞賦值。</p><p> 2) 鎖存器電路建模時(shí),用非阻塞賦值。</p><p> 3) 用always 塊建立組合邏輯模型時(shí),用阻塞賦值。</p><p> 4) 在同一個(gè)always 塊中建立時(shí)序和組合邏輯電路時(shí),用非阻塞賦值。</p><p> 5) 在同一個(gè)always 塊中不要既用非阻塞
59、賦值又用阻塞賦值。</p><p> 6) 不要在一個(gè)以上的always 塊中為同一個(gè)變量賦值。</p><p> 7) 用$strobe 系統(tǒng)任務(wù)來顯示用非阻塞賦值的變量值</p><p> 8) 在賦值時(shí)不要使用 #0 延遲</p><p> 2.5 Verilog中使用的一些關(guān)鍵字</p><p> a
60、lways, and, assign,begin,buf,bufif0,bufif1,case,casex,casez,cmos,deassign,</p><p> default,defparam,disable,edge,else,end,endcase,endmodule,endfunction,endprimitive,endspecify, endtable, endtask, event, for
61、, force, forever, fork, function,highz0,highz1, if,initial, inout, input,integer,join,large,macromodule,medium,module,nand,negedge,nmos,nor,not,notif0,notifl, or, output, parameter, pmos, posedge,primitive, pull0, pull1,
62、 pullup, pulldown, rcmos, reg, releses, repeat, mmos, rpmos,rtran, rtranif0,rtranif1,scalared,small,specify,specparam,strength,strong0, strong1,supply0, supp</p><p> 所以,在對(duì)變量進(jìn)行命名的時(shí)候,避免使用以上的名字,以免造成混亂而使系統(tǒng)無法進(jìn)行爭(zhēng)
63、取識(shí)別 。</p><p> 下面主要介紹幾種常用的。</p><p> 1.Repeat 語(yǔ)句</p><p> 在repeat語(yǔ)句中,其表達(dá)式通常為常量表達(dá)式。下面的例子中使用repeat循環(huán)語(yǔ)句及加法和移位操作來實(shí)現(xiàn)一個(gè)乘法器。</p><p> parameter size=8,longsize=16;</p>
64、<p> reg [size:1] opa, opb;</p><p> reg [longsize:1] result;</p><p> begin: mult</p><p> reg [longsize:1] shift_opa, shift_opb;</p><p> shift_opa = opa;</p
65、><p> shift_opb = opb;</p><p> result = 0;</p><p> repeat(size)</p><p><b> begin</b></p><p> if(shift_opb[1])</p><p> result =
66、result + shift_opa;</p><p> shift_opa = shift_opa <<1;</p><p> shift_opb = shift_opb >>1;</p><p><b> end</b></p><p><b> end</b>&
67、lt;/p><p> 也可以用for語(yǔ)句來實(shí)現(xiàn):</p><p> for( bindex=1; bindex<=size; bindex=bindex+1 )</p><p> if(opb[bindex])</p><p> result = result + (opa<<(bindex-1));</p>
68、<p> 2.task和function說明語(yǔ)句的不同點(diǎn)</p><p> task和function說明語(yǔ)句分別用來定義任務(wù)和函數(shù)。利用任務(wù)和函數(shù)可以把一個(gè)很大的程序模塊分解成許多較小的任務(wù)和函數(shù)便于理解和調(diào)試。輸入、輸出和總線信號(hào)的值可以傳入、傳出任務(wù)和函數(shù)。任務(wù)和函數(shù)往往還是大的程序模塊中在不同地點(diǎn)多次用到的相同的程序段。學(xué)會(huì)使用task和function語(yǔ)句可以簡(jiǎn)化程序的結(jié)構(gòu),使程序明白
69、易懂,是編寫較大型模塊的基本功</p><p> 任務(wù)和函數(shù)有些不同,主要的不同有以下四點(diǎn):</p><p> 1) 函數(shù)只能與主模塊共用同一個(gè)仿真時(shí)間單位,而任務(wù)可以定義自己的仿真時(shí)間單位。</p><p> 2) 函數(shù)不能啟動(dòng)任務(wù),而任務(wù)能啟動(dòng)其它任務(wù)和函數(shù)。</p><p> 3) 函數(shù)至少要有一個(gè)輸入變量,而任務(wù)可以沒有或有多
70、個(gè)任何類型的變量。</p><p> 4) 函數(shù)返回一個(gè)值,而任務(wù)則不返回值。</p><p> 函數(shù)的目的是通過返回一個(gè)值來響應(yīng)輸入信號(hào)的值。任務(wù)卻能支持多種目的,能計(jì)算多個(gè)結(jié)果值,這些結(jié)果值只能通過被調(diào)用的任務(wù)的輸出或總線端口送出。Verilog HDL模塊使用函數(shù)時(shí)是把它當(dāng)作表達(dá)式中的操作符,這個(gè)操作的結(jié)果值就是這個(gè)函數(shù)的返回值。下面讓我們用例子來說明:</p>&
71、lt;p> 例如,定義一任務(wù)或函數(shù)對(duì)一個(gè)16位的字進(jìn)行操作讓高字節(jié)與低字節(jié)互換,把它變?yōu)榱硪粋€(gè)字(假定這個(gè)任務(wù)或函數(shù)名為: switch_bytes)。</p><p> 任務(wù)返回的新字是通過輸出端口的變量,因此16位字字節(jié)互換任務(wù)的調(diào)用源碼是這樣的:</p><p> switch_bytes(old_word,new_word);</p><p>
72、 任務(wù)switch_bytes把輸入old_word的字的高、低字節(jié)互換放入new_word端口輸出,而函數(shù)返回的新字是通過函數(shù)本身的返回值,因此16位字字節(jié)互換函數(shù)的調(diào)用源碼是這樣的:</p><p> new_word = switch_bytes(old_word);</p><p> 3.系統(tǒng)任務(wù) $random</p><p> 這個(gè)系統(tǒng)函數(shù)提供了一
73、個(gè)產(chǎn)生隨機(jī)數(shù)的手段。當(dāng)函數(shù)被調(diào)用時(shí)返回一個(gè)32bit的隨機(jī)數(shù)。它是一個(gè)帶符號(hào)的整形數(shù)。</p><p> $random一般的用法是:$ramdom % b ,其中 b>0.它給出了一個(gè)范圍在(-b+1):(b-1)中的隨機(jī)數(shù)。</p><p> 下面給出一個(gè)產(chǎn)生隨機(jī)數(shù)的例子:</p><p> reg[23:0] rand;</p>&l
74、t;p> rand = $random % 60;//(-60+1:60-1)=(-59:59)</p><p> 上面的例子給出了一個(gè)范圍在-59到59之間的隨機(jī)數(shù),下面的例子通過位并接操作產(chǎn)生一個(gè)值在0到59之間的數(shù)。</p><p> reg[23:0] rand;</p><p> rand = {$random} % 60;</p>
75、;<p> $random產(chǎn)生寬度隨機(jī)的隨機(jī)脈沖序列的測(cè)試信號(hào)源,在電路模塊的設(shè)計(jì)仿真時(shí)非常有用。</p><p> 例:`timescale 1ns/1ns</p><p> module random_pulse( dout );</p><p> output [9:0] dout;</p><p><b&g
76、t; reg dout;</b></p><p> integer delay1,delay2,k;</p><p><b> initial</b></p><p><b> begin</b></p><p> #10 dout=0;</p><p>
77、; for (k=0; k< 100; k=k+1)</p><p><b> begin</b></p><p> delay1 = 20 * ( {$random} % 6);// delay1 在0到100ns間變化</p><p> delay2 = 20 * ( 1 + {$random} % 3);// delay2
78、在20到60ns間變化</p><p> #delay1 dout = 1 << ({$random} %10);</p><p> //dout的0--9位中隨機(jī)出現(xiàn)1,并出現(xiàn)的時(shí)間在0-100ns間變化</p><p> #delay2 dout = 0;//脈沖的寬度在在20到60ns間變化</p><p><b
79、> end</b></p><p><b> end</b></p><p><b> endmodule</b></p><p> 4.宏定義 `define</p><p> 用一個(gè)指定的標(biāo)識(shí)符(即名字)來代表一個(gè)字符串,它的一般形式為:</p><
80、;p> `define 標(biāo)識(shí)符(宏名) 字符串(宏內(nèi)容)</p><p> 如:`define signal string</p><p> 它的作用是指定用標(biāo)識(shí)符signal來代替string這個(gè)字符串,在編譯預(yù)處理時(shí),把程序中在該命令以后所有的signal都替換成string。這種方法使用戶能以一個(gè)簡(jiǎn)單的名字代替一個(gè)長(zhǎng)的字符串,也可以用一個(gè)有含義的名字來代替沒有含義的數(shù)字和
81、符號(hào),因此把這個(gè)標(biāo)識(shí)符(名字)稱為“宏名”,在編譯預(yù)處理時(shí)將宏名替換成字符串的過程稱為“宏展開”。</p><p><b> 宏定義的八點(diǎn)說明:</b></p><p> 1) 宏名可以用大寫字母表示,也可以用小寫字母表示。建議使用大寫字母,以與變量名相</p><p><b> 區(qū)別。</b></p>
82、<p> 2) 宏定義不是Verilog HDL語(yǔ)句,不必在行末加分號(hào)。如果加了分號(hào)會(huì)連分號(hào)一起進(jìn)行置</p><p><b> 換。如:</b></p><p> [例2]:module test;</p><p> reg a, b, c, d, e, out;</p><p> `define
83、 expression a+b+c+d;</p><p> assign out = `expression + e;</p><p><b> ...</b></p><p><b> endmodule</b></p><p> 經(jīng)過宏展開以后,該語(yǔ)句為:assign out = a+b
84、+c+d;+e;顯然出現(xiàn)語(yǔ)法錯(cuò)誤。</p><p> 3) `define命令可以出現(xiàn)在模塊定義里面,也可以出現(xiàn)在模塊定義外面。宏名的有效范圍</p><p> 為定義命令之后到原文件結(jié)束。通常,`define命令寫在模塊定義的外面,作為程序的一部分,在此程序內(nèi)有效。</p><p> 4) 使用宏名代替一個(gè)字符串,可以減少程序中重復(fù)書寫某些字符串的工作量。而
85、且記住一</p><p> 個(gè)宏名要比記住一個(gè)無規(guī)律的字符串容易,這樣在讀程序時(shí)能立即知道它的含義,當(dāng)需</p><p> 要改變某一個(gè)變量時(shí),可以只改變 `define命令行,一改全改。如例1中,先定義WORDSIZE</p><p> 代表常量8,這時(shí)寄存器data是一個(gè)8位的寄存器。如果需要改變寄存器的大小,只需把</p><p>
86、; 該命令行改為:`define WORDSIZE 16。這樣寄存器data則變?yōu)橐粋€(gè)16位的寄存器。</p><p> 由此可見使用宏定義,可以提高程序的可移植性和可讀性。</p><p> 5.時(shí)間尺度 `timescale</p><p> `timescale命令用來說明跟在該命令后的模塊的時(shí)間單位和時(shí)間精度。使用`timescale命令可以在同一個(gè)
87、設(shè)計(jì)里包含采用了不同的時(shí)間單位的模塊。例如,一個(gè)設(shè)計(jì)中包含了兩個(gè)模塊,其中一個(gè)模塊的時(shí)間延遲單位為ns,另一個(gè)模塊的時(shí)間延遲單位為ps。EDA工具仍然可以對(duì)這個(gè)設(shè)計(jì)進(jìn)行仿真測(cè)試。</p><p> `timescale 命令的格式如下:</p><p> `timescale<時(shí)間單位>/<時(shí)間精度></p><p> $time與$r
88、ealtime</p><p> $time: 返回的是整型數(shù)</p><p> $realtime:返回的是實(shí)型數(shù)</p><p> 6. 用戶定義的原語(yǔ)(UDP)</p><p> 由于UDP是用查表的方法來確定其輸出的,用仿真器進(jìn)行仿真時(shí),對(duì)它的處理速度較對(duì)一般用戶編寫的模塊快得多。與一般的用戶模塊比較,UDP更為基本,它只能描
89、述簡(jiǎn)單的能用真值表表示的組合或時(shí)序邏輯。UDP模塊的結(jié)構(gòu)與一般模塊類似,只是不用module而改用primitive關(guān)鍵詞開始,不用endmodule而改用endprimitive關(guān)鍵詞結(jié)束</p><p><b> 定義UDP的語(yǔ)法:</b></p><p> primitive 元件名(輸出端口名,輸入端口名1,輸入端口名2,…)</p><
90、;p> output 輸出端口名;</p><p> input 輸入端口名1, 輸入端口名2,…;</p><p> reg 輸出端口名;</p><p> initial begin</p><p> 輸出端口寄存器或時(shí)序邏輯內(nèi)部寄存器賦初值(0,1,或 X);</p><p><b>
91、 end</b></p><p><b> table</b></p><p> //輸入1 輸入2 輸入3 … : 輸出</p><p> 邏輯值 邏輯值 邏輯值 … : 邏輯值 ;</p><p> 邏輯值 邏輯值 邏輯值 … : 邏輯值 ;</p><p> 邏輯值 邏
92、輯值 邏輯值 … : 邏輯值 ;</p><p> … … … … : … ;</p><p><b> endtable</b></p><p> endprimitive</p><p><b> 注意點(diǎn):</b></p><p> 1) UDP只能有一個(gè)輸出端
93、,而且必定是端口說明列表的第一項(xiàng)。</p><p> 2) UDP可以有多個(gè)輸入端,最多允許有10個(gè)輸入端。</p><p> 3) UDP所有端口變量必須是標(biāo)量,也就是必須是1位的。</p><p> 4) 在UDP的真值表項(xiàng)中,只允許出現(xiàn)0、1、X三種邏輯值,高阻值狀態(tài)Z是不允許出現(xiàn)的。</p><p> 5) 只有輸出端才可以被
94、定義為寄存器類型變量。</p><p> 6) initial語(yǔ)句用于為時(shí)序電路內(nèi)部寄存器賦初值,只允許賦0、1、X三種邏輯值,缺省值為X。</p><p> 值得注意的是:往往在Verilog中使用C中常使用的一些關(guān)鍵字時(shí),不能進(jìn)行正常的綜合,這主要是由于Verilog的局限性所致,在這方面,需要查閱一些Verilog可綜合代碼風(fēng)格的書籍。</p><p>&
95、lt;b> ?。浚浚恳蓡枺?lt;/b></p><p> 在使用for 、reapeat、while等關(guān)鍵字實(shí)現(xiàn)某些功能的時(shí)候,相對(duì)而言很直觀、簡(jiǎn)介,但在綜合的時(shí)候,出現(xiàn)錯(cuò)誤,有待討論。</p><p><b> 2.6 其他</b></p><p><b> 1.優(yōu)先級(jí)別</b></p>
96、<p> 2.關(guān)于程序中生成鎖存器的問題</p><p> 右邊的例子很明確,程序中的case語(yǔ)句有default項(xiàng),指明了如果sel不取00或11時(shí),編譯器或仿真器應(yīng)賦給q的值。程序所示情況下,q賦為0,因此不需要鎖存器。</p><p> 以上就是怎樣來避免偶然生成鎖存器的錯(cuò)誤。如果用到if語(yǔ)句,最好寫上else項(xiàng)。如果用case語(yǔ)句,最好寫上default項(xiàng)。遵循上
97、面兩條原則,就可以避免發(fā)生這種錯(cuò)誤,使設(shè)計(jì)者更加明確設(shè)計(jì)目標(biāo),同時(shí)也增強(qiáng)了Verilog程序的可讀性。</p><p><b> 3.關(guān)于賦值</b></p><p> 1) 對(duì)一個(gè)寄存器型(reg)和整型(integer)變量給定位的賦值只允許在一個(gè)always塊內(nèi)進(jìn)行,如在另一always塊也對(duì)其賦值,這是非法的。</p><p>
98、2) 把某一信號(hào)值賦為'bx,綜合器就把它解釋成無關(guān)狀態(tài),因而綜合器為其生成的硬件電路最簡(jiǎn)潔。</p><p> 3 有關(guān)Verilog建模</p><p> 3.1軟核、固核、硬核</p><p> 我們把功能經(jīng)過驗(yàn)證的、可綜合的、實(shí)現(xiàn)后電路結(jié)構(gòu)總門數(shù)在5000門以上的Verilog HDL模型稱之為“軟核”(Soft Core)</p>
99、<p> 我們把在某一種現(xiàn)場(chǎng)可編程門陣列(FPGA)器件上實(shí)現(xiàn)的,經(jīng)驗(yàn)證是正確的總門數(shù)在5000門以上電路結(jié)構(gòu)編碼文件,稱之為“固核”。</p><p> 我們把在某一種專用半導(dǎo)體集成電路工藝的(ASIC)器件上實(shí)現(xiàn)的經(jīng)驗(yàn)證是正確的總門數(shù)在5000門以上的電路結(jié)構(gòu)掩膜,稱之為“硬核”。</p><p> MASK(掩膜):(單片機(jī)掩膜是指程序數(shù)據(jù)已經(jīng)做成光刻版,在單片機(jī)
100、生產(chǎn)的過程中把程序做進(jìn)去。優(yōu)點(diǎn)是:程序可靠、成本低。缺點(diǎn):批量要求大,每次修改程序就需要重新做光刻板,不同程序不能同時(shí)生產(chǎn),供貨周期長(zhǎng)。</p><p> 在半導(dǎo)體制造中,許多芯片工藝步驟采用光刻技術(shù),用于這些步驟的圖形“底片”稱為掩膜(也稱作“掩?!保渥饔檬牵涸诠杵线x定的區(qū)域中對(duì)一個(gè)不透明的圖形模板掩膜,繼而下面的腐蝕或擴(kuò)散將只影響選定的區(qū)域)</p><p> 顯而易見,在具
101、體實(shí)現(xiàn)手段和工藝技術(shù)尚未確定的邏輯設(shè)計(jì)階段,軟核具有最大的靈活性,它可以很容易地借助EDA綜合工具與其它外部邏輯結(jié)合為一體。當(dāng)然,由于實(shí)現(xiàn)技術(shù)的不確定性,有可能要作一些改動(dòng)以適應(yīng)相應(yīng)的工藝。相比之下固核和硬核與其它外部邏輯結(jié)合為一體的靈活性要差得多,特別是電路實(shí)現(xiàn)工藝技術(shù)改變時(shí)更是如此。而近年來電路實(shí)現(xiàn)工藝技術(shù)的發(fā)展是相當(dāng)迅速的,為了邏輯電路設(shè)計(jì)成果的積累,和更快更好地設(shè)計(jì)更大規(guī)模的電路,發(fā)展軟核的設(shè)計(jì)和推廣軟核的重用技術(shù)是非常有必要的
102、</p><p> 3.2 模塊設(shè)計(jì)流程</p><p> 主要由兩大主要功能部分組成:</p><p> 1)設(shè)計(jì)開發(fā):即從編寫設(shè)計(jì)文件-->綜合到布局布線-->投片生成這樣一系列步驟。</p><p> 2)設(shè)計(jì)驗(yàn)證:也就是進(jìn)行各種仿真的一系列步驟,如果在仿真過程中發(fā)現(xiàn)問題就返回設(shè)計(jì)輸入進(jìn)行修改。</p>
103、<p> 自頂向下的設(shè)計(jì)過程中在每一層次劃分時(shí)都要對(duì)某些目標(biāo)作優(yōu)化,TOP_DOWN的設(shè)計(jì)過程是理想的設(shè)計(jì)過程,它的缺點(diǎn)是得到的最小單元不標(biāo)準(zhǔn),制造成本可能很高。從底向上的設(shè)計(jì)過程全采用標(biāo)準(zhǔn)基本單元,通常比較經(jīng)濟(jì),但有時(shí)可能不能滿足一些特定的指標(biāo)要求。復(fù)雜數(shù)字邏輯電路和系統(tǒng)的設(shè)計(jì)過程通常是這兩種設(shè)計(jì)方法的結(jié)合,設(shè)計(jì)時(shí)需要考慮多個(gè)目</p><p><b> 標(biāo)的綜合平衡。</b&g
104、t;</p><p><b> 系統(tǒng)設(shè)計(jì):至頂向下</b></p><p><b> 底層電路:至底向上</b></p><p><b> 3.3 門級(jí)結(jié)構(gòu)</b></p><p><b> and 與門</b></p><p&
105、gt;<b> nand 與非門</b></p><p><b> nor 或非門</b></p><p><b> or 或門</b></p><p><b> xor 異或門</b></p><p><b> xnor 異或非門&l
106、t;/b></p><p><b> buf 緩沖器</b></p><p><b> not 非門</b></p><p> 3.4 基本邏輯運(yùn)算</p><p><b> 全加器</b></p><p> Xi 、Yi 表示兩個(gè)加數(shù),
107、Si 表示和,Ci -1 表示來自低位的進(jìn)位、Ci 表示向高</p><p> 位的進(jìn)位。從真值表很容易寫出邏輯表達(dá)式如下:</p><p> 全加器和Si 的表達(dá)式也可以表示為:</p><p> S i = P i ⊕ Ci 其中P i = Xi ⊕ Yi ( 5 . 1 )</p><p> Ci = P i·Ci -
108、 1 + Gi 其中Gi = Xi·Yi ( 5 . 2 )</p><p> 參考清華大學(xué)出版社出版的劉寶琴老師編寫的《數(shù)字電路與系統(tǒng)》,可以很容易地寫出超前進(jìn)位形成電路的邏輯,在這里不再詳細(xì)介紹。</p><p> 16位超前進(jìn)位加法器原理圖</p><p> Verilog實(shí)現(xiàn)加法器:assign {C, Sum } = X + Y;</
109、p><p> Verilog實(shí)現(xiàn)乘法器:assign Product = X * Y;</p><p><b> 3.5 控制邏輯</b></p><p> 組合邏輯:輸出只是當(dāng)前輸入邏輯電平的函數(shù)(有延時(shí)),與電路的原始狀態(tài)無關(guān)的</p><p> 邏輯電路。也就是說,當(dāng)輸入信號(hào)中的任何一個(gè)發(fā)生變化時(shí),輸出都有可能
110、會(huì)根據(jù)其</p><p> 變化而變化,但與電路目前所處的狀態(tài)沒有任何關(guān)系。</p><p> 組合邏輯:由與、或、非門組成的網(wǎng)絡(luò)。常用的組合電路有:多路器、數(shù)據(jù)通路開</p><p> 關(guān)、加法器、乘法器….</p><p> 時(shí)序邏輯:輸出不只是當(dāng)前輸入的邏輯電平的函數(shù),還與電路目前所處的狀態(tài)有關(guān)的</p><
111、p><b> 邏輯電路。</b></p><p> 時(shí)序邏輯: 由多個(gè)觸發(fā)器和多個(gè)組合邏輯塊組成的網(wǎng)絡(luò)。常用的有:計(jì)數(shù)器、復(fù)雜的</p><p> 數(shù)據(jù)流動(dòng)控制邏輯、運(yùn)算控制邏輯、指令分析和操作控制邏輯。同步時(shí)序邏輯是設(shè)計(jì)復(fù)雜的數(shù)字邏輯系統(tǒng)的核心。時(shí)序邏輯借助于狀態(tài)寄存器記住它目前所處的狀態(tài)。在不同的狀態(tài)下,即使所有的輸入都相同,其輸出也不一定相同。<
112、;/p><p><b> 3.6 同步和異步</b></p><p> 1.在Verilog HDL 設(shè)計(jì)中一定要用同步而不能用異步時(shí)序邏輯</p><p> 同步時(shí)序邏輯是指表示狀態(tài)的寄存器組的值只可能在唯一確定的觸發(fā)條件發(fā)生時(shí)刻改變。只能由時(shí)鐘的正跳沿或負(fù)跳沿觸發(fā)的狀態(tài)機(jī)就是一例。always @(posedge clock) 就是一個(gè)同
113、步時(shí)序邏輯的觸發(fā)條件, 表示由該always 控制的begin end 塊中寄存器變量重新賦值的情形只有可能在clock 正跳沿發(fā)生。</p><p> 而異步時(shí)序邏輯是指觸發(fā)條件由多個(gè)控制因素組成,任何一個(gè)因素的跳變都可以引起觸發(fā)。記錄狀態(tài)的寄存器組其時(shí)鐘輸入端不是都連結(jié)在同一個(gè)時(shí)鐘信號(hào)上。例如用一個(gè)觸發(fā)器的輸出連結(jié)到另一個(gè)觸發(fā)器的時(shí)鐘端去觸發(fā)的就是異步時(shí)序邏輯。</p><p>
114、用Verilog HDL 設(shè)計(jì)的可綜合模塊,必須避免使用異步時(shí)序邏輯,這不但是因?yàn)樵S多綜合器不支持異步時(shí)序邏輯的綜合,而且也因?yàn)橛卯惒綍r(shí)序邏輯確實(shí)很難來控制由組合邏輯和延遲所產(chǎn)生</p><p> 的冒險(xiǎn)和競(jìng)爭(zhēng)。當(dāng)電路的復(fù)雜度增加時(shí),異步時(shí)序邏輯無法調(diào)試。工藝的細(xì)微變化也會(huì)造成異</p><p> 步時(shí)序邏輯電路的失效。因?yàn)楫惒綍r(shí)序邏輯中觸發(fā)條件很隨意,任何時(shí)刻都有可能發(fā)生,所以<
115、;/p><p> 記錄狀態(tài)的寄存器組的輸出在任何時(shí)刻都有可能發(fā)生變化.</p><p><b> 2.同步置位與復(fù)位</b></p><p> 同步置位與復(fù)位是指只有在時(shí)鐘的有效跳變沿時(shí)刻置位或復(fù)位信號(hào)才能使觸發(fā)器置位或復(fù)位(即,使觸發(fā)器的輸出分別轉(zhuǎn)變?yōu)檫壿?或0)。不要把set和reset信號(hào)名列入always塊的事件控制表達(dá)式,因?yàn)楫?dāng)它們
116、有變化時(shí)不應(yīng)觸發(fā)always塊的執(zhí)行。相反,always塊的執(zhí)行應(yīng)只由時(shí)鐘有效跳變沿觸發(fā),是否置位或復(fù)位應(yīng)在always塊中首先檢查set和reset信號(hào)的電平。</p><p><b> 事件控制語(yǔ)法:</b></p><p> @(<沿關(guān)鍵詞 時(shí)鐘信號(hào)>)</p><p> 其中沿關(guān)鍵詞指 posedge(正沿觸發(fā))或 n
117、egedge(負(fù)沿觸發(fā))事件控制實(shí)例</p><p> 1) 正沿觸發(fā) @(posedge clk)</p><p> 2) 負(fù)沿觸發(fā) @(negedge clk)</p><p> 3) 同步的具有高電平有效的置位與復(fù)位端的always塊樣板</p><p> always @(posedge clk)</p>&
118、lt;p><b> begin</b></p><p><b> if(reset)</b></p><p><b> begin</b></p><p><b> /*置輸出為0*/</b></p><p><b> end&l
119、t;/b></p><p><b> else</b></p><p><b> if(set)</b></p><p><b> begin</b></p><p><b> /*置輸出為1*/</b></p><p&g
120、t;<b> end</b></p><p><b> else</b></p><p><b> begin</b></p><p> /*與時(shí)鐘同步的邏輯*/</p><p><b> end</b></p><p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- RSA算法的改進(jìn)及其Verilog實(shí)現(xiàn).pdf
- 基于Verilog的頻移鍵控解調(diào)算法的優(yōu)化及實(shí)現(xiàn).pdf
- 推廣渠道整理文檔
- 基于Verilog-A的LDMOS器件建模方法的研究.pdf
- vrp問題的建模及算法研究
- 鑫明影樓方案整理文檔
- 吾國(guó)教育病理整理文檔
- 中醫(yī)藥資料整理,中醫(yī)藥專業(yè)文檔收集,醫(yī)藥類文檔整理
- verilog秒表設(shè)計(jì)
- 房?jī)r(jià)問題數(shù)學(xué)建模論文(整理)
- 《組織行為學(xué)》整理后文檔
- verilog數(shù)字鐘
- 算法開發(fā)文檔模板
- verilog經(jīng)典內(nèi)容講解
- 短文本文檔建模及查詢擴(kuò)展方法研究.pdf
- 經(jīng)典verilog代碼標(biāo)準(zhǔn)
- verilog復(fù)習(xí)題
- verilog的數(shù)據(jù)類型及邏輯系統(tǒng)
- verilog的仿真問題
- verilog考試題
評(píng)論
0/150
提交評(píng)論