第5講VerilogHDL行為建模方法_第1頁
第5講VerilogHDL行為建模方法_第2頁
第5講VerilogHDL行為建模方法_第3頁
第5講VerilogHDL行為建模方法_第4頁
第5講VerilogHDL行為建模方法_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

2015年f=ab…Verilog硬件描述語言

VerilogHDL主講陳付龍計算機科學(xué)與技術(shù)系第5講VerilogHDL行為建模方法學(xué)習(xí)目標結(jié)構(gòu)化過程always和initial定義阻塞(blocking)和非阻塞(non-blocking)過程性賦值語句。理解行為級建模中基于延遲的時序控制機制。學(xué)習(xí)使用一般延遲、內(nèi)嵌賦值延遲和零延遲。理解行為級建模中基于事件的時序控制機制。學(xué)習(xí)使用一般事件控制、命名事件控制和事件OR(或)控制。在行為級建模中使用電平敏感的時序控制機制。使用if和else解釋條件語句。使用case,casex和casez語句講解多路分支。理解while,for,repeat和forever等循環(huán)語句。定義順序塊和并行塊語句。理解命名塊和命名塊的禁用。在設(shè)計實例中進行行為級建模。5.1結(jié)構(gòu)化過程語句在Verilog中有兩種結(jié)構(gòu)化的過程語句:initial語句和always語句,它們是行為級建模的兩種基本語句。其他所有的行為語句只能出現(xiàn)在這兩種結(jié)構(gòu)化過程語句里。與C語言不同,Verilog在本質(zhì)上是并發(fā)而非順序的。Verilog中的各個執(zhí)行流程(進程)并發(fā)執(zhí)行,而不是順序執(zhí)行的。每個initial語句和always語句代表一個獨立的執(zhí)行過程,每個執(zhí)行過程從仿真時間0開始執(zhí)行,并且這兩種語句不能嵌套使用。initial語句所有在initial語句內(nèi)的語句構(gòu)成了一個initial塊。initial塊從仿真0時刻開始執(zhí)行,在整個仿真過程中只執(zhí)行一次。如果一個模塊中包括了若干個initial塊,則這些initial塊從仿真0時刻開始并發(fā)執(zhí)行,且每個塊的執(zhí)行是各自獨立的。如果在塊內(nèi)包含了多條行為語句,那么需要將這些語句組成一組,一般是使用關(guān)鍵字begin和end將它們組合為一個塊語句;如果塊內(nèi)只有一條語句,則不必使用begin和end。由于initial塊語句在整個仿真期間只能執(zhí)行一次,因此它一般被用于初始化、信號監(jiān)視、生成仿真波形等目的。在變量聲明的同時進行初始化同時進行端口/數(shù)據(jù)聲明和初始化always語句always語句包括的所有行為語句構(gòu)成了一個always語句塊。該always語句塊從仿真0時刻開始順序執(zhí)行其中的行為語句;在最后一條執(zhí)行完成后,再次開始執(zhí)行其中的第一條語句,如此循環(huán)往復(fù),直至整個仿真結(jié)束。always語句通常用于對數(shù)字電路中一組反復(fù)執(zhí)行的活動進行建模。例如時鐘信號發(fā)生器,每半個時鐘周期時鐘信號翻轉(zhuǎn)一次。在現(xiàn)實電路中只要電源接通,時鐘信號發(fā)生器從時刻0就有效,一直工作下去。5.2過程賦值語句過程賦值語句的更新對象是寄存器、整數(shù)、實數(shù)或時間變量。這些類型的變量在被賦值后,其值將保持不變,直到被其他過程賦值語句賦予新值。用法:過程賦值語句的左側(cè)值可以是:1.reg,整型數(shù)、實型數(shù)、時間寄存器變量或存儲器單元。

2.

上述各種類型的位選(例如,addr[0])。3.

上述各種類型的域選(例如,addr[31:16])。上面三種類型的拼接。Verilog包括兩種類型的過程賦值語句:阻塞賦值和非阻塞賦值語句阻塞賦值語句阻塞賦值語句使用“=”作為賦值符,在一個begin-end塊中表現(xiàn)為串行行為。x=0執(zhí)行完成之后,才會執(zhí)行y=1

仿真0時刻執(zhí)行

仿真時刻15執(zhí)行仿真時刻25執(zhí)行1.如果右側(cè)表達式的位寬較寬,則將保留從最低位開始的右側(cè)值,把超過左側(cè)位寬的高位丟棄;2.如果左側(cè)位寬大于右側(cè)位寬,則不足的高位補0;非阻塞賦值使用“<=”作為賦值符。x=0與y=1同時執(zhí)行

仿真0時刻執(zhí)行仿真時刻15執(zhí)行仿真時刻10執(zhí)行仿真0時刻執(zhí)行注意:不要在同一個always塊中混合使用阻塞和非阻塞賦值語句。非阻塞賦值語句的應(yīng)用對程序:有如下的特點:1.在每個時鐘上升沿到來時讀取in1,in2,in3和reg1,計算右側(cè)表達式的值;2.對左值的賦值由仿真器調(diào)度到相應(yīng)的仿真時刻,延遲時間由語句中內(nèi)嵌的延遲值確定。在本例中,對reg1的賦值需要等一個時間單位,對reg2的賦值需要等到時鐘信號下降沿到來的時刻,對reg3的賦值需要等一個時間單位;3.每個賦值操作在被調(diào)度的仿真時刻完成。注意,對左側(cè)變量的賦值使用的是由仿真器保存的表達式“舊值”。在本例中,對reg3賦值使用的是reg1的“舊值”,而不是在此之前對reg1賦予的新值,reg1的“舊值”是在賦值事件調(diào)度時由仿真器保存的。使用非阻塞賦值來避免競爭采用阻塞賦值完成產(chǎn)生了競爭的情況:a=b和b=a,具體執(zhí)行順序的先后取決于所使用的仿真器,因此這段代碼達不到交換a和b值的目的。在每個時鐘上升沿到來的時候,仿真器讀取每個操作數(shù)的值,進而計算表達式的值并保存在臨時變量中;當賦值的時候,仿真器將這些保存的值賦予非阻塞賦值語句的左側(cè)變量。5.3基于延遲的時序控制Verilog提供了三種時序控制方法:基于延遲的時序控制、基于事件的時序控制和電平敏感的時序控制?;谘舆t的時序控制出現(xiàn)在表達式中,它指定了語句開始執(zhí)行到執(zhí)行完成之間的時間間隔。其格式如下:延遲值可以是數(shù)字、標識符或表達式,需要在延遲值前加上關(guān)鍵字#。對于過程賦值,Verilog提供了三種類型的延遲控制:常規(guī)延遲控制、賦值內(nèi)嵌延遲控制和零延遲控制。常規(guī)延遲控制常規(guī)延遲控制位于賦值語句的左邊,用于指定一個非零延遲值。內(nèi)嵌賦值延遲控制除了可以將延遲控制置于賦值語句之前,還可以將它嵌入到賦值語句中,放在賦值符的右邊。這種延遲方式的效果與常規(guī)延遲賦值是完全不同的。零延遲控制在同一仿真時刻,位于不同always和initial塊中的過程語句有可能被同時計算,但是執(zhí)行(賦值)順序是不確定的,與使用的仿真器類型有關(guān)。在這種情況下,零延遲控制可以保證帶零延遲控制的語句將在執(zhí)行時刻相同的多條語句中最后執(zhí)行,從而避免發(fā)生競爭。但需要注意的是,如果存在多條帶有零延遲的語句,則它們之間的執(zhí)行順序也將是不確定的。具有零延遲,語句被最后執(zhí)行,仿真0時刻結(jié)束時,x和y的值都為1,但它們的執(zhí)行順序是不確定的。盡量不要使用零延遲控制5.4基于事件的時序控制在Verilog中,事件是指某一個寄存器或線網(wǎng)變量的值發(fā)生了變化。Verilog提供了4種類型的事件控制:常規(guī)事件控制、命名事件控制、OR(或)事件控制和電平敏感時序控制。常規(guī)事件控制事件控制使用符號@來說明,語句繼續(xù)執(zhí)行的條件是信號的值發(fā)生變化、發(fā)生正向跳變和負向跳變。關(guān)鍵字posedge用于指明正向跳變,negedge用于指明負向跳變。命名事件控制Verilog語言提供了命名事件控制機制。用戶可以在程序中聲明event(事件)類型的變量,觸發(fā)該變量,并且識別該事件是否已經(jīng)發(fā)生。命名事件由關(guān)鍵字event聲明,它不能保存任何值。事件的觸發(fā)用符號->表示;判斷事件是否發(fā)生使用符號@來識別。OR事件控制有時,多個信號或者事件中發(fā)生的任意一個變化都能夠觸發(fā)語句或語句塊的執(zhí)行。在Verilog語言中,可以使用“或”表達式來表示這種情況。由關(guān)鍵詞“or”連接的多個事件名或者信號名組成的列表稱為敏感列表。在跳變沿敏感的觸發(fā)器中,也可以使用關(guān)鍵詞“,”來代替“or”。如果組合邏輯塊語句的輸入變量很多,那么編寫敏感列表會很繁瑣并且容易出錯。針對這種情況,Verilog提供了另外兩個特殊的符號:@*和@(*),它們都表示對其后語句塊中的所有輸入變量的變化是敏感的。5.5電平敏感時序控制Verilog同時也允許使用另外一種形式表示的電平敏感時序控制(即后面的語句和語句塊需要等待某個條件為真才能執(zhí)行)。Verilog語言用關(guān)鍵字wait來表示等待電平敏感的條件為真。仿真器連續(xù)監(jiān)視count_enable的值。如果其值為0,則不執(zhí)行后面的語句,仿真會停頓下來;如果其值為1,則在20個時間單位之后執(zhí)行這條語句。如果count_enable始終為1,那么count將每20個時間單位加1。5.6條件語句條件語句用于根據(jù)某個條件來確定是否執(zhí)行其后的語句,關(guān)鍵字if和else用于表示條件語句。Verilog語言共有三種類型的條件語句,用法如下:5.7多路分支語句——case當條件語句中選項的數(shù)目很多時,使用if-else語句就會很不方便,這時可以使用case語句來解決這個問題。case語句使用關(guān)鍵字case,endcase和default來表示。語法如下:case語句中的每一條分支語句都可以是一條語句或一組語句。多條語句需要使用關(guān)鍵字begin和end組合為一個塊語句。在執(zhí)行時,首先計算條件表達式的值,然后按順序?qū)⑺透鱾€候選項進行比較,如果和全部候選項都不相等,則執(zhí)行default_statement語句。注意,default_statement語句是可選的,而且在一條case語句中不允許有多條default_statement。另外,case語句可以嵌套使用。case語句類似于多路選擇器,下面使用case語句實現(xiàn)四選一多路選擇器。case語句逐位比較表達式的值和候選項的值,每一位的值可能是0,1,x或z。上例中只考慮0和1的情況,將x和z的情況歸結(jié)為default。我們也可以將這部分進行單獨的說明,如下:casex/casezcase語句還有兩個變形:casex和casez。casez語句將條件表達式或候選項表達式中的z作為無關(guān)值,所有值為z的位也可以用“?”來代表,即對非x的位置casex語句將條件表達式或候選項表達式中的x作為無關(guān)值。casex和casez的使用可以讓我們在case表達式中只對非x或非z的位置進行比較。casez的使用與casex的使用類似。5.7循環(huán)語句Verilog語言中有四種類型的循環(huán)語句:while,for,repeat和forever。這些循環(huán)語句的語法與C語言中的循環(huán)語句相當類似。循環(huán)語句只能在always或initial塊中使用,循環(huán)語句可以包含延遲表達式。while循環(huán)while循環(huán)使用關(guān)鍵字while來表示。while循環(huán)執(zhí)行的中止條件是while表達式的值為假。如果遇到while語句時while表達式的值已經(jīng)為假,那么循環(huán)語句一次也不執(zhí)行。for循環(huán)for循環(huán)使用關(guān)鍵字for來表示,它由三個部分組成:

1.初始條件;2.檢查終止條件是否為真;3.改變控制變量的過程賦值語句。for循環(huán)語句因此它的寫法較while循環(huán)更為緊湊。但是要注意,while循環(huán)比for循環(huán)更為通用,并不是在所有情況下都能使用for循環(huán)來代替while循環(huán)。repeat循環(huán)關(guān)鍵字repeat用來表示這種循環(huán)。repeat的功能是執(zhí)行固定次數(shù)的循環(huán),它不能像while循環(huán)那樣根據(jù)邏輯表達式來確定循環(huán)是否繼續(xù)進行。repeat循環(huán)的次數(shù)必須是一個常量、一個變量或者一個信號。如果循環(huán)重復(fù)次數(shù)是變量或者信號,循環(huán)次數(shù)是循環(huán)開始執(zhí)行時變量或者信號的值,而不是循環(huán)執(zhí)行期間的值。forever循環(huán)關(guān)鍵字forever用來表示永久循環(huán)。在永久循環(huán)中不包含任何條件表達式,只執(zhí)行無限的循環(huán),直到遇到系統(tǒng)任務(wù)$finish為止。如果需要從forever循環(huán)中退出,可以使用disable語句。例1:時鐘發(fā)生器例2:在每個時鐘正跳變沿處使兩個寄存器的值一致5.8順序塊和并行塊塊語句的作用是將多條語句合并成一組,使它們像一條語句那樣。在前面的例子中,我們使用關(guān)鍵字begin和end將多條語句合并成一組。由于這些語句需要一條接一條地順序執(zhí)行,因此常稱為順序塊。Verilog語言中的塊語句類型有兩種:順序塊和并行塊。我們將討論三種有特點的塊語句:命名塊、命名塊的禁用以及嵌套的塊。塊語句的類型——順序塊順序塊由關(guān)鍵字begin和end構(gòu)成,用于將多條語句組成一個塊,它的特點是:1.順序塊中的語句是一條接一條按順序執(zhí)行的;只有前面的語句執(zhí)行完成之后才能執(zhí)行后面的語句(除了帶有內(nèi)嵌延遲控制的非阻塞賦值語句);2.如果語句包括延遲或事件控制,那么延遲總是相對于前面那條語句執(zhí)行完成的仿真時間的。順序塊的例子在前面學(xué)習(xí)中涉及很多,如塊語句的類型——并行塊并行塊由關(guān)鍵字fork和join聲明,它具有以下特性:1.并行塊內(nèi)的語句并發(fā)執(zhí)行;2.語句執(zhí)行的順序是由各自語句中的延遲或事件控制決定的;3.語句中的延遲或事件控制是相對于塊語句開始執(zhí)行的時刻而言的。并行塊與順序塊之間的根本區(qū)別在于:當控制轉(zhuǎn)移到塊語句的時刻,并行塊中所有的語句同時開始執(zhí)行,語句之間的先后順序是無關(guān)緊要的。并行塊為我們提供了并行執(zhí)行語句的機制。但是,在使用并行塊時需要注意,如果兩條語句在同一時刻對同一個變量產(chǎn)生影響,那么將會引起隱含的競爭。競爭結(jié)果取決于仿真器的具體實現(xiàn)方法。無法正確地處理競爭是目前所使用的仿真器的一個缺陷,這一缺陷并不是并行塊所引起的。如果x=1’b0和y=1’b1兩條語句首先執(zhí)行,那么最終變量z和w的值為1和2如果z={x,y}和w={y,x}兩條語句首先執(zhí)行,那么最終變量z和w的值都是2’bxx塊語句的特點塊語句具有的三個特點:嵌套塊、命名塊和命名塊的禁用。嵌套塊塊可以嵌套使用,順序塊和并行塊能夠混合在一起使用。命名塊塊可以具有自己的名字,我們稱之為命名塊。它的特點:1.命名塊中可以聲明局部變量。2.命名塊是設(shè)計層次的一部分,命名塊中聲明的變量可以通過層次名引用進行訪問。3.命名塊可以被禁用,例如停止其執(zhí)行。命名塊的禁用使用關(guān)鍵字disable可以終止命名塊執(zhí)行。disable可以用來從循環(huán)中退出、處理錯誤條件以及根據(jù)控制信號來控制某些代碼段是否被執(zhí)行。對塊語句的禁用導(dǎo)致緊接在塊后面的那條語句被執(zhí)行。生成塊生成語句能夠控制變量的聲明、任務(wù)或函數(shù)的調(diào)用,還能對實例引用進行全面的控制。編寫代碼時必須在模塊中說明生成的實例范圍,關(guān)鍵字generate-endgenerate用來指定該范圍。生成實例可以是模塊、用戶自定義原語、門級原語、連續(xù)賦值語句、initial和always塊中的一種或多種。生成的實例具有惟一的標識名,因此可以用層次命名規(guī)則引用。Verilog語言允許在生成范圍內(nèi)聲明下列數(shù)據(jù)類型:net(線網(wǎng))和reg(寄存器)、integer(整型數(shù))、real(實型數(shù))、time(時間型)和realtime(實數(shù)時間型)、event(事件)。任務(wù)和函數(shù)的聲明也允許出現(xiàn)在生成范圍中,但不能出現(xiàn)在循環(huán)生成當中。不允許出現(xiàn)在生成范圍中的模塊項聲明包括:參數(shù)、局部參數(shù)、輸入、輸出和輸入/輸出聲明、指定塊在Verilog中有三種創(chuàng)建生成語句的方法:循環(huán)生成、條件生成、case生成。循環(huán)生成語句循環(huán)生成語句允許使用者對變量聲明、模塊、用戶自定義原語、門級原語、連續(xù)賦值語句、initial和always塊進行多次實例引用。在仿真開始前,仿真器會對生成塊中的代碼進行確立(展平),將生成塊轉(zhuǎn)換為展開的代碼,然后對展開的代碼進行仿真。因此,生成塊的本質(zhì)是使用循環(huán)內(nèi)的一條語句來代替多條重復(fù)的Verilog語句,簡化用戶的編程;關(guān)鍵詞genvar用于聲明生成變量,生成變量只能用在生成塊中;在確立后的仿真代碼中,生成變量是不存在的;一個生成變量的值只能由循環(huán)生成語句來改變;循環(huán)生成語句可以嵌套使用。但是使用同一個生成變量作為索引的循環(huán)生成語句不能相互嵌套;xor_loop是賦予循環(huán)生成語句的名字,目的在于通過它對循環(huán)生成語句中的變量進行層次化引用。因此,循環(huán)生成語句中各個異或門的相對層次名分別為:xor_loop[0].g1,xor_loop[1].g1,…,xor_loop[31].g1。條件生成語句條件生成語句類似于if-else-if的生成構(gòu)造,該生成構(gòu)造可以根據(jù)設(shè)計模塊中表達式值的真假,決定是否調(diào)用相應(yīng)的Verilog結(jié)構(gòu)(模塊、用戶自定義原語、門級原語、連續(xù)賦值語句、initial或always塊)。case生成語句與條件生成語句類似,只不過將其中的if-else形式改為case形式。case生成語句可以調(diào)用模塊、用戶自定義原語、門級原語、連續(xù)賦值語句、initial或always塊。舉例1——四選一多路選擇器我們曾使用數(shù)據(jù)流語句進行了描述,這里使用行為級的case語句來實現(xiàn)它。舉例2——四位計數(shù)器行為級描述與數(shù)據(jù)流級描述相比是非常簡潔的。如果輸入信號的值不包括x和z,使用行為級的描述代替數(shù)據(jù)流級描述不會對計數(shù)器的仿真結(jié)果造成影響。舉例3——交通信號燈控制器功能描述:該交通信號燈控制器用于控制一條主干道與一條鄉(xiāng)村公路的交叉口的交通,它必須具有下面的功能:由于主干道上來往的車輛很多,因此控制主干道的交通信號具有最高優(yōu)先級,在默認情況下主干道的綠燈點亮;鄉(xiāng)村公路間斷性地有車經(jīng)過,有車來時鄉(xiāng)村公路的交通燈必須變?yōu)榫G燈,只需維持一段足夠長的時間,以便讓車通過。只要鄉(xiāng)村公路上不再有車輛,那么鄉(xiāng)村公路上的綠燈馬上變?yōu)辄S燈,然后變?yōu)榧t燈;同時,主干道上的綠燈重新點亮;一個傳感器用于監(jiān)視鄉(xiāng)村公路上是否有車等待,它向控制器輸入信號X;如果X=1,則表示有車等待,否則X=0;各個狀態(tài)轉(zhuǎn)換時,具有一定的延遲,這些延遲必須能夠控制。確定狀態(tài)。代碼描述:全

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論