Verilog HDL項(xiàng)目式教程 課件 項(xiàng)目3-5 結(jié)構(gòu)化建模;行為建模;狀態(tài)機(jī)建模_第1頁(yè)
Verilog HDL項(xiàng)目式教程 課件 項(xiàng)目3-5 結(jié)構(gòu)化建模;行為建模;狀態(tài)機(jī)建模_第2頁(yè)
Verilog HDL項(xiàng)目式教程 課件 項(xiàng)目3-5 結(jié)構(gòu)化建模;行為建模;狀態(tài)機(jī)建模_第3頁(yè)
Verilog HDL項(xiàng)目式教程 課件 項(xiàng)目3-5 結(jié)構(gòu)化建模;行為建模;狀態(tài)機(jī)建模_第4頁(yè)
Verilog HDL項(xiàng)目式教程 課件 項(xiàng)目3-5 結(jié)構(gòu)化建模;行為建模;狀態(tài)機(jī)建模_第5頁(yè)
已閱讀5頁(yè),還剩109頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

任務(wù)3.1門級(jí)原語(yǔ)

任務(wù)3.2層次建模任務(wù)3.1門級(jí)原語(yǔ)任務(wù)3.1門級(jí)原語(yǔ)簡(jiǎn)單的邏輯電路可以使用邏輯門來(lái)設(shè)計(jì)實(shí)現(xiàn)?;镜倪壿嬮T分為兩類:與/或門類、緩沖/非門類。(1)與/或門類。與/或門類包括與門(and)、或門(or)、與非門(nand)、或非門(nor)、異或門(xor)、同或門(xnor)。與/或門類都具有一個(gè)標(biāo)量輸出端和多個(gè)標(biāo)量輸入端,門的端口列表中的第一個(gè)端口必定是輸出端口,其他均為輸入端口。當(dāng)任意一個(gè)輸入端口的值發(fā)生變化時(shí),輸出端口的值立即重新計(jì)算。例如:(2)緩沖/非門類。緩沖/非門類包括緩沖器(buf)、非門(not)、帶控制端的緩沖器/非門(bufif1、bufif0、notif1、notif0)。緩沖/非門類具有一個(gè)標(biāo)量輸入端和多個(gè)標(biāo)量輸出端,門的端口列表中的最后一個(gè)端口必定是輸入端口,其他均為輸出端口。例如:【例3-1】

利用雙輸入端的nand門,編寫自己的雙輸入端的與門(my_and)、或門(my_or)、非門(my_not)、異或門(my_xor)。上述電路設(shè)計(jì)涉及的知識(shí)點(diǎn)有門級(jí)原語(yǔ)例化和多輸出處理。下面對(duì)這些知識(shí)點(diǎn)進(jìn)行說(shuō)明。(1)門級(jí)原語(yǔ)例化。在門級(jí)原語(yǔ)實(shí)例引用的時(shí)候,可以不指定具體的實(shí)例名,這一點(diǎn)給需要實(shí)例引用幾百個(gè)甚至更多門的模塊提供了方便。但對(duì)于初學(xué)者,建議在調(diào)用門級(jí)原語(yǔ)時(shí)給出實(shí)例名。在以上示例中,調(diào)用門級(jí)原語(yǔ)時(shí)均沒(méi)有給出實(shí)例名。在實(shí)際應(yīng)用中,與非門和或非門更為普遍,這是因?yàn)橛蛇@兩種門生成其他邏輯門容易實(shí)現(xiàn)。本例給出了使用與非門來(lái)設(shè)計(jì)其他基本邏輯門的方法。(2)多輸出處理。例3-1中有4個(gè)輸出y[0]~y[3],分別對(duì)應(yīng)著與門、或門、非門、異或門。這4個(gè)輸出均是獨(dú)立的,在代碼中分別進(jìn)行了單獨(dú)處理。在實(shí)踐中,建議針對(duì)每個(gè)輸出單獨(dú)進(jìn)行分析設(shè)計(jì),這樣做對(duì)于正確地實(shí)現(xiàn)電路邏輯是非常有效的。例3-1的測(cè)試代碼如例3-2所示?!纠?-2】

門電路測(cè)試代碼。上述電路設(shè)計(jì)涉及的知識(shí)點(diǎn)是組合邏輯測(cè)試激勵(lì)的編寫方法。例3-2中將所有輸入變量通過(guò)位拼接運(yùn)算符拼接成一個(gè)變量{bb,aa},然后進(jìn)行循環(huán)加1處理,這樣就可以遍歷所有可能的組合,進(jìn)而可以測(cè)試所有可能組合下的結(jié)果的正確性。與測(cè)試代碼對(duì)應(yīng)的仿真圖如圖3-1所示。根據(jù)圖3-1可以看出,y對(duì)應(yīng)的四路輸出均實(shí)現(xiàn)了相應(yīng)門電路的功能,設(shè)計(jì)正確。邏輯門是最基本的電路單元,任何復(fù)雜的數(shù)字邏輯電路均可由邏輯門實(shí)現(xiàn)。但復(fù)雜電路的設(shè)計(jì)如果從邏輯門開始搭建,顯然是不現(xiàn)實(shí)的,這時(shí)必須采用其他建模方式,層次建模就是一種有效的方法。任務(wù)3.2?層

模首先通過(guò)一個(gè)典型的實(shí)例來(lái)介紹層次建模的概念?!纠?-3】

實(shí)現(xiàn)一個(gè)1位全加器。使用QuartusⅡ軟件綜合的全加器的電路圖如圖3-2所示。由圖3-2可見,全加器是由兩個(gè)半加器和一個(gè)或門組成的。雙擊圖中的半加器,可以看出半加器又由與門、異或門和非門構(gòu)成,如圖3-3所示。上述電路設(shè)計(jì)涉及的知識(shí)點(diǎn)有層次建模、模塊例化。下面對(duì)這些知識(shí)點(diǎn)進(jìn)行說(shuō)明。(1)層次建模。模塊是可以進(jìn)行層次嵌套的,因此,可以將大型數(shù)字電路設(shè)計(jì)分割成不同的小模塊來(lái)實(shí)現(xiàn)特定的功能,最后通過(guò)頂層模塊調(diào)用子模塊來(lái)實(shí)現(xiàn)整體功能。在全加器模塊內(nèi)部調(diào)用了半加器模塊和或門模塊,而在半加器模塊內(nèi)部又調(diào)用了基本邏輯門原語(yǔ)。在層次建模中,不管是頂層模塊還是被調(diào)用模塊內(nèi)部,其實(shí)現(xiàn)方式都可以使用多種方式,包括數(shù)據(jù)流建模、行為建模、結(jié)構(gòu)化建模、狀態(tài)機(jī)建模等。例如,在例3-3中,或門模塊內(nèi)部使用了數(shù)據(jù)流建模,使用了連續(xù)賦值語(yǔ)句assign。(2)模塊例化。在全加器模塊中有兩處調(diào)用了半加器:h_adderu0(ain,bin,d,e);?和h_adderu1(e,cin,f,sum);。每次調(diào)用均給出一個(gè)唯一的實(shí)例名,調(diào)用時(shí)端口列表名稱不同。在Verilog設(shè)計(jì)中,模塊調(diào)用時(shí),可以按順序?qū)⒛K定義的端口與外部環(huán)境中的信號(hào)連接起來(lái),這種方法稱為按順序連接。h_adderu0(ain,bin,d,e);?調(diào)用將ain、bin、d、e分別與模塊定義中的端口a、b、co、so連接;h_adderu1(e,cin,f,sum);?調(diào)用將e、cin、f、sum分別與模塊定義中的端口a、b、co、so連接。全加器的仿真波形如圖3-4所示。從仿真波形中可以看出,該設(shè)計(jì)完成了一位全加器的功能。與仿真波形相應(yīng)的測(cè)試代碼如下:【例3-4】1位全加器測(cè)試模塊。上述仿真代碼涉及的知識(shí)點(diǎn)有模塊例化、輸入激勵(lì)。下面對(duì)這些知識(shí)點(diǎn)進(jìn)行說(shuō)明。(1)模塊例化。仿真代碼中的模塊例化與設(shè)計(jì)代碼中的模塊例化其方法完全相同。(2)輸入激勵(lì)。輸入激勵(lì)要簡(jiǎn)潔,同時(shí)要保證輸入激勵(lì)全面且有代表性。對(duì)于3個(gè)輸入的組合邏輯電路來(lái)說(shuō),3個(gè)輸入的8種組合必須都測(cè)試,最簡(jiǎn)單的方法就是?{cin,bin,ain}={cin,bin,ain}?+?1;?,這樣就可以保證3個(gè)輸入的所有可能組合都被測(cè)試到。鑒于大型電路設(shè)計(jì)越來(lái)越多,團(tuán)隊(duì)合作分工越來(lái)越普遍,因此層次建模在實(shí)際應(yīng)用中非常普遍。下面對(duì)層次建模、模塊實(shí)例化、端口關(guān)聯(lián)等進(jìn)一步進(jìn)行補(bǔ)充說(shuō)明。(1)層次建模。數(shù)字電路設(shè)計(jì)中有兩種基本的設(shè)計(jì)方法:自底向上和自頂向下。在自頂向下設(shè)計(jì)方法中,首先定義頂層模塊,隨后將頂層模塊分解為多個(gè)必要的子模塊,然后進(jìn)一步對(duì)各個(gè)子模塊進(jìn)行分解,直到達(dá)到無(wú)法進(jìn)一步分解的底層功能塊,如圖3-5所示。在自底向上設(shè)計(jì)方法中,首先對(duì)現(xiàn)有的功能塊進(jìn)行分析,然后使用這些模塊來(lái)搭建規(guī)模大一些的功能塊,如此繼續(xù),直到頂層模塊,如圖3-6所示。在典型的設(shè)計(jì)中,這兩種方法是混合使用的。為了說(shuō)明層次建模的概念,下面結(jié)合全加器進(jìn)行說(shuō)明。根據(jù)全加器的電路圖,可以得出全加器的設(shè)計(jì)層次如圖3-7所示。使用自頂向下的方法進(jìn)行設(shè)計(jì),首先需要說(shuō)明全加器的功能。在使用半加器和或門搭建頂層模塊之后,進(jìn)一步使用與門、異或門和非門來(lái)實(shí)現(xiàn)半加器。這樣就可以將較大的功能塊分解為較小的功能塊,直到無(wú)法繼續(xù)分解。對(duì)于例3-4,我們可以認(rèn)為基本門就是最小的功能塊,不可再分解。事實(shí)上,這些基本門是可以繼續(xù)分解的,這里就隱含著自底向上的設(shè)計(jì)方法。各種門級(jí)元件都是由MOS晶體管級(jí)開關(guān)元件構(gòu)成的,都經(jīng)過(guò)了優(yōu)化設(shè)計(jì),都可以用來(lái)搭建高層模塊。對(duì)于例3-4來(lái)說(shuō),自頂向下的設(shè)計(jì)方法和自底向上的設(shè)計(jì)方法按相反的方向獨(dú)立地進(jìn)行,在門級(jí)會(huì)合。這樣電路設(shè)計(jì)者使用開關(guān)級(jí)原語(yǔ)創(chuàng)建了一個(gè)底層元件庫(kù),而邏輯設(shè)計(jì)者通過(guò)使用自頂向下的方法將整個(gè)設(shè)計(jì)用由庫(kù)單元構(gòu)成的結(jié)構(gòu)來(lái)描述。(2)模塊實(shí)例化。在頂層模塊中,調(diào)用了2個(gè)半加器子模塊和一個(gè)或門子模塊。模塊的調(diào)用過(guò)程稱為模塊的實(shí)例化,調(diào)用模塊后創(chuàng)建的對(duì)象稱為實(shí)例。模塊實(shí)例化是實(shí)現(xiàn)自頂向下設(shè)計(jì)的一種重要途徑。模塊實(shí)例化可以是多層次的,一個(gè)調(diào)用了較低層次模塊的模塊,可以被更高層次的模塊調(diào)用。例如,例3-4中,可以先設(shè)計(jì)一個(gè)異或門模塊,這個(gè)模塊在半加器中被實(shí)例化,半加器模塊又在全加器模塊中被實(shí)例化。需要說(shuō)明的是,模塊的調(diào)用(實(shí)例化)與C語(yǔ)言中的函數(shù)調(diào)用有著本質(zhì)的區(qū)別。模塊被調(diào)用后會(huì)生成一個(gè)實(shí)例,這個(gè)實(shí)例可以使用實(shí)例名對(duì)其進(jìn)行唯一標(biāo)識(shí)。如果在某個(gè)模塊內(nèi)出現(xiàn)了多次模塊調(diào)用,則各次調(diào)用所指定的實(shí)例名必須不相同,在同一模塊內(nèi)不能出現(xiàn)兩個(gè)相同的實(shí)例名。同一個(gè)上級(jí)模塊可以對(duì)多個(gè)下級(jí)模塊進(jìn)行調(diào)用,也可以對(duì)一個(gè)下級(jí)模塊進(jìn)行多次調(diào)用。這樣就會(huì)在同一電路中生成多個(gè)一模一樣的電路結(jié)構(gòu)單元,這些電路結(jié)構(gòu)單元就是每次模塊調(diào)用后生成的模塊實(shí)例。所以,為了對(duì)這些相同的電路結(jié)構(gòu)單元進(jìn)行區(qū)分,為它們所取的模塊實(shí)例名應(yīng)該是各不相同的。實(shí)例名和模塊名的區(qū)別是:模塊名標(biāo)志著不同的模塊,用來(lái)區(qū)分電路單元的不同種類;而實(shí)例名則標(biāo)志著不同的模塊實(shí)例,用來(lái)區(qū)別電路系統(tǒng)中的不同硬件電路單元。在測(cè)試模塊時(shí),也需要對(duì)設(shè)計(jì)模塊進(jìn)行例化,并對(duì)設(shè)計(jì)模塊的輸入信號(hào)增加激勵(lì)。(3)端口關(guān)聯(lián)。在模塊實(shí)例化中,端口起著非常重要的作用。端口是模塊與外界環(huán)境交互的接口,事實(shí)上,我們的模塊可以理解為一顆芯片,端口可理解為芯片的管腳。對(duì)于外部環(huán)境來(lái)說(shuō),模塊內(nèi)部是不可見的,對(duì)模塊的實(shí)例化只能通過(guò)其端口進(jìn)行。這種特點(diǎn)為設(shè)計(jì)者提供了很大的靈活性,只要端口保持不變,就可以對(duì)模塊內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)作任意修改。在模塊實(shí)例化中,可以使用兩種方法將模塊定義的端口與外部環(huán)境中的信號(hào)連接起來(lái),即位置關(guān)聯(lián)法和名稱關(guān)聯(lián)法。①

位置關(guān)聯(lián)法。在位置關(guān)聯(lián)方法下,端口連接表的格式為(<端口1>,<端口2>,…,<端口n>)這些信號(hào)端口將與進(jìn)行模塊定義時(shí)給出的“端口列表”中出現(xiàn)的各個(gè)模塊端口依次相連:端口連接表中的端口1與第1個(gè)模塊端口相連,端口連接表中的端口2與第2個(gè)模塊端口相連,以此類推。在全加器的Verilog描述中,采用了位置關(guān)聯(lián)的方法,即以下三條實(shí)例語(yǔ)句:h_adderu0(ain,bin,d,e);h_adderu1(e,cin,f,sum);or2au2(d,f,cout);②

名稱關(guān)聯(lián)法。在名稱關(guān)聯(lián)方法下,端口連接表的格式為(.<模塊端口1>(<端口1>),.<模塊端口2>(<端口2>),…,.<模塊端口n>(<端口n>))端口連接表內(nèi)顯式地指明了與每個(gè)外部信號(hào)端口相連的模塊端口名,即模塊端口1所代表的端口將與端口1相連,依次類推。在全加器的Verilog描述中,若采用名稱關(guān)聯(lián)的方法,則需要用以下三條實(shí)例語(yǔ)句來(lái)替換相應(yīng)的位置關(guān)聯(lián)語(yǔ)句。需要說(shuō)明的是,不能在同一個(gè)端口連接表內(nèi)混合使用名稱關(guān)聯(lián)和位置關(guān)聯(lián)。例如,下面這條語(yǔ)句是非法的:但對(duì)于不同的實(shí)例語(yǔ)句,則可以選擇不同的端口關(guān)聯(lián)方法。例如,下面的語(yǔ)句共存于同一個(gè)模塊中是合法的:另外,在端口名稱關(guān)聯(lián)方法下,模塊端口和信號(hào)端口的連接關(guān)系被顯式地說(shuō)明,因此,端口連接表內(nèi)各項(xiàng)的排列順序?qū)Χ丝谶B接關(guān)系是沒(méi)有影響的。例如,在全加器中對(duì)于半加器的實(shí)例化語(yǔ)句可寫成:這樣在大型設(shè)計(jì)中可以避免端口連接錯(cuò)誤。任務(wù)4.1結(jié)構(gòu)化過(guò)程語(yǔ)句always

任務(wù)4.2過(guò)程賦值語(yǔ)句

任務(wù)4.3選擇語(yǔ)句

任務(wù)4.4循環(huán)語(yǔ)句

任務(wù)4.5塊語(yǔ)句(begin/end)

任務(wù)4.6任務(wù)和函數(shù)語(yǔ)句

任務(wù)4.7流水線設(shè)計(jì)任務(wù)4.1結(jié)構(gòu)化過(guò)程語(yǔ)句always

always語(yǔ)句是行為建模的基本語(yǔ)句,每個(gè)always語(yǔ)句代表一個(gè)獨(dú)立的執(zhí)行過(guò)程,也稱為進(jìn)程。與C語(yǔ)言不同,Verilog在本質(zhì)上是并發(fā)的而非順序的,Verilog的各個(gè)always進(jìn)程也是并發(fā)執(zhí)行的,而不是順序執(zhí)行的。always語(yǔ)句對(duì)應(yīng)著實(shí)際的硬件電路。always@(*)通常對(duì)應(yīng)組合邏輯電路。always@(posedgeclk)對(duì)應(yīng)時(shí)序邏輯電路,相當(dāng)于一個(gè)D觸發(fā)器和一個(gè)組合邏輯電路,其中組合邏輯電路的輸出直接連接D觸發(fā)器的數(shù)據(jù)輸入端。always語(yǔ)句包括的所有行為語(yǔ)句構(gòu)成了一個(gè)always語(yǔ)句塊。每個(gè)always語(yǔ)句塊在滿足一定的條件后即執(zhí)行其中的第一條語(yǔ)句,然后按順序執(zhí)行隨后的語(yǔ)句,直到最后一條執(zhí)行完成后,再次等待always語(yǔ)句塊的執(zhí)行條件,等條件滿足后又從第一條語(yǔ)句開始執(zhí)行,循環(huán)往復(fù)。因此,always語(yǔ)句通常用于對(duì)數(shù)字電路中一組反復(fù)執(zhí)行的活動(dòng)進(jìn)行建模?!纠?-1】

使用always語(yǔ)句描述D觸發(fā)器。例4-1的綜合結(jié)果如圖4-1所示。從綜合結(jié)果來(lái)看,例4-1實(shí)現(xiàn)了一個(gè)上升沿觸發(fā)的D觸發(fā)器。上述電路設(shè)計(jì)涉及的知識(shí)點(diǎn)有always語(yǔ)句、非阻塞賦值語(yǔ)句。下面對(duì)這些知識(shí)點(diǎn)進(jìn)行說(shuō)明。(1)?always語(yǔ)句。always語(yǔ)句是行為建模的典型特征。例4-1的程序在時(shí)鐘上升沿將數(shù)據(jù)d賦予觸發(fā)器輸出q,功能同D觸發(fā)器一樣。always語(yǔ)句由于其不斷重復(fù)執(zhí)行的特性,只有和一定的時(shí)序控制結(jié)合在一起才有用。always@(posedgeclk)語(yǔ)句表示只有在clk上升沿才開始執(zhí)行always語(yǔ)句塊,否則不執(zhí)行。這種時(shí)序控制是always語(yǔ)句最常用的。always的時(shí)序控制可以是沿觸發(fā)的,也可以是電平觸發(fā)的,可以是單個(gè)信號(hào)或多個(gè)信號(hào),中間需要用關(guān)鍵字or或“,”連接。例如:沿觸發(fā)的always塊常用來(lái)描述時(shí)序邏輯,如果符合可綜合風(fēng)格要求,則可用綜合工具將其自動(dòng)轉(zhuǎn)換為表示時(shí)序邏輯的寄存器組和門級(jí)邏輯;而電平觸發(fā)的always塊常用來(lái)描述組合邏輯和帶鎖存器的組合邏輯,如果符合可綜合風(fēng)格要求,則可轉(zhuǎn)換為表示組合邏輯的門級(jí)邏輯或帶鎖存器的組合邏輯。一個(gè)模塊中可以有多個(gè)always塊,它們都是并行運(yùn)行的。(2)always語(yǔ)句對(duì)應(yīng)的電路。always@(*)通常對(duì)應(yīng)組合邏輯電路。always@(posedgeclk)對(duì)應(yīng)的是時(shí)序邏輯電路,相當(dāng)于一個(gè)D觸發(fā)器和一個(gè)組合邏輯電路,其中組合邏輯電路的輸出直接連接D觸發(fā)器的數(shù)據(jù)輸入端。本書建議每個(gè)always語(yǔ)句塊通常都實(shí)現(xiàn)且僅實(shí)現(xiàn)一個(gè)輸出變量。這是因?yàn)橐粋€(gè)D觸發(fā)器通常僅有一個(gè)輸出變量Q,這種實(shí)現(xiàn)方法與實(shí)際電路的對(duì)應(yīng)關(guān)系清晰明了。(3)非阻塞賦值語(yǔ)句。q<=d;中使用的是非阻塞賦值語(yǔ)句。非阻塞賦值語(yǔ)句是過(guò)程賦值語(yǔ)句的一種類型。讀者應(yīng)掌握阻塞賦值語(yǔ)句和非阻塞賦值語(yǔ)句的特征。任務(wù)4.2?過(guò)程賦值語(yǔ)句過(guò)程賦值語(yǔ)句的更新對(duì)象是寄存器、整數(shù)等。這些類型的變量在被賦值后,其值將保持不變,直到被其他過(guò)程賦值語(yǔ)句賦予新值。過(guò)程賦值語(yǔ)句與數(shù)據(jù)流建模中的連續(xù)賦值語(yǔ)句是不同的。首先,連續(xù)賦值語(yǔ)句總是處于活動(dòng)狀態(tài),任意一個(gè)操作數(shù)的變化都會(huì)導(dǎo)致表達(dá)式的重新計(jì)算以及重新賦值,但過(guò)程賦值語(yǔ)句只有在執(zhí)行到的時(shí)候才會(huì)起作用。其次,更新對(duì)象不同,連續(xù)賦值語(yǔ)句的更新對(duì)象是線網(wǎng),而過(guò)程賦值語(yǔ)句的更新對(duì)象是寄存器、整數(shù)等。最后,形式不同,過(guò)程賦值語(yǔ)句不使用assign。過(guò)程賦值語(yǔ)句與連續(xù)賦值語(yǔ)句又有相同之處,即兩者可以使用的運(yùn)算符是完全相同的。連續(xù)賦值語(yǔ)句中使用的運(yùn)算符在過(guò)程賦值語(yǔ)句中同樣適用,而且含義完全相同。Verilog包括兩種類型的過(guò)程賦值語(yǔ)句:阻塞賦值語(yǔ)句和非阻塞賦值語(yǔ)句。下面通過(guò)5個(gè)示例來(lái)說(shuō)明兩種賦值方式的不同。這5個(gè)示例的設(shè)計(jì)目標(biāo)都是實(shí)現(xiàn)3位移位寄存器,它們分別采用了阻塞賦值方式和非阻塞賦值方式?!纠?-2】

采用阻塞賦值方式描述移位寄存器1。

綜合結(jié)果如圖4-2所示。【例4-3】

采用阻塞賦值方式描述移位寄存器2。

綜合結(jié)果如圖4-3所示。【例4-4】

阻塞賦值方式描述的移位寄存器3。

綜合結(jié)果如圖4-4所示?!纠?-5】

采用非阻塞賦值方式描述移位寄存器1。

【例4-6】

采用非阻塞賦值方式描述移

位寄存器2。例4-5和例4-6的綜合結(jié)果與例4-2的完全一致,如圖4-2所示。例4-2~例4-6的電路設(shè)計(jì)涉及的知識(shí)點(diǎn)有過(guò)程賦值語(yǔ)句、阻塞賦值、非阻塞賦值。下面對(duì)這些知識(shí)點(diǎn)進(jìn)行說(shuō)明。(1)阻塞賦值。例4-2~例4-65個(gè)例題的設(shè)計(jì)目標(biāo)均是實(shí)現(xiàn)3位移位寄存器,但從綜合結(jié)果可以看出,例4-3和例4-4沒(méi)有實(shí)現(xiàn)設(shè)計(jì)目標(biāo),這與這兩個(gè)設(shè)計(jì)中使用了阻塞賦值有關(guān)。Q2=Q1;這種賦值方式稱為阻塞賦值,Q2的值在賦值語(yǔ)句執(zhí)行完成后立刻改變,而且隨后的語(yǔ)句必須在賦值語(yǔ)句執(zhí)行完成后才能繼續(xù)執(zhí)行。所以,例4-4中的三條語(yǔ)句Q0=D,Q1=Q0,Q2=Q1,執(zhí)行完成后,Q0、Q1、Q2的值都變化為D的值。也就是說(shuō),D的值同時(shí)賦給了Q0、Q1、Q2,參照其綜合結(jié)果就能更清晰地看到這一點(diǎn)。例4-2和例4-3可通過(guò)同樣的分析得出與綜合結(jié)果一致的結(jié)論。(2)非阻塞賦值。Q2<=Q1;這種賦值方式稱為非阻塞賦值,Q2的值在賦值語(yǔ)句執(zhí)行完成后并不會(huì)立刻改變,而是等到整個(gè)always語(yǔ)句塊結(jié)束后才完成賦值操作。所以,例4-6中的三條語(yǔ)句Q0<=D,Q2<=Q1,Q1<=Q0,執(zhí)行完成后,Q0、Q1、Q2的值并沒(méi)有立刻更新,而是保持了原來(lái)的值,直到always語(yǔ)句塊結(jié)束后才同時(shí)進(jìn)行賦值,因此Q0的值變?yōu)榱薉的值,Q2的值變?yōu)榱嗽瓉?lái)Q1的值,Q1的值變?yōu)榱嗽瓉?lái)Q0的值(而不是剛剛更新的Q0的值D),參照其綜合結(jié)果能更清晰地看到這一點(diǎn)。例4-5可通過(guò)同樣的分析得出與綜合結(jié)果一致的結(jié)論。(3)過(guò)程賦值語(yǔ)句總結(jié)。前三個(gè)例題采用的是阻塞賦值方式,可以看出阻塞賦值語(yǔ)句在always塊語(yǔ)句中的位置對(duì)其結(jié)果有影響;后兩個(gè)例題采用的是非阻塞賦值方式,可以看出非阻塞賦值語(yǔ)句在always塊語(yǔ)句中的位置對(duì)其結(jié)果沒(méi)有影響。因此,在使用賦值語(yǔ)句時(shí)要注意兩者的區(qū)別與聯(lián)系。在電路設(shè)計(jì)中,注意非阻塞賦值“<=”只能用于對(duì)寄存器類型變量進(jìn)行賦值,因此只能用于“initial”塊和“always”塊中,不允許用于連續(xù)賦值語(yǔ)句“assign”;而阻塞賦值“=”既可以對(duì)線網(wǎng)類型變量賦值,也可以對(duì)寄存器類型變量進(jìn)行賦值,因此既可以用于“initial”塊和“always”塊中,也可以用于連續(xù)賦值語(yǔ)句“assign”,但阻塞賦值通常用于連續(xù)賦值語(yǔ)句中。綜上所述,在選擇使用阻塞賦值和非阻塞賦值時(shí),為了防止引起歧義或產(chǎn)生混亂,建議在實(shí)現(xiàn)組合邏輯時(shí)統(tǒng)一使用阻塞賦值,在實(shí)現(xiàn)時(shí)序邏輯時(shí)統(tǒng)一使用非阻塞賦值。任務(wù)4.3?選

語(yǔ)

句一、if條件語(yǔ)句if-else語(yǔ)句用來(lái)判定所給定的條件是否滿足,根據(jù)判定結(jié)果(真或假)決定執(zhí)行給出的兩種操作之一。VerilogHDL語(yǔ)言提供了三種形式的if語(yǔ)句。(1)第1種if條件語(yǔ)句如下所示。(3)第3種if條件語(yǔ)句如下所示。(2)第2種if條件語(yǔ)句如下所示。

下面是一個(gè)使用if語(yǔ)句的例子。【例4-7】

使用always語(yǔ)句描述具有異步復(fù)位功能的D觸發(fā)器。

綜合結(jié)果如圖4-5所示。上述電路設(shè)計(jì)涉及的知識(shí)點(diǎn)有if條件語(yǔ)句和異步復(fù)位。下面對(duì)這些知識(shí)點(diǎn)進(jìn)行說(shuō)明。(1)異步復(fù)位。always@(posedgeclk,negedgerst)語(yǔ)句表示只有在clk上升沿或者rst下降沿才開始執(zhí)行always語(yǔ)句塊,否則不執(zhí)行。所以,D觸發(fā)器的復(fù)位為異步復(fù)位。這種帶有異步復(fù)位的時(shí)序邏輯電路的寫法可作為時(shí)序邏輯電路設(shè)計(jì)的模板。(2)?if條件語(yǔ)句。三種形式的if語(yǔ)句中,if后面都有“表達(dá)式”,一般為邏輯表達(dá)式或關(guān)系表達(dá)式。系統(tǒng)對(duì)表達(dá)式的值進(jìn)行判斷,若為1,則按“真”處理;否則按“假”處理,執(zhí)行指定的語(yǔ)句。三種形式的if語(yǔ)句中,語(yǔ)句后都有分號(hào)。這是由于分號(hào)是VerilogHDL語(yǔ)句中不可缺少的部分,這個(gè)分號(hào)是if語(yǔ)句中的內(nèi)嵌套語(yǔ)句所要求的。但應(yīng)注意,不要誤認(rèn)為if和else是兩個(gè)語(yǔ)句,其實(shí)它們都屬于同一個(gè)if語(yǔ)句。else子句不能作為語(yǔ)句單獨(dú)使用,它必須是if語(yǔ)句的一部分,且與離它最近的if配對(duì)使用。例4-7中的程序使用了第2種if語(yǔ)句形式——if…else的條件語(yǔ)句,在時(shí)鐘上升沿的時(shí)刻,首先判斷復(fù)位信號(hào)rst是否有效,若有效則將D觸發(fā)器輸出置0,否則將數(shù)據(jù)d賦予D觸發(fā)器輸出。if(!rst)等同于if(rst==0),Verilog允許這些形式的表達(dá)式簡(jiǎn)寫方式。在if和else后面可以包含一個(gè)語(yǔ)句,也可以有多個(gè)操作語(yǔ)句,此時(shí)用begin和end這兩個(gè)關(guān)鍵詞將幾個(gè)語(yǔ)句包含起來(lái)成為一個(gè)復(fù)合塊語(yǔ)句。例如:注意:end后不需要加分號(hào)。因?yàn)閎egin…end內(nèi)是一個(gè)完整的復(fù)合語(yǔ)句,不需再附加分號(hào)。(3)?if語(yǔ)句的嵌套。在if語(yǔ)句中又包含一個(gè)或多個(gè)if語(yǔ)句,稱為if語(yǔ)句的嵌套。if語(yǔ)句嵌套的一般形式如下:進(jìn)行電路設(shè)計(jì)時(shí)應(yīng)注意if與else的配對(duì)關(guān)系,else總是與它上面距離最近的if配對(duì)。如果if與else的數(shù)目不一樣,則為了實(shí)現(xiàn)程序設(shè)計(jì)者的意圖,可以用begin…end塊語(yǔ)句來(lái)確定配對(duì)關(guān)系。例如:這時(shí)begin_end塊語(yǔ)句限定了內(nèi)嵌if語(yǔ)句的范圍,因此else與第一個(gè)if配對(duì)。注意begin_end塊語(yǔ)句在if_else語(yǔ)句中的使用。二、case多路分支語(yǔ)句case語(yǔ)句是一種多分支選擇語(yǔ)句,基本的if語(yǔ)句只有兩個(gè)分支可供選擇,而實(shí)際設(shè)計(jì)中常常需要用到多分支選擇,Verilog語(yǔ)言提供的case語(yǔ)句可直接處理多分支選擇。case語(yǔ)句的一般形式如下:case(表達(dá)式) <case分支項(xiàng)> endcasecase分支項(xiàng)的一般格式如下:分支表達(dá)式: 語(yǔ)句;缺省項(xiàng)(default項(xiàng)): 語(yǔ)句;case后面()內(nèi)的表達(dá)式稱為控制表達(dá)式,case分支項(xiàng)中的表達(dá)式稱為分支表達(dá)式??刂票磉_(dá)式通常表示為控制信號(hào)的某些位,分支表達(dá)式則用這些控制信號(hào)的具體狀態(tài)值來(lái)表示,因此,分支表達(dá)式又稱為常量表達(dá)式。當(dāng)控制表達(dá)式的值與分支表達(dá)式的值相等時(shí),就執(zhí)行分支表達(dá)式后面的語(yǔ)句。如果所有的分支表達(dá)式的值都沒(méi)有與控制表達(dá)式的值相匹配,就執(zhí)行default后面的語(yǔ)句。default項(xiàng)可有可無(wú),一個(gè)case語(yǔ)句里只允許有一個(gè)default項(xiàng)。下面是一個(gè)簡(jiǎn)單的使用case語(yǔ)句的例子?!纠?-8】

使用case語(yǔ)句實(shí)現(xiàn)四功能的算術(shù)邏輯單元(ALU)設(shè)計(jì),其輸入信號(hào)a、b均為4位,功能選擇信號(hào)sel為2位,輸出信號(hào)out為5位,具體關(guān)系如表4-1所示。例4-8的功能仿真結(jié)果如圖4-6所示。上述電路設(shè)計(jì)涉及的知識(shí)點(diǎn)有case語(yǔ)句和鎖存器。下面對(duì)這些知識(shí)點(diǎn)進(jìn)行說(shuō)明。(1)?case語(yǔ)句。在用case語(yǔ)句表達(dá)式進(jìn)行比較的過(guò)程中,只有當(dāng)信號(hào)的對(duì)應(yīng)位的值能明確進(jìn)行比較時(shí),比較才能成功,因此應(yīng)詳細(xì)說(shuō)明case分項(xiàng)的分支表達(dá)式的值。case語(yǔ)句的所有表達(dá)式的值的位寬必須相等,只有這樣控制表達(dá)式和分支表達(dá)式才能進(jìn)行對(duì)應(yīng)位的比較。每一個(gè)case分項(xiàng)的分支表達(dá)式的值必須互不相同,否則就會(huì)出現(xiàn)矛盾現(xiàn)象(對(duì)表達(dá)式的同一個(gè)值有多種執(zhí)行方案,對(duì)應(yīng)到實(shí)際的電路,則會(huì)表現(xiàn)出電路不穩(wěn)定)。執(zhí)行完case分項(xiàng)后的語(yǔ)句后,跳出該case語(yǔ)句結(jié)構(gòu),終止case語(yǔ)句的執(zhí)行。(2)鎖存器。如果條件語(yǔ)句或多路分支語(yǔ)句使用不當(dāng),則會(huì)在設(shè)計(jì)中生成原本沒(méi)有的鎖存器。對(duì)于多路選擇語(yǔ)句使用不當(dāng)?shù)氖纠缦拢荷鲜鯿ase語(yǔ)句的功能是:在某個(gè)信號(hào)sel取不同的值時(shí),會(huì)給另一個(gè)信號(hào)q賦不同的值。always塊中說(shuō)明:如果sel?=?0,q取a值;而當(dāng)sel?=?2'b11,q取b的值。如果sel取2'b00和2'b11以外的值時(shí),在always塊內(nèi),默認(rèn)為q保持原值,這樣就自動(dòng)生成了鎖存器。如果希望當(dāng)sel取2'b00和2'b11以外的值時(shí)q賦為0,則default就必不可少了,如下例所示。程序中的case語(yǔ)句有default項(xiàng),指明如果sel不取2'b00或2'b11時(shí),編譯器或仿真器應(yīng)賦給q的值。整個(gè)Verilog程序模塊綜合出來(lái)后,always塊對(duì)應(yīng)的部分不會(huì)生成鎖存器。也就是說(shuō),在多路分支語(yǔ)句中使用default語(yǔ)句,可避免生成鎖存器。對(duì)于條件語(yǔ)句使用不當(dāng)?shù)氖纠缦拢荷鲜鯽lways語(yǔ)句塊中,if語(yǔ)句說(shuō)明當(dāng)a?=?1時(shí),q取d的值。當(dāng)a?=?0時(shí),沒(méi)有定義q的取值。在always塊內(nèi),如果在給定的條件下變量沒(méi)有賦值,這個(gè)變量將保持原值,也就是說(shuō)會(huì)生成一個(gè)鎖存器。如果希望當(dāng)a?=?0時(shí)q的值為0,else項(xiàng)就必不可少,如下例所示。整個(gè)Verilog程序模塊綜合出來(lái)后,always塊對(duì)應(yīng)的部分不會(huì)生成鎖存器。以上示例介紹了怎樣來(lái)避免偶然生成鎖存器的錯(cuò)誤。如果使用if語(yǔ)句,應(yīng)寫上else項(xiàng);如果使用case語(yǔ)句,則應(yīng)寫上default項(xiàng)。遵循上面兩條原則,就可以避免發(fā)生生成鎖存器的錯(cuò)誤,使設(shè)計(jì)者更加明確設(shè)計(jì)目標(biāo),同時(shí)也增強(qiáng)了Verilog程序的可讀性。下面分別使用if-else語(yǔ)句和case語(yǔ)句來(lái)實(shí)現(xiàn)四選一多路選擇器,以使讀者體會(huì)兩種語(yǔ)句的差別與聯(lián)系?!纠?-9】

四選一多路選擇器。綜合得出的電路圖如圖4-7所示。例4-9對(duì)應(yīng)的測(cè)試代碼如例4-10所示?!纠?-10】

四選一多路選擇器測(cè)試臺(tái)。仿真波形如圖4-8所示。從圖4-8的仿真波形可以看出,out_if和out_case在相同輸入激勵(lì)的情況下,輸出波形完全一致,這說(shuō)明case語(yǔ)句與if/else語(yǔ)句是可以很容易地相互轉(zhuǎn)換。例4-10使用if-else語(yǔ)句實(shí)現(xiàn)out_if,使用case語(yǔ)句實(shí)現(xiàn)out_case。從綜合得到的電路圖來(lái)看,雖然電路結(jié)構(gòu)差異較大,但實(shí)現(xiàn)的功能都是四選一多路選擇器,條件和輸出都一樣。上述電路設(shè)計(jì)和電路仿真中涉及的知識(shí)點(diǎn)是:if條件語(yǔ)句、case語(yǔ)句、選擇語(yǔ)句、鎖存器。三、選擇語(yǔ)句總結(jié)選擇語(yǔ)句包括if-else語(yǔ)句和case語(yǔ)句,是可綜合電路設(shè)計(jì)中最常使用的語(yǔ)句。選擇語(yǔ)句必須在initial和always語(yǔ)句塊中使用。在always語(yǔ)句塊內(nèi),如果在給定的條件下變量沒(méi)有賦值,這個(gè)變量將保持原值,也就是說(shuō)會(huì)生成一個(gè)鎖存器。下面對(duì)選擇語(yǔ)句的使用作一些總結(jié)。(1)選擇語(yǔ)句。條件語(yǔ)句if和多路分支語(yǔ)句case只能用在always語(yǔ)句塊中,也就是只能用在行為建模中。if條件語(yǔ)句和case語(yǔ)句都屬于選擇語(yǔ)句。case語(yǔ)句與if…else語(yǔ)句可以很容易地相互轉(zhuǎn)換,但與case語(yǔ)句中的控制表達(dá)式和多分支表達(dá)式的結(jié)構(gòu)相比,if…else結(jié)構(gòu)中的條件表達(dá)式更為直觀一些。case語(yǔ)句經(jīng)常用于實(shí)現(xiàn)基于真值表的組合邏輯電路設(shè)計(jì)和基于狀態(tài)機(jī)的時(shí)序邏輯電路設(shè)計(jì)。(2)鎖存器。前面在介紹case語(yǔ)句時(shí)已經(jīng)介紹了鎖在器的知識(shí)點(diǎn),下面對(duì)該知識(shí)點(diǎn)作一個(gè)總結(jié)。if-else和case這兩種分支語(yǔ)句經(jīng)常會(huì)產(chǎn)生Latch。Latch就是鎖存器,是一種在異步電路系統(tǒng)中,對(duì)輸入信號(hào)電平敏感的單元,用來(lái)存儲(chǔ)信息。鎖存器在數(shù)據(jù)未鎖存時(shí),輸出端的信號(hào)隨輸入信號(hào)變化,就像信號(hào)通過(guò)一個(gè)緩沖器,一旦鎖存信號(hào)有效,則數(shù)據(jù)被鎖存,輸入信號(hào)不起作用??赡墚a(chǎn)生Latch的幾種情況包括:①

組合邏輯中if-else條件分支語(yǔ)句缺少else語(yǔ)句。②

組合邏輯中case條件分支語(yǔ)句條件未完全列舉,且缺少default語(yǔ)句。③

組合邏輯中輸出變量賦值給自己。解決辦法如下:①if-else要涵蓋所有可能。②case語(yǔ)句列舉所有條件,如果不能列出所有條件,則應(yīng)添加default語(yǔ)句。(3)選擇語(yǔ)句的使用原則。硬件電路設(shè)計(jì)過(guò)程中,對(duì)變量賦值應(yīng)考慮各種情況,即針對(duì)各種情況變量的結(jié)果都要進(jìn)行明確的說(shuō)明。下面用兩段代碼完成同一功能的示例來(lái)進(jìn)行說(shuō)明。推薦的設(shè)計(jì)代碼如下:上面的示例中,兩段代碼都是正確的。但推薦的設(shè)計(jì)代碼說(shuō)明了在各種情況下cnt的取值;而不推薦的設(shè)計(jì)代碼中沒(méi)有明確說(shuō)明各種情況下cnt的取值,需要讀者進(jìn)一步分析代碼,才能理解cnt的變化情況。任務(wù)4.4?循

環(huán)

語(yǔ)

句在VerilogHDL中常用的可綜合的循環(huán)語(yǔ)句有repeat和for,用來(lái)控制執(zhí)行語(yǔ)句的執(zhí)行次數(shù)。repeat用于將一條語(yǔ)句連續(xù)執(zhí)行n次。for通過(guò)以下三個(gè)步驟來(lái)決定語(yǔ)句的循環(huán)執(zhí)行:①

先給控制循環(huán)次數(shù)的變量賦初值。②

判定控制循環(huán)的表達(dá)式的值,如為假,則跳出循環(huán)語(yǔ)句;如為真,則執(zhí)行指定的循環(huán)語(yǔ)句后,轉(zhuǎn)到第③步。③

執(zhí)行一條賦值語(yǔ)句來(lái)修正控制循環(huán)變量次數(shù)的變量的值,然后返回第②步。下面對(duì)兩種循環(huán)語(yǔ)句進(jìn)行詳細(xì)的介紹。一、for語(yǔ)句for語(yǔ)句的一般形式為for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語(yǔ)句;它的執(zhí)行過(guò)程如下:(1)求解表達(dá)式1。(2)求解表達(dá)式2,若其值為真(非0),則執(zhí)行for語(yǔ)句中指定的內(nèi)嵌語(yǔ)句,然后執(zhí)行下面的第(3)步。若為假(0),則結(jié)束循環(huán),轉(zhuǎn)到第(5)步。(3)若表達(dá)式為真,在執(zhí)行指定的語(yǔ)句后,求解表達(dá)式3。(4)轉(zhuǎn)回上面的第(2)步,繼續(xù)執(zhí)行。(5)執(zhí)行for語(yǔ)句下面的語(yǔ)句。下面使用for循環(huán)語(yǔ)句實(shí)現(xiàn)由加法運(yùn)算來(lái)完成乘法運(yùn)算的功能。【例4-11】

使用for循環(huán)語(yǔ)句實(shí)現(xiàn)一個(gè)參數(shù)化的多位乘法器。綜合得到的電路圖如圖4-9所示。上述電路設(shè)計(jì)中涉及的知識(shí)點(diǎn)有for語(yǔ)句和begin/end順序塊。下面對(duì)這些知識(shí)點(diǎn)進(jìn)行說(shuō)明。(1)?for語(yǔ)句。for語(yǔ)句用于循環(huán)操作,例4-11就是采用了加法和移位這個(gè)循環(huán)操作來(lái)實(shí)現(xiàn)乘法的。在for語(yǔ)句中,循環(huán)變量的增值表達(dá)式可以不必是一般的常規(guī)加1或減1表達(dá)式。(2)?begin/end順序塊。begin/end塊語(yǔ)句相當(dāng)于復(fù)合語(yǔ)句,可以看作一條語(yǔ)句。若在順序塊中定義變量,則需要給順序塊命名,如例4-11中的順序塊命名為mult。例4-11在命名順序塊中定義的變量j,一方面用作循環(huán)計(jì)數(shù),另一方面也用作移位運(yùn)算符的操作數(shù)。二、repeat語(yǔ)句repeat語(yǔ)句的格式如下:

下面的示例中使用repeat循環(huán)語(yǔ)句實(shí)現(xiàn)例4-11同樣的功能?!纠?-12】使用repeat循環(huán)語(yǔ)句及加法和移位操作來(lái)實(shí)現(xiàn)一個(gè)參數(shù)化的多位乘法器。例4-12綜合得到的電路圖跟使用for循環(huán)中例4-11得到的電路圖完全一致。上述電路設(shè)計(jì)中涉及的知識(shí)點(diǎn)是repeat語(yǔ)句。下面對(duì)這些知識(shí)點(diǎn)進(jìn)行說(shuō)明。(1)例4-12使用repeat循環(huán)來(lái)代替for循環(huán)來(lái)實(shí)現(xiàn)乘法功能,二者的原理相同,但在實(shí)現(xiàn)形式上有所區(qū)別。(2)在repeat語(yǔ)句中,其表達(dá)式通常為常量表達(dá)式。repeat(size)中表達(dá)式size的值為常值4。下面使用for循環(huán)語(yǔ)句來(lái)實(shí)現(xiàn)8位移位寄存器?!纠?-13】8位移位寄存器。程序說(shuō)明如下:(1)例4-13使用兩種方法實(shí)現(xiàn)8位移位寄存器,其中q1使用普通方法實(shí)現(xiàn),q2使用for語(yǔ)句實(shí)現(xiàn)。兩種方法原理相同,便于讀者理解for語(yǔ)句的功能。(2)例4-13使用了for語(yǔ)句,讀者可以很方便地使用repeat進(jìn)行替換。(3)綜合得到的電路圖如圖4-10所示。(4)上述設(shè)計(jì)的測(cè)試代碼如例4-14所示。【例4-14】8位移位寄存器測(cè)試臺(tái)。

與仿真代碼相應(yīng)的仿真波形如圖4-11所示。從圖4-11的仿真波形圖可以看出,移位寄存器設(shè)計(jì)正確。上述電路設(shè)計(jì)和電路仿真中涉及的知識(shí)點(diǎn)是循環(huán)語(yǔ)句、組合邏輯。下面對(duì)這些知識(shí)點(diǎn)進(jìn)行說(shuō)明。(1)循環(huán)語(yǔ)句。for語(yǔ)句、repeat語(yǔ)句都是可綜合的循環(huán)語(yǔ)句,都用于循環(huán)操作,并且在實(shí)際應(yīng)用中兩者可以互相替換。(2)組合邏輯。循環(huán)語(yǔ)句實(shí)現(xiàn)的是組合邏輯電路,會(huì)耗用大量的硬件資源和時(shí)間。循環(huán)語(yǔ)句完成的功能越復(fù)雜,則該組合邏輯耗用的時(shí)間就越多,會(huì)大大降低系統(tǒng)的工作頻率。為了提高系統(tǒng)的工作頻率,讀者在設(shè)計(jì)中應(yīng)盡量避免使用循環(huán)語(yǔ)句。三、循環(huán)語(yǔ)句總結(jié)VerilogHDL是一種硬件描述語(yǔ)言,如果期望在代碼中實(shí)現(xiàn),則需要EDA工具將其翻譯成基本的門邏輯,而在硬件電路中并沒(méi)有循環(huán)電路的原型,因此,在使用循環(huán)語(yǔ)句時(shí)應(yīng)時(shí)刻注意其可綜合性。循環(huán)語(yǔ)句包括可綜合的和不可綜合的。for語(yǔ)句、repeat語(yǔ)句都是可綜合的循環(huán)語(yǔ)句;while語(yǔ)句是不可綜合的循環(huán)語(yǔ)句。電路設(shè)計(jì)需要使用可綜合的循環(huán)語(yǔ)句,而使用最多的是for語(yǔ)句,其他可綜合的循環(huán)語(yǔ)句使用較少。因此,在可綜合的設(shè)計(jì)中,建議讀者僅使用for循環(huán)語(yǔ)句。對(duì)于硬件電路來(lái)說(shuō),循環(huán)語(yǔ)句屬于組合邏輯,會(huì)耗費(fèi)大量的硬件資源。因此,在設(shè)計(jì)電路時(shí)應(yīng)較少使用。設(shè)計(jì)電路時(shí)需考慮面積和速度這兩個(gè)因素,如果要提高電路的工作頻率,通常是將循環(huán)語(yǔ)句轉(zhuǎn)換成狀態(tài)機(jī)建?;蛘吡魉€建模來(lái)完成相應(yīng)的功能。另外,對(duì)于不可綜合循環(huán)語(yǔ)句while,實(shí)現(xiàn)的功能也可以采用類似的處理辦法予以綜合實(shí)現(xiàn)。循環(huán)語(yǔ)句使用的指導(dǎo)原則是:雖然基于循環(huán)語(yǔ)句的VerilogHDL設(shè)計(jì)顯得相對(duì)簡(jiǎn)單,且閱讀起來(lái)比較容易,但面向硬件和軟件設(shè)計(jì)的關(guān)注點(diǎn)是不一樣的,硬件設(shè)計(jì)并不追求代碼的短小,而是設(shè)計(jì)的時(shí)序、面積和性能等特征。在電路設(shè)計(jì)中應(yīng)使用狀態(tài)機(jī)建模或者流水線建模來(lái)代替for循環(huán)。任務(wù)4.5?塊語(yǔ)句(begin/end)關(guān)鍵字begin和end用于將多條語(yǔ)句組成順序塊。順序塊的格式如下:其中,塊名即該塊的名字,是一個(gè)標(biāo)識(shí)名。塊內(nèi)聲明語(yǔ)句可以是參數(shù)聲明語(yǔ)句、reg型變量聲明語(yǔ)句、integer型變量聲明語(yǔ)句、real型變量聲明語(yǔ)句等。塊語(yǔ)句通常用來(lái)將兩條或多條語(yǔ)句組合在一起,使它們更像一條語(yǔ)句,類似于C語(yǔ)言中的復(fù)合語(yǔ)句。Verilog語(yǔ)言中可綜合的塊語(yǔ)句為順序塊,關(guān)鍵字begin和end用于將多條語(yǔ)句組成順序塊。順序塊具有以下特點(diǎn):(1)順序塊中的語(yǔ)句是一條接一條按順序執(zhí)行的,只有前面的語(yǔ)句執(zhí)行完成之后才能執(zhí)行后面的語(yǔ)句(非阻塞賦值語(yǔ)句除外)。(2)嵌套塊:塊可以嵌套使用。(3)命名塊:塊可以具有自己的名字,稱之為命名塊。在命名塊中可以聲明局部變量,命名塊是設(shè)計(jì)層次的一部分,命名塊中聲明的變量可以通過(guò)層次名引用進(jìn)行訪問(wèn)。下面是一個(gè)使用命名塊的示例,其功能是使用異或運(yùn)算符對(duì)D完成縮位異或,并檢測(cè)D中1的個(gè)數(shù)?!纠?-15】

完成使用異或運(yùn)算符對(duì)D完成縮位異或運(yùn)算和檢測(cè)D中1的個(gè)數(shù)這兩個(gè)功能。程序說(shuō)明如下:(1)本例使用了for循環(huán)語(yǔ)句對(duì)D的各位進(jìn)行運(yùn)算。(2)本例使用了begin/end塊語(yǔ)句。塊語(yǔ)句相當(dāng)于復(fù)合語(yǔ)句,可以看作一條語(yǔ)句。(3)本例定義了3個(gè)命名塊。其中,塊block1和塊xor_block、塊Count_block是嵌套關(guān)系。塊xor_block的功能是完成縮位異或,塊Count_block的功能是完成檢測(cè)D中1的個(gè)數(shù)。(4)在命名塊xor_block中聲明的局部變量I和在命名塊Count_block中聲明的局部變量J,都用于循環(huán)計(jì)數(shù)。需要說(shuō)明的是,如果在塊中使用局部變量,則必須對(duì)該塊進(jìn)行命名。任務(wù)4.6?任務(wù)和函數(shù)語(yǔ)句一、task語(yǔ)句task和function說(shuō)明語(yǔ)句分別用來(lái)定義任務(wù)和函數(shù)。利用任務(wù)和函數(shù)可以把一個(gè)較大的程序模塊分解成多個(gè)較小的任務(wù)和函數(shù),以便于理解和調(diào)試。輸入/輸出和總線信號(hào)的值可以傳入/傳出任務(wù)和函數(shù)。任務(wù)和函數(shù)往往是大的程序模塊中在不同地點(diǎn)多次用到的相同的程序段。學(xué)會(huì)使用task和function語(yǔ)句可以簡(jiǎn)化程序的結(jié)構(gòu),使程序明白易懂,是讀者編寫較大型模塊的基本功。VerilogHDL函數(shù)和任務(wù)在綜合時(shí)被理解成具有獨(dú)立運(yùn)算功能的電路,每調(diào)用一次函數(shù)和任務(wù)就相當(dāng)于改變這部分電路的輸入,以得到相應(yīng)的計(jì)算結(jié)果。下面分別通過(guò)任務(wù)和函數(shù)來(lái)實(shí)現(xiàn)對(duì)輸入數(shù)進(jìn)行按位逆序后輸出?!纠?-16】

用任務(wù)實(shí)現(xiàn)輸入數(shù)據(jù)按位逆序后輸出的功能。程序說(shuō)明如下:(1)本例說(shuō)明了怎樣定義任務(wù)和調(diào)用任務(wù)。開始于task而結(jié)束于endtask的部分定義了一個(gè)任務(wù)。定義的任務(wù)語(yǔ)法如下:這些聲明語(yǔ)句的語(yǔ)法與模塊定義中對(duì)應(yīng)的聲明語(yǔ)句的語(yǔ)法是一致的。(2)reverse_bits(D,Q);的功能是調(diào)用任務(wù)并傳遞輸入/輸出變量給任務(wù)。調(diào)用任務(wù)并傳遞輸入/輸出變量的聲明語(yǔ)句的語(yǔ)法如下:<任務(wù)名>(端口1,端口2,…,端口n);本例中,任務(wù)調(diào)用變量(D,Q)和任務(wù)定義的I/O變量(data,result)之間是一一對(duì)應(yīng)的。當(dāng)任務(wù)啟動(dòng)時(shí),由D傳入的變量賦給了data,而當(dāng)任務(wù)完成后的輸出又通過(guò)result賦給了Q。(3)如果傳給任務(wù)的變量值和任務(wù)完成后接收結(jié)果的變量已定義,則可以用一條語(yǔ)句啟動(dòng)任務(wù)。任務(wù)完成以后,控制會(huì)傳回啟動(dòng)過(guò)程。二、function語(yǔ)句使用任務(wù)完成的可綜合的模塊也可以由函數(shù)來(lái)實(shí)現(xiàn)。例4-17就是使用函數(shù)對(duì)例4-16進(jìn)行了重新改寫。【例4-17】

用函數(shù)實(shí)現(xiàn)輸入數(shù)據(jù)位逆序后輸出的功能。程序說(shuō)明如下:(1)本例說(shuō)明了怎樣定義函數(shù)和調(diào)用函數(shù)。開始于function而結(jié)束于endfunction的部分定義了一個(gè)函數(shù)。定義的函數(shù)語(yǔ)法如下:注意:<返回值的類型或范圍>這一項(xiàng)是可選項(xiàng),如缺省,則返回值為一位寄存器類型數(shù)據(jù)。這些聲明語(yǔ)句的語(yǔ)法與模塊定義中對(duì)應(yīng)的聲明語(yǔ)句的語(yǔ)法是一致的。(2)?Q<=reverse_bits(D);的功能是調(diào)用函數(shù)并傳遞輸入變量給函數(shù),函數(shù)的調(diào)用是通過(guò)將函數(shù)作為表達(dá)式中的操作數(shù)來(lái)實(shí)現(xiàn)的。在函數(shù)中,reverse_bits被賦予的值就是函數(shù)的返回值。函數(shù)的定義聲明了與函數(shù)同名的、函數(shù)內(nèi)部的寄存器。如果在函數(shù)的聲明語(yǔ)句中<返回值的類型或范圍>為缺省,則這個(gè)寄存器是一位的,否則是與函數(shù)定義中<返回值的類型或范圍>一致的寄存器。函數(shù)的定義把函數(shù)返回值所賦值寄存器的名稱初始化為與函數(shù)同名的內(nèi)部變量。調(diào)用函數(shù)并傳遞輸入/輸出變量的聲明語(yǔ)句的語(yǔ)法如下:<函數(shù)名>(<表達(dá)式><,<表達(dá)式>>*)其中,函數(shù)名作為確認(rèn)符。本例中,函數(shù)調(diào)用變量(D,Q)和函數(shù)定義的I/O變量(data,reverse_bits)之間是一一對(duì)應(yīng)的。當(dāng)函數(shù)啟動(dòng)時(shí),由D傳入的變量賦給了data,而函數(shù)完成后的輸出又通過(guò)reverse_bits賦給了Q。(3)如果傳給函數(shù)的變量值和函數(shù)完成后接收結(jié)果的變量已定義,則可以用一條語(yǔ)句啟動(dòng)函數(shù)。函數(shù)完成后,控制會(huì)傳回啟動(dòng)過(guò)程。例4-16和例4-17兩個(gè)示例對(duì)應(yīng)的仿真代碼如例4-18所示。【例4-18】

函數(shù)和任務(wù)的測(cè)試代碼。

仿真波形如圖4-12所示。從圖4-12的仿真波形可以看出,兩個(gè)示例均實(shí)現(xiàn)了位逆序的功能。上述電路設(shè)計(jì)和電路仿真中涉及的知識(shí)點(diǎn)有task語(yǔ)句、function語(yǔ)句。下面對(duì)這些知識(shí)點(diǎn)進(jìn)行說(shuō)明。(1)任務(wù)和函數(shù)的相同點(diǎn)。任務(wù)和函數(shù)在完成一些電路或者功能實(shí)現(xiàn)時(shí)是可以相互替換的(如例??4-18),使用時(shí)應(yīng)注意兩者在輸入和輸出時(shí)的一些規(guī)則。(2)任務(wù)和函數(shù)的區(qū)別。①

任務(wù)能調(diào)用其他函數(shù),而函數(shù)不能調(diào)用任務(wù)。②

函數(shù)只能與主模塊共用同一個(gè)仿真時(shí)間單位,而任務(wù)可以定義自己的仿真時(shí)間單位。③

函數(shù)至少要有一個(gè)輸入變量,而任務(wù)可以沒(méi)有或有多個(gè)任何類型的變量。④

任務(wù)可以啟動(dòng)其他的任務(wù),其他任務(wù)又可以啟動(dòng)別的任務(wù),可以啟動(dòng)的任務(wù)數(shù)是沒(méi)有限制的。不管有多少任務(wù)啟動(dòng),只有當(dāng)所有的啟動(dòng)任務(wù)完成以后,控制才能傳回啟動(dòng)過(guò)程。⑤

函數(shù)的目的是通過(guò)返回一個(gè)值來(lái)響應(yīng)輸入信號(hào)的值。任務(wù)卻能支持多種目的,計(jì)算多個(gè)結(jié)果值,而這些結(jié)果值只能通過(guò)被調(diào)用的任務(wù)的輸出或總線端口輸出。⑥VerilogHDL模塊使用函數(shù)時(shí)是把它當(dāng)作表達(dá)式中的操作符,這個(gè)操作符的結(jié)果值就是這個(gè)函數(shù)的返回值。也就是說(shuō),函數(shù)返回一個(gè)值,而任務(wù)則不返回值。例如,定義一個(gè)任務(wù)或函數(shù),對(duì)一個(gè)16位的字進(jìn)行操作讓高字節(jié)與低字節(jié)互換,把它變?yōu)榱硪粋€(gè)字(假定這個(gè)任務(wù)或函數(shù)名為switch_bytes)。任務(wù)返回的新字是通過(guò)輸出端口的變量,因此,16位字字節(jié)互換任務(wù)的調(diào)用方法為switch_bytes(old_word,new_word);。任務(wù)switch_bytes把輸入old_word的高、低字節(jié)互換放入new_word端口輸出。而函數(shù)返回的新字是通過(guò)函數(shù)本身的返回值,因此,16位字高、低字節(jié)互換函數(shù)的調(diào)用方法為new_word=switch_bytes(old_word);。與任務(wù)相比,函數(shù)的使用有較多的約束。例如,函數(shù)的定義不能包含任何的時(shí)間控制語(yǔ)句,即任何用#、@或wait來(lái)標(biāo)識(shí)的語(yǔ)句;函數(shù)不能啟動(dòng)任務(wù);定義函數(shù)時(shí)至少要有一個(gè)輸入?yún)⒘?;在函?shù)的定義中必須有一條賦值語(yǔ)句給函數(shù)中的一個(gè)內(nèi)部變量賦以函數(shù)的結(jié)果值,該內(nèi)部變量具有和函數(shù)名相同的名字。任務(wù)4.7?流水線設(shè)計(jì)數(shù)字系統(tǒng)的工作頻率要滿足以下公式:其中,Tco為發(fā)端寄存器Q時(shí)鐘到輸出時(shí)間;Tlogic為組合邏輯延遲;Trouting為兩級(jí)寄存器之間的布線延遲;Tsu為接收端寄存器建立時(shí)間;Tskew為兩級(jí)寄存器的時(shí)鐘歪斜,其值等于時(shí)鐘統(tǒng)一邊沿到達(dá)兩個(gè)寄存器時(shí)鐘端口的時(shí)間差;Tclk為系統(tǒng)所能達(dá)到的最小時(shí)鐘周期。該公式可結(jié)合圖4-13來(lái)理解。因此,要提升系統(tǒng)的工作頻率,就需要考慮降低不等式右邊的值。本任務(wù)所描述的流水線設(shè)計(jì)的主要目的就是降低組合邏輯延遲,從而提升整個(gè)數(shù)字系統(tǒng)的工作頻率。流水線工作原理可以用圖4-14進(jìn)行說(shuō)明。圖4-14中,組合邏輯運(yùn)算(in+a)*b/c被拆分成3個(gè)運(yùn)算。假設(shè)in?+?a的運(yùn)算時(shí)間為t1,out1*b的運(yùn)算時(shí)間為t2,out2/c的運(yùn)算時(shí)間為t3,則運(yùn)算(in+a)*b/c的運(yùn)算時(shí)間為t1?+?t2?+?t3。顯然,max(t1,t2,t3)?<?t1?+?t2?+?t3,這樣就減少了寄存器間的組合邏輯延遲Tlogic,進(jìn)而降低了系統(tǒng)所能達(dá)到的最小時(shí)鐘周期Tclk,也就是提升了系統(tǒng)的工作頻率。流水線通常將順序執(zhí)行的阻塞賦值計(jì)算轉(zhuǎn)化為多周期完成的賦值,這樣就將單步順序計(jì)算拆分為多個(gè)并行計(jì)算,每步計(jì)算量減小,從而使所需要的時(shí)鐘周期減小,也就是提升了系統(tǒng)的工作頻率。下面用一個(gè)示例來(lái)說(shuō)明流水線設(shè)計(jì)的實(shí)現(xiàn)方式和特點(diǎn)?!纠?-19】

用普通循環(huán)語(yǔ)句實(shí)現(xiàn)1?+?2?+?3?+?…?+?9。下面對(duì)例4-19電路設(shè)計(jì)代碼作一些說(shuō)明。(1)由于循環(huán)語(yǔ)句求和功能在一個(gè)時(shí)鐘周期內(nèi)即可完成,因此,需要增加一個(gè)使能信號(hào)en,并且該信號(hào)的有效電平時(shí)間僅包含一個(gè)時(shí)鐘上升沿,該信號(hào)有效時(shí)才進(jìn)行求和操作。(2)?for循環(huán)語(yǔ)句求和是組合邏輯電路,需要耗費(fèi)的時(shí)間較長(zhǎng),因此,該設(shè)計(jì)的時(shí)鐘clk的工作頻率不能太高。(3)綜合得到的電路圖如圖4-15所示。從圖4-15中可以看出,組合邏輯是多個(gè)加法器的級(jí)聯(lián),耗時(shí)是每個(gè)加法器的運(yùn)算時(shí)間之和。【例4-20】

用流水線建模實(shí)現(xiàn)1?+?2?+?3?+?…?+?9。下面對(duì)上述電路設(shè)計(jì)代碼作一些說(shuō)明。(1)使用流水線求和,也需要一個(gè)使能信號(hào)en,當(dāng)該信號(hào)有效時(shí)即啟動(dòng)求和操作。全部求和完成后,還需要一個(gè)結(jié)束標(biāo)志flag。(2)?flag有效時(shí),完成求和功能。flag有效的標(biāo)志是當(dāng)en有效時(shí),flag無(wú)效的時(shí)候是加數(shù)超過(guò)9時(shí)。(3)流水線求和是時(shí)序邏輯電路,將原來(lái)組合邏輯電路求和的時(shí)間分散到10個(gè)周期內(nèi)進(jìn)行,因此,該設(shè)計(jì)的時(shí)鐘clk的工作頻率相對(duì)較高。(4)綜合得到的電路圖如圖4-16所示。從圖4-16中可以看出,每一級(jí)寄存器間的組合邏輯就是完成一次加法,但這需要多級(jí)寄存器。【例4-21】

測(cè)試代碼。仿真波形如圖4-17所示。循環(huán)語(yǔ)句實(shí)現(xiàn)的求和功能可以在一個(gè)時(shí)鐘周期內(nèi)完成,而流水線設(shè)計(jì)則需要10個(gè)時(shí)鐘周期。上述電路設(shè)計(jì)和電路仿真中涉及的知識(shí)點(diǎn)有流水線、循環(huán)語(yǔ)句。下面對(duì)這些知識(shí)點(diǎn)進(jìn)行說(shuō)明。(1)流水線。本代碼將兩種實(shí)現(xiàn)方式在同一測(cè)試臺(tái)進(jìn)行輸出結(jié)果對(duì)比。兩種實(shí)現(xiàn)方式輸入激勵(lì)完全相同,因此,放在一起測(cè)試不會(huì)添加任何工作量,只需要多一個(gè)例化語(yǔ)句即可。同時(shí),輸出可以放在一起進(jìn)行比較。由于采用循環(huán)語(yǔ)句求和在一個(gè)時(shí)鐘周期內(nèi)完成,因此,使能信號(hào)en的有效電平時(shí)間包含一個(gè)時(shí)鐘上升沿即可。(2)流水線的效果。上述設(shè)計(jì)在沒(méi)添加任何約束的情況下,在QuartusⅡ

軟件上綜合實(shí)現(xiàn)后,可以查看到最大工作頻率。使用流水線的系統(tǒng)最大工作頻率如圖4-18所示。沒(méi)使用流水線的系統(tǒng)最大工作頻率如圖4-19所示由以上結(jié)果可知,使用流水線前后最大工作頻率相差3倍多。這種查看最大工作頻率的方法僅用于定性比較使用流水線前后的性能。不同的流水線,對(duì)系統(tǒng)性能的提升是不同的,需要單獨(dú)分析。若想得到更加準(zhǔn)確的最大工作頻率,則需要進(jìn)行精準(zhǔn)的時(shí)序約束,包括系統(tǒng)時(shí)鐘頻率約束、輸入時(shí)序約束、輸出時(shí)序約束、管腳間時(shí)序約束等。讀者也可以使用Vivado得到最大工作頻率。在Vivado軟件中,要得到最大工作頻率,需要先進(jìn)行時(shí)鐘約束,實(shí)現(xiàn)后即可查看最大工作頻率。感興趣的讀者可自行實(shí)驗(yàn),此處不再贅述。(3)流水線的優(yōu)缺點(diǎn)。采用流水線既會(huì)增大資源的使用,也可降低寄存器間的傳播延時(shí),保證系統(tǒng)維持高的系統(tǒng)時(shí)鐘速度。因此,在實(shí)際應(yīng)用中,需要綜合考慮資源的使用和速度的要求,根據(jù)實(shí)際情況來(lái)選擇流水線的級(jí)數(shù),以滿足設(shè)計(jì)需要。利用流水線式的設(shè)計(jì)方法可大大提高系統(tǒng)的工作速度。這種方法可廣泛應(yīng)用于各種設(shè)計(jì),特別是大型的、對(duì)速度要求較高的系統(tǒng)設(shè)計(jì)。(4)流水線和循環(huán)語(yǔ)句的關(guān)系??删C合的循環(huán)語(yǔ)句在實(shí)現(xiàn)電路時(shí)會(huì)占用大量組合邏輯資源,因此,在面積緊張的情況下,可以考慮采用流水線來(lái)實(shí)現(xiàn)循環(huán)語(yǔ)句。雖然,while循環(huán)是不可綜合的,但算法中如果有使用while循環(huán)才能實(shí)現(xiàn)的功能,則這部分功能可以用流水線技術(shù)來(lái)實(shí)現(xiàn)。另外,從流水線的設(shè)計(jì)原理可以看出,使用C語(yǔ)言實(shí)現(xiàn)或驗(yàn)證某種算法后,可以很容易地使用VerilogHDL語(yǔ)言轉(zhuǎn)換成硬件。通常情況下,使用C語(yǔ)言實(shí)現(xiàn)的軟件功能都可以使用硬件來(lái)實(shí)現(xiàn)。任務(wù)5.1同步有限狀態(tài)機(jī)引例

任務(wù)5.2狀態(tài)機(jī)的基本概念

任務(wù)5.3狀態(tài)機(jī)的編碼方法有限狀態(tài)機(jī)及其設(shè)計(jì)技術(shù)是實(shí)用數(shù)字系統(tǒng)設(shè)計(jì)的重要組成部分,也是實(shí)現(xiàn)高效率、高可靠性邏輯控制的重要途徑。有限狀態(tài)機(jī)廣泛應(yīng)用于硬件控制電路設(shè)計(jì),它把復(fù)雜的控制邏輯分解成有限個(gè)穩(wěn)定狀態(tài),在每個(gè)狀態(tài)上判斷并處理事件,變連續(xù)處理為離散數(shù)字處理。有限狀態(tài)機(jī)雖然僅有有限個(gè)狀態(tài),但這并不意味著其只能進(jìn)行有限次的處理,相反,有限狀態(tài)機(jī)是閉環(huán)系統(tǒng),有限無(wú)窮,可以用有限的狀態(tài)處理復(fù)雜的事務(wù)。使用狀態(tài)機(jī)建模的電路有計(jì)數(shù)器、序列檢測(cè)器等。任務(wù)5.1?同步有限狀態(tài)機(jī)引例狀態(tài)機(jī)特別適合描述那些發(fā)生有先后順序或者有邏輯規(guī)律的事情。狀態(tài)機(jī)的本質(zhì)就是對(duì)具有邏輯順序或時(shí)序規(guī)律事件的一種描述方法,邏輯順序和時(shí)序規(guī)律是狀態(tài)機(jī)所要描述的核心和強(qiáng)項(xiàng)。換言之,所有具有邏輯順序和時(shí)序規(guī)律的事情都適合用狀態(tài)機(jī)來(lái)描述。很多初學(xué)者不知道何時(shí)應(yīng)用狀態(tài)機(jī),這里介紹一種應(yīng)用思路:從狀態(tài)變量入手。如果一個(gè)電路具有時(shí)序規(guī)律或者邏輯順序,則自然而然地可對(duì)這個(gè)電路規(guī)劃出狀態(tài),從這些狀態(tài)入手,分析每個(gè)狀態(tài)的輸入、轉(zhuǎn)移和輸出,從而完成電路功能。使用狀態(tài)機(jī)的目的是控制某部分電路,完成某種具有邏輯順序或時(shí)序規(guī)律的電路設(shè)計(jì)。其實(shí)對(duì)于邏輯電路而言,小到一個(gè)簡(jiǎn)單的時(shí)序邏輯,大到復(fù)雜的微處理器,都適合用狀態(tài)機(jī)的方法進(jìn)行描述。由于狀態(tài)機(jī)不僅僅是一種電路描述工具,它更是一種思想方法,而且狀態(tài)機(jī)的HDL語(yǔ)言表達(dá)方式比較規(guī)范,有章可循,所以很多有經(jīng)驗(yàn)的設(shè)計(jì)者習(xí)慣用狀態(tài)機(jī)的思想進(jìn)行邏輯設(shè)計(jì),對(duì)各種復(fù)雜設(shè)計(jì)都套用狀態(tài)機(jī)的設(shè)計(jì)理念,從而提高設(shè)計(jì)的效率和穩(wěn)定性。下面通過(guò)一個(gè)典型時(shí)序邏輯電路的設(shè)計(jì)實(shí)例來(lái)引入有限狀態(tài)機(jī)?!纠?-1】

設(shè)計(jì)一個(gè)串行數(shù)據(jù)檢測(cè)器。電路的輸入信號(hào)A是與時(shí)鐘脈沖同步的串行數(shù)據(jù),其時(shí)序關(guān)系如圖5-1所示。輸出信號(hào)為Y,要求電路在信號(hào)輸入A出現(xiàn)110序列時(shí)輸出信號(hào)Y為1,否則為0。這是一道典型的時(shí)序邏輯電路例題,其求解步驟如圖5-2所示。下面詳細(xì)介紹邏輯電路的設(shè)計(jì)步驟。(1)理解題意,由給定的邏輯功能建立原始狀態(tài)圖,如圖5-3所示。圖5-3中,S表示狀態(tài);A/Y中斜杠左面的為輸入,斜杠右面的為輸出。(2)狀態(tài)化簡(jiǎn)。合并等價(jià)狀態(tài),消去多余狀態(tài)的過(guò)程稱為狀態(tài)化簡(jiǎn)。所謂等價(jià)狀態(tài),就是指在相同的輸入下有相同的輸出,并轉(zhuǎn)換到同一個(gè)次態(tài)的兩個(gè)狀態(tài)。顯然,圖5-3中的a和d是等價(jià)狀態(tài),可以合并?;?jiǎn)后的狀態(tài)圖如圖5-4所示。(3)狀態(tài)編碼。給每個(gè)狀態(tài)賦以二進(jìn)制代碼的過(guò)程,稱為狀態(tài)編碼。對(duì)圖5-4的狀態(tài)進(jìn)行某種編碼的結(jié)果如圖5-5所示。圖5-5所示狀態(tài)圖對(duì)應(yīng)的狀態(tài)表如表5-1所示。(4)選擇觸發(fā)器的個(gè)數(shù)和類型。觸發(fā)器個(gè)數(shù)可根據(jù)狀態(tài)數(shù)確定,要求滿足2n-1<M≤2n。式中,M為狀態(tài)數(shù),n為觸發(fā)器的個(gè)數(shù)。對(duì)于例5-1,已知M為3,所以可求出觸發(fā)器的個(gè)數(shù)為2。觸發(fā)器選擇D觸發(fā)器。(5)求出電路的激勵(lì)方程和輸出方程。根據(jù)表5-1可列出狀態(tài)轉(zhuǎn)換真值表及激勵(lì)信號(hào),如表5-2所示。針對(duì)輸出和激勵(lì)信號(hào),采用卡諾圖化簡(jiǎn),如圖5-6所示。利用多余狀態(tài),卡諾圖化簡(jiǎn)后的激勵(lì)方程和輸出方程為(6)畫出邏輯圖(見圖5-7)并檢查自啟動(dòng)能力。經(jīng)檢查,該電路具有自啟動(dòng)能力。至此,該串行數(shù)據(jù)檢測(cè)器設(shè)計(jì)完畢。使用狀態(tài)機(jī)建模時(shí),步驟(1)可理解為Moore狀態(tài)機(jī);步驟(2)可理解為Mealy狀態(tài)機(jī);步驟(3)為狀態(tài)編碼;步驟(4)~(6)不需要人工完成,由計(jì)算機(jī)來(lái)完成。針對(duì)步驟(1),可以使用HDL代碼實(shí)現(xiàn)Moore狀態(tài)機(jī),如例5-2所示。【例5-2】

對(duì)應(yīng)于例5-1中步驟(1)的同步狀態(tài)機(jī)。上述電路設(shè)計(jì)涉及的知識(shí)點(diǎn)有狀態(tài)轉(zhuǎn)移圖、狀態(tài)編碼、多進(jìn)程狀態(tài)機(jī)、狀態(tài)機(jī)建模。下面對(duì)這些知識(shí)點(diǎn)進(jìn)行說(shuō)明。(1)狀態(tài)轉(zhuǎn)移圖。例5-2對(duì)應(yīng)的狀態(tài)轉(zhuǎn)移圖如圖5-8所示。狀態(tài)圖的轉(zhuǎn)換條件如表5-3所示。(2)狀態(tài)編碼。parameters0=2'b00,s1=2'b01,s2=2'b10,s3=2'b11;?是狀態(tài)賦值語(yǔ)句,也就是狀態(tài)編碼。在VerilogHDL中,狀態(tài)必須明確賦值,通常使用參數(shù)(parameters)或宏定義(define)語(yǔ)句加上賦值語(yǔ)句來(lái)實(shí)現(xiàn)。例5-2就是采用參數(shù)加上賦值語(yǔ)句來(lái)實(shí)現(xiàn)的。當(dāng)然也可以采用宏定義的方式來(lái)實(shí)現(xiàn),如可定義為`defines02'b00則意味著s0的狀態(tài)碼是2'b00。在引用宏定義的狀態(tài)時(shí),需要使用符號(hào)“`”。例如,程序中要使用狀態(tài)s0,則要寫成`s0。例5-2使用的狀態(tài)編碼方式為順序編碼,除了可使用這種編碼方式之外,還可以使用獨(dú)熱編碼、直接輸出型編碼、格雷編碼等。(3)多進(jìn)程狀態(tài)機(jī)。例5-2實(shí)現(xiàn)的狀態(tài)機(jī)為單進(jìn)程狀態(tài)機(jī),除此之外,還有雙進(jìn)程和多進(jìn)程的實(shí)現(xiàn)方式。(4)狀態(tài)機(jī)建模。在進(jìn)行電路設(shè)計(jì)時(shí),通過(guò)數(shù)字電路的知識(shí)手工求解,難度稍大,也不能充分利用和體現(xiàn)EDA強(qiáng)大的功能;而使用狀態(tài)機(jī)建模來(lái)實(shí)現(xiàn)設(shè)計(jì),只需要根據(jù)題意,得出狀態(tài)圖,然后直接使用硬件描述語(yǔ)言來(lái)描述狀態(tài)圖,無(wú)須利用過(guò)多的數(shù)字電路知識(shí),充分利用了EDA強(qiáng)大的功能。任務(wù)5.2?狀態(tài)機(jī)的基本概念一、狀態(tài)機(jī)的基本描述方式在邏輯設(shè)計(jì)中,狀態(tài)機(jī)的基本描述方式有三種,分別是使用狀態(tài)轉(zhuǎn)移圖、狀態(tài)轉(zhuǎn)移列表、HDL語(yǔ)言描述狀態(tài)機(jī)。(1)使用狀態(tài)轉(zhuǎn)移圖描述狀態(tài)機(jī)。狀態(tài)轉(zhuǎn)移圖是描述狀態(tài)機(jī)的最自然的方式。狀態(tài)轉(zhuǎn)移圖經(jīng)常用于在設(shè)計(jì)規(guī)劃階段定義邏輯功能,也可以用于分析代碼中的狀態(tài)機(jī),通過(guò)圖形化的方式有助于理解設(shè)計(jì)意圖。(2)使用狀態(tài)轉(zhuǎn)移列表描述狀態(tài)機(jī)。使用狀態(tài)轉(zhuǎn)移列表描述狀態(tài)機(jī)是用列表的方式描述狀態(tài)機(jī),是數(shù)字邏輯電路常用的描述方法之一。狀態(tài)轉(zhuǎn)移列表經(jīng)常用于對(duì)狀態(tài)進(jìn)行化簡(jiǎn)。對(duì)于可編程邏輯設(shè)計(jì),由于可用邏輯資源比較豐富,而且狀態(tài)編碼要考慮設(shè)計(jì)的穩(wěn)定性、安全性等因素,所以并不經(jīng)常使用狀態(tài)轉(zhuǎn)移列表優(yōu)化狀態(tài)。(3)使用HDL語(yǔ)言描述狀態(tài)機(jī)。使用HDL語(yǔ)言描述狀態(tài)機(jī)是本章討論的重點(diǎn),使用HDL語(yǔ)言描述狀態(tài)機(jī)既有章可循,又有一定的靈活性。通過(guò)一些規(guī)范的描述方法,可以使HDL語(yǔ)言描述的狀態(tài)機(jī)更安全、穩(wěn)定、高效,易于維護(hù)。在VerilogHDL中可以用多種方法來(lái)描述有限狀態(tài)機(jī),最常用的方法是用always塊和case語(yǔ)句。二、狀態(tài)機(jī)的基本要素及分類狀態(tài)機(jī)有三個(gè)基本要素,分別是狀態(tài)、輸出和輸入。(1)狀態(tài):也叫狀態(tài)變量。在邏輯設(shè)計(jì)中,使用狀態(tài)劃分邏輯順序和時(shí)序規(guī)律。比如,在設(shè)計(jì)空調(diào)控制電路時(shí),可以將環(huán)境溫度的不同作為狀態(tài)。(2)輸出:指在某一個(gè)狀態(tài)時(shí)特定發(fā)生的事件。例如,設(shè)計(jì)空調(diào)控制電路中,如果環(huán)境溫度高于設(shè)定溫度環(huán)境限值,則控制電機(jī)正轉(zhuǎn)進(jìn)行降溫處理;如果環(huán)境溫度低于設(shè)定溫度環(huán)境限值,則控制電機(jī)反轉(zhuǎn)進(jìn)行升溫處理。(3)輸入:指狀態(tài)機(jī)中進(jìn)入每個(gè)狀態(tài)的條件。有的狀態(tài)機(jī)沒(méi)有輸入條件,其中的狀態(tài)轉(zhuǎn)移較為簡(jiǎn)單;有的狀態(tài)機(jī)有輸入條件,當(dāng)某個(gè)輸入條件存在時(shí)才能轉(zhuǎn)移到相應(yīng)的狀態(tài)。根據(jù)狀態(tài)機(jī)的輸出是否與輸入條件相關(guān),狀態(tài)機(jī)可分為兩類:Moore型狀態(tài)機(jī)和Mealy型狀態(tài)機(jī)。Mealy型狀態(tài)機(jī)的輸出是狀態(tài)向量和輸入的函數(shù),其結(jié)構(gòu)如圖5-9(a)所示。也就是說(shuō),Mealy型狀態(tài)機(jī)的輸出不僅依賴于當(dāng)前狀態(tài),而且取決于該狀態(tài)的輸入條件。Moore狀態(tài)機(jī)的輸出僅是狀態(tài)向量的函數(shù),結(jié)構(gòu)如圖5-9(b)所示。也就是說(shuō),Moore狀態(tài)機(jī)的輸出僅僅依賴于當(dāng)前狀態(tài),而與輸入條件無(wú)關(guān)。狀態(tài)機(jī)可以按是否有一個(gè)公共的時(shí)鐘控制(鐘控)分為同步狀態(tài)機(jī)和異步狀態(tài)機(jī),如果具有鐘控則為同步狀態(tài)機(jī),反之則為異步狀態(tài)機(jī)。根據(jù)狀態(tài)機(jī)的數(shù)量是否為有限個(gè),可將狀態(tài)機(jī)分為有限狀態(tài)機(jī)和無(wú)限狀態(tài)機(jī)。三、單進(jìn)程、雙進(jìn)程和多進(jìn)程狀態(tài)機(jī)描述狀態(tài)機(jī)時(shí)關(guān)鍵是要描述清楚狀態(tài)機(jī)的要素,即如何進(jìn)行狀態(tài)轉(zhuǎn)移,每個(gè)狀態(tài)的輸出是什么,狀態(tài)轉(zhuǎn)移是否和輸入條件相關(guān)等。一個(gè)有限狀態(tài)機(jī)可以被分成次態(tài)譯碼、狀態(tài)寄存器、輸出譯碼三個(gè)模塊,也可以用五種不同的方式將這些模塊分配到進(jìn)程語(yǔ)句中,以實(shí)現(xiàn)對(duì)狀態(tài)機(jī)的描述。(1)三個(gè)模塊用一個(gè)進(jìn)程實(shí)現(xiàn)。也就是說(shuō),3個(gè)模塊均在1個(gè)always塊內(nèi),這種狀態(tài)機(jī)描述稱為單進(jìn)程有限狀態(tài)機(jī)。在單進(jìn)程狀態(tài)機(jī)中,既描述狀態(tài)轉(zhuǎn)移,又描述狀態(tài)的寄存和輸出。(2)每一個(gè)模塊分別用一個(gè)進(jìn)程實(shí)現(xiàn)。也就是說(shuō),3個(gè)模塊對(duì)應(yīng)著3個(gè)always塊,這種狀態(tài)機(jī)描述稱為三進(jìn)程有限狀態(tài)機(jī)。在三進(jìn)程狀態(tài)機(jī)中,一個(gè)always模塊采用同步時(shí)序描述狀態(tài)轉(zhuǎn)移,另一個(gè)模塊采用組合邏輯判斷狀態(tài)轉(zhuǎn)移條件,描述狀態(tài)轉(zhuǎn)移規(guī)律,第三個(gè)always模塊使用同步時(shí)序電路描述每個(gè)狀態(tài)的輸出。(3)次態(tài)譯碼、輸出譯碼分配在一個(gè)進(jìn)程中,狀態(tài)寄存器用另一個(gè)進(jìn)程描述。(4)次態(tài)譯碼、狀態(tài)寄存器分配在一個(gè)進(jìn)程中,輸出譯碼用另一個(gè)進(jìn)程描述。(5)次態(tài)譯碼用一個(gè)進(jìn)程描述,狀態(tài)寄存器、輸出譯碼分配在另一個(gè)進(jìn)程中。在后三種狀態(tài)機(jī)描述中,3個(gè)模塊對(duì)應(yīng)著2個(gè)always塊,這種狀態(tài)機(jī)描述稱為雙進(jìn)程有限狀態(tài)機(jī)。對(duì)于上面5種描述狀態(tài)機(jī)的方法,優(yōu)先推薦采用第二種方法,其次推薦采用第四種方法,不推薦采用第一、三、五種方法。其原因是:FSM和其他設(shè)計(jì)一樣,最好采用同步時(shí)序方式設(shè)計(jì),以提高設(shè)計(jì)的穩(wěn)定性,消除毛刺。狀態(tài)機(jī)實(shí)現(xiàn)后,一般來(lái)說(shuō),狀態(tài)轉(zhuǎn)移部分是同步時(shí)序電路,而狀態(tài)的轉(zhuǎn)移條件的判斷是組合邏輯,第二種方法將同步時(shí)序和組合邏輯分別放到不同的always程序塊中實(shí)現(xiàn),不僅便于閱讀、理解、維護(hù),更重要的是有利于綜合器優(yōu)化代碼,有利于用戶添加合適的時(shí)序約束條件,有利于布局布線器實(shí)現(xiàn)設(shè)計(jì)。第四種方法將同步時(shí)序和組合邏輯放在一個(gè)always程序塊中實(shí)現(xiàn),代碼簡(jiǎn)潔,同時(shí)可以達(dá)到與第二種相同的效果。而第一種方法描述不利于時(shí)序約束、功能更改、調(diào)試等,而且不能很好地表示Mealy

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論