《基于FPGA的現(xiàn)代數(shù)字電路設(shè)計》-第3章_第1頁
《基于FPGA的現(xiàn)代數(shù)字電路設(shè)計》-第3章_第2頁
《基于FPGA的現(xiàn)代數(shù)字電路設(shè)計》-第3章_第3頁
《基于FPGA的現(xiàn)代數(shù)字電路設(shè)計》-第3章_第4頁
《基于FPGA的現(xiàn)代數(shù)字電路設(shè)計》-第3章_第5頁
已閱讀5頁,還剩40頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

3.1VerilogHDL語言基本結(jié)構(gòu)Verilog的基本設(shè)計單元是“模塊”(block),用于描述某個設(shè)計的功能或結(jié)構(gòu)以及通信的接口。一個模塊是由兩部分組成的,一部分用于描述外部接口,另一部分描述內(nèi)部邏輯功能,即定義輸入是如何實(shí)現(xiàn)邏輯設(shè)計的,每個模塊在概念上等同一個器件,都實(shí)現(xiàn)特定的功能。下面通過一個簡單的VerilogHDL程序,介紹其基本結(jié)構(gòu),首先介紹加法器程序,代碼如下:下一頁返回3.1VerilogHDL語言基本結(jié)構(gòu)

該例描述一個8位加法器,它描述的電路如圖3.1所示。可看出整個模塊是以module開始,endmodule結(jié)束,程序模塊和電路圖符號是一致的,電路圖符號的引腳就是程序模塊的接口,module與endmodule之間的程序描述了電路圖符號所實(shí)現(xiàn)的邏輯功能。上面的程序中,模塊中的第二、三、四、五、六行說明接口的信號流向,第七行說明了模塊的邏輯功能。以上設(shè)計包含了Verilog程序模塊所需的全部內(nèi)容。從上面的例子可以看出,Verilog結(jié)構(gòu)完全嵌在module和endmodule聲明語句之間,語句moduleaddr(a,b,cin,count,sum);中,module是模塊的保留字;addr是模塊的名字,相當(dāng)于器件名;()內(nèi)是該模塊的端口聲明,定義了該模塊的管腳名,是該模塊與其他模塊通信的外部接口,相當(dāng)于器件的引腳(pin)。上一頁下一頁返回3.1VerilogHDL語言基本結(jié)構(gòu)

input[2:0]a;input[2:0]b;inputcin;outputcount;是I/O說明語句,其中的input、output是保留字,定義了管腳信號的流向;[n:0]表示該信號的位寬(總線或單根信號線)。邏輯功能語句是assign{count,sum}=a+b+cin;每個Verilog程序包括四個主要部分:端口定義、I/O說明、內(nèi)部信號聲明、功能定義。一個VerilogHDL程序的完整結(jié)構(gòu)如下:上一頁下一頁返回3.1VerilogHDL語言基本結(jié)構(gòu)

如下上一頁下一頁返回3.1VerilogHDL語言基本結(jié)構(gòu)

模塊的結(jié)構(gòu)需按上面的順序進(jìn)行,VerilogHDL的書寫格式自由,一行可以寫幾個語句,也可以一個語句分幾行寫,具體由代碼書寫規(guī)范約束。除endmodule語句外,每個語句后面需有分號表示該語句結(jié)束。對于初學(xué)者,建議一個模塊用一個文件,模塊名與文件名要同名,一行一句語句。信號方向按輸入、輸出、雙向順序描述。上一頁返回3.2功能的定義3.2.1用“assign”語句定義功能用“assign”語句定義功能屬于數(shù)據(jù)流的建模方式,就是通過對數(shù)據(jù)流在設(shè)計中的具體行為的描述來建模。最基本的方式就是用連續(xù)賦值語句。在連續(xù)賦值語句中,某個值被賦給某個連接線變量(信號),如assignA=B;在數(shù)據(jù)流描述方式中,還必須借助HDL提供的一些運(yùn)算符,如按位邏輯運(yùn)算符:邏輯與(&)、邏輯或(|)等。下一頁返回3.2功能的定義3.2.2用“always”塊語句定義功能“always”塊語句既可用于描述組合邏輯也可用于描述時序邏輯,示例代碼如下:上一頁下一頁返回3.2功能的定義上面的例子用“always”塊語句生成了一個帶有異步清零端的D觸發(fā)器,用if...else語句來表達(dá)邏輯關(guān)系。always@()括號里面是敏感信號。這里的posedgeclk是敏感信號,其含義是在clk的上升沿時有效;negedgeclr也是敏感信號,其含義是在clr的下降沿時有效,這種形式一般時序邏輯都會用到。上一頁返回下一頁3.2功能的定義

3.2.3用例化語句調(diào)用其他模塊來定義邏輯功能這種方式也稱為結(jié)構(gòu)化描述方式,它通過對電路結(jié)構(gòu)的描述來建模,即通過調(diào)用單元器件并用線將各單元器件連接起來實(shí)現(xiàn)特定的邏輯功能。這種描述方式反映了設(shè)計中的層次結(jié)構(gòu)。下面舉例說明,用兩個一位的全加器來構(gòu)成兩位的全加器?,F(xiàn)在模塊中采用例化語句調(diào)用兩個一位全加器adder,實(shí)現(xiàn)兩位全加器的功能,具體代碼如下:上一頁下一頁返回3.2功能的定義

moduleTwo_bit_Adder(A,B,Cin,Sum,Cout);input[1:0]A;input[1:0]B;inputCin;output[1:0]Sum;outputCout;wiretemp;adderU0(.a(A[0]),上一頁下一頁返回3.2功能的定義

.b(B[0]),.Cin(Cin),.Sum(Sum[0]),.Cout(temp));adderU1(.a(A[1]),.b(B[1]),.Cin(temp),上一頁下一頁返回3.2功能的定義

.Sum(Sum[1]),.Cout(Cout));endmodule.a(A[1]),等語句表示連接關(guān)系,.a是一位加法器U1(adder)的端口,其與信號A[1]相連。上一頁返回3.3VerilogHDL基本語法3.3.1標(biāo)識符標(biāo)識符(identifier)用于定義模塊名、端口名和信號名等。VerilogHDL中的標(biāo)識符(identifier)可以是任意一組字母、數(shù)字、$符號和下劃線符號_的組合,但標(biāo)識符的第一個字符必須是字母或者下劃線。注意,標(biāo)識符是區(qū)分大小寫的,不能與VerilogHDL中的關(guān)鍵字相同。模塊名要遵循一定的命名規(guī)則,這樣方便自己和其他閱讀者在讀程序時一目了然。其規(guī)則大致如下:(1)頂層文件采取“對象+功能+top”的格式,如video_oneline_top。下一頁返回3.3VerilogHDL基本語法(2)介于頂層和驅(qū)動層文件之間的邏輯控制文件采取“對象+ctr”的格式,如ddr_ctr。(3)驅(qū)動程序命名采取“對象+功能+dri”的格式,如lcd_dri。(4)參數(shù)文件命名采取“對象+para”的格式,如lcd_para。(5)取有意義的、有效的名字,如Sum、CPU_addr等。(6)時鐘采用Clk前綴,如Clk_50、Clk_CPU等。(7)低電平采用_n后綴,如Enable_n等。(8)復(fù)位信號采用rst_counter等。上一頁下一頁返回3.3VerilogHDL基本語法(9)計數(shù)器采用cnt+序號的方式,用于不容易混淆的計數(shù),如cnt0、cnt1、cnt2等。VerilogHDL中有兩種注釋的方式,一種以“/*”開始,以“*/”結(jié)束,在兩個符號之間的語句為注釋語句,可擴(kuò)展到多行。3.3.2常量在程序運(yùn)行過程中,其值不能被改變的量稱為常量。VerilogHDL語言中使用的數(shù)字及其表示方式有一定的規(guī)則。上一頁下一頁返回3.3VerilogHDL基本語法1.數(shù)字在VerilogHDL中,整型常量即整常數(shù),有以下四種進(jìn)制表示形式:(1)二進(jìn)制整數(shù)(b或B)。(2)八進(jìn)制整數(shù)(o或O)。(3)十六進(jìn)制整數(shù)(h或H)。(4)十進(jìn)制整數(shù)(d或D)。完整的數(shù)字表達(dá)格式為<位寬><進(jìn)制符號><數(shù)字>。上一頁下一頁返回3.3VerilogHDL基本語法2.字符串字符串是雙引號內(nèi)的字符序列。字符串不能分成多行書寫。例如:"INTERNALERROR"和"12345"。用8位ASCII值表示的字符可看作無符號整數(shù),因此字符串是8位ASCII值的序列。為存儲字符串“INTERNALERROR”,變量需要8*14位。3.參數(shù)(parameter)在VerilogHDL中用parameter來定義常量,即用parameter來定義一個標(biāo)識符,讓它代表一個常量,因而稱為符號常量,采用標(biāo)識符代表一個常量可提高程序的可讀性和可維護(hù)性。上一頁下一頁返回3.3VerilogHDL基本語法parameter型數(shù)據(jù)是一種常數(shù)型的數(shù)據(jù),其格式如下:parameter是參數(shù)型數(shù)據(jù)的關(guān)鍵字,確認(rèn)符后跟著一個用逗號分隔開的賦值語句表。在每一個賦值語句的右邊必須是一個常數(shù)表達(dá)式,該表達(dá)式只能包含數(shù)字或先前已定義過的參數(shù)。如下例:parametermsb=7;//定義參數(shù)msb為常量7parametere=25,f=29;//定義兩個常數(shù)參數(shù)parameterr=5.7;//聲明r為一個實(shí)型參數(shù)上一頁下一頁返回3.3VerilogHDL基本語法parameterbyte_size=8,byte_msb=byte_size?1;//用常數(shù)表達(dá)式賦值parameteraverage_delay=(r+f)/2;//用常數(shù)表達(dá)式賦值參數(shù)型常數(shù)經(jīng)常用于定義延遲時間和變量寬度。在模塊或?qū)嵗脮r可通過參數(shù)傳遞改變被引用模塊或?qū)嵗幸讯x的參數(shù)。3.3.3變量數(shù)據(jù)類型VerilogHDL主要包括兩種數(shù)據(jù)類型:連接線類型和寄存器類型。3.3.4運(yùn)算符及表達(dá)式上一頁下一頁返回3.3VerilogHDL基本語法VerilogHDL語言的運(yùn)算符很多,其運(yùn)算符按其功能可分為以下幾類:(1)算術(shù)運(yùn)算符(+,?,×,/,%)。(2)賦值運(yùn)算符(=,<=)。(3)關(guān)系運(yùn)算符(>,<,>=,<=)。(4)邏輯運(yùn)算符(&&,||,!)。(5)條件運(yùn)算符(?:)。(6)位運(yùn)算符(~,|,^,&,^~)。(7)移位運(yùn)算符(<<,>>)。(8)拼接運(yùn)算符({})。上一頁返回3.4VerilogHDL基本語句3.4.1賦值語句在VerilogHDL語言中,信號有兩種賦值方式:(1)非阻塞(Non_Blocking)賦值方式,如b<=a;(2)阻塞(Blocking)賦值方式,如b=a;所謂阻塞賦值方式,是指在同一個always塊中,其后面的賦值語句從概念上(即使不設(shè)定延遲)是在前一句賦值語句結(jié)束后再開始賦值的,不能受來自任何其他Verilog語句的干擾。b=a;語句:賦值語句執(zhí)行完后,塊才結(jié)束,b的值在賦值語句執(zhí)行完后立刻就改變。下一頁返回3.4VerilogHDL基本語句所謂非阻塞賦值方式,是指在賦值時刻開始時,計算非阻塞等式右邊的賦值表達(dá)式,在賦值時刻結(jié)束時,更新非阻塞等式左邊的賦值表達(dá)式。非阻塞賦值方式,在塊結(jié)束后才完成賦值操作。對于b<=a;b的值并不是立刻就改變。非阻塞賦值方式和阻塞賦值方式的區(qū)別常給設(shè)計人員帶來問題。問題主要是給“always”塊內(nèi)的reg型信號的賦值方式不易把握。到目前為止,前面所舉的例子中的“always”模塊內(nèi)的reg型信號都是采用下面的這種賦值方式:b<=a;上一頁下一頁返回3.4VerilogHDL基本語句這種方式的賦值并不是馬上執(zhí)行,也就是說“always”塊內(nèi)的下一條語句執(zhí)行后,b并不等于a,而是保持原來的值?!癮lways”塊結(jié)束后,才進(jìn)行賦值。阻塞賦值方式,采用下面的這種賦值方式:b=a;這種賦值方式是馬上執(zhí)行的,也就是說執(zhí)行下一條語句時,b已等于a。條件語句對條件表達(dá)式1求值,若其結(jié)果為非零值,那么語句1被執(zhí)行;如果條件表達(dá)式1值為0、x或z,那么語句1不執(zhí)行。如果存在一個else分支,那么這個分支被執(zhí)行。上一頁下一頁返回3.4VerilogHDL基本語句3.4.2塊語句塊語句通常用來將兩條或多條語句組合在一起,構(gòu)成一個語句模塊。塊語句有兩種,一種是begin_end語句,通常用來描述順序執(zhí)行的語句,用它來描述的塊稱為順序塊;一種是fork_join語句,通常用來描述并行執(zhí)行的語句,用它來描述的塊稱為并行塊。3.4.3條件語句條件語句是分支轉(zhuǎn)移語句,根據(jù)所給定的條件是否滿足,決定執(zhí)行給出的兩種操作之一。VerilogHDL語言提供了三種形式的if語句。上一頁下一頁返回3.4VerilogHDL基本語句第一種if語句的格式如下:if(條件表達(dá)式1)語句1;第二種if語句的格式如下:if(條件表達(dá)式1)語句1;else語句2第三種if語句的格式如下:if(條件表達(dá)式1)上一頁下一頁返回3.4VerilogHDL基本語句語句1;elseif(條件表達(dá)式2)語句2else語句3條件語句對條件表達(dá)式1求值,若其結(jié)果為非零值,那么語句1被執(zhí)行;如果條件表達(dá)式1值為0、x或z,那么語句1不執(zhí)行。如果存在一個else分支,那么這個分支被執(zhí)行。上一頁下一頁返回3.4VerilogHDL基本語句除上面三種格式,還有一種if_if_else情況,如下例所示:在這里else屬于哪一個if的else呢?是屬于第一個if的條件(clk)的還是屬于第二個if的條件(Reset)的?在VerilogHDL中將else與最近的沒有else的if相關(guān)聯(lián)。在這個例子中,else與內(nèi)層if(Reset)語句是一套上一頁下一頁返回3.4VerilogHDL基本語句3.4.4case語句case語句是一個多路條件分支形式,if語句只有兩個分支可供選擇,而實(shí)際問題中常常需要遇到多分支選擇的情況,Verilog語言提供case語句來處理多分支選擇。其語法如下:上一頁下一頁返回3.4VerilogHDL基本語句case語句首先對條件表達(dá)式case_expr求值,然后依次對各分支項(xiàng)選擇值進(jìn)行比較,第一個與條件表達(dá)式值匹配的分支中的語句被執(zhí)行。在一個分支中定義多個分支項(xiàng);這些選擇值不能互斥。缺省分支是指所有沒有被分支表達(dá)式指明的其他分支。上一頁返回3.5任務(wù)和函數(shù)3.5.1任務(wù)和函數(shù)的不同函數(shù)的目的是通過返回一個值來響應(yīng)輸入信號的值。任務(wù)卻能支持多種目的,能計算多個結(jié)果值,這些結(jié)果值只能通過被調(diào)用的任務(wù)的輸出或總線端口送出。VerilogHDL模塊使用函數(shù)時是把它當(dāng)作表達(dá)式中的操作符,這個操作的結(jié)果值就是這個函數(shù)的返回值。任務(wù)和函數(shù)有些不同,主要的不同有如表3.5所示。3.5.2task語句任務(wù)就是封裝在“task...endtask”之間的一段程序,可以通過調(diào)用的方式來執(zhí)行任務(wù),如果定義了任務(wù),但在整個過程中沒有調(diào)用任務(wù),那么這個任務(wù)是不會執(zhí)行的。下一頁返回3.5任務(wù)和函數(shù)

調(diào)用某個任務(wù)時可能需要它處理某些數(shù)據(jù)并返回操作結(jié)果,因此任務(wù)有接收數(shù)據(jù)的輸入端和返回數(shù)據(jù)的輸出端。如果傳給任務(wù)的變量值和任務(wù)完成后接收結(jié)果的變量已定義,就可以用一條語句啟動任務(wù)。任務(wù)可以啟動其他的任務(wù),其他任務(wù)又可以啟動別的任務(wù),可以啟動的任務(wù)數(shù)是沒有限制的。不管有多少任務(wù)啟動,只有當(dāng)所有的啟動任務(wù)完成以后才能返回。任務(wù)內(nèi)還可以調(diào)用函數(shù)。上一頁下一頁返回3.5任務(wù)和函數(shù)

1.任務(wù)的定義定義任務(wù)的格式如下:上一頁下一頁返回3.5任務(wù)和函數(shù)

任務(wù)接收輸入值和返回輸出值是通過端口聲明語句進(jìn)行的。上面語句定義了一個名為my_task的任務(wù),用于求兩個數(shù)的最大值。在定義任務(wù)時有以下注意事項(xiàng):(1)在第一行task語句中不能列出端口名稱。(2)任務(wù)的輸入、輸出端口和雙向端口數(shù)量不受限制,也可以沒有輸入、輸出端口和雙向端口。(3)在定義任務(wù)的描述語句中,可以出現(xiàn)不可綜合的描述語句,使用最多的是延遲控制語句,這樣會造成該任務(wù)不可綜合。(4)可以調(diào)用其他任務(wù)或函數(shù),也可調(diào)用自身。上一頁下一頁返回3.5任務(wù)和函數(shù)

(5)在任務(wù)定義的結(jié)構(gòu)中,不能出現(xiàn)initial和always過程塊。(6)在任務(wù)定義中可以出現(xiàn)disable終止語句,中斷正在執(zhí)行的任務(wù),但它是不可綜合的。當(dāng)任務(wù)被中斷后,程序?qū)⒎祷氐秸{(diào)用任務(wù)的地方繼續(xù)執(zhí)行。2.任務(wù)的調(diào)用及變量的傳遞雖然在任務(wù)定義的結(jié)構(gòu)中不能出現(xiàn)initial和always過程塊,但任務(wù)調(diào)用語句可以在initial和always語句中使用,啟動任務(wù)并傳遞輸入、輸出變量的語法格式如下:<任務(wù)名>(端口1,端口2,...,端口n);上一頁下一頁返回3.5任務(wù)和函數(shù)

端口1,端口2,…,端口n是參數(shù)列表,給出傳入任務(wù)的數(shù)據(jù)和接收返回結(jié)果的變量。任務(wù)調(diào)用語句中,參數(shù)列表的順序必須與任務(wù)定義中的端口聲明順序相同。任務(wù)調(diào)用語句是過程語句,所以任務(wù)調(diào)用過程中接收返回數(shù)據(jù)的變量必須是寄存器類型。3.5.3function語句函數(shù)的功能類似C語言中的函數(shù),當(dāng)程序執(zhí)行它之后,返回一個值。定義函數(shù)的語法格式如下:上一頁下一頁返回3.5任務(wù)和函數(shù)

在這里<返回值的類型或范圍>這一項(xiàng)是可選項(xiàng),指定函數(shù)返回值的類型和位寬,如缺省則返回值為一位的寄存器類型數(shù)據(jù)。<端口說明語句>用于對函數(shù)各個輸入端口的類型和位寬進(jìn)行說明,至少要有一個輸入端口。在函數(shù)定義時,在函數(shù)內(nèi)部會隱式地定義一個寄存器變量,該寄存器變量與函數(shù)同名且位寬也相

溫馨提示

  • 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

提交評論