深入理解FPGA Verilog HDL語法(一)_第1頁
深入理解FPGA Verilog HDL語法(一)_第2頁
深入理解FPGA Verilog HDL語法(一)_第3頁
深入理解FPGA Verilog HDL語法(一)_第4頁
深入理解FPGA Verilog HDL語法(一)_第5頁
已閱讀5頁,還剩9頁未讀 繼續免費閱讀

付費下載

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

深入理解FPGAVerilogHDL語法(一)

今天給大俠帶來的是一周掌握FPGAVerilogHDL語法,今天開啟第一天,下面咱們廢話就不多說了,一起來看看吧。

在學習中,學習任何東西都有一個過程,一個初步認識到慢慢了解再到精通掌握的過程,當然,學習VerilogHDL語法也是一樣,首先你要了解什么是VerilogHDL,然后結合實踐再遵從理論,你才可能理解的更加迅速更加透徹。

VerilogHDL是一種用于數字邏輯電路設計的語言。用VerilogHDL描述的電路設計就是該電路的VerilogHDL模型。VerilogHDL既是一種行為描述的語言也是一種結構描述的語言。這也就是說,既可以用電路的功能描述也可以用元器件和它們之間的連接來建立所設計電路的VerilogHDL模型。Verilog模型可以是實際電路的不同級別的抽象。這些抽象的級別和它們對應的模型類型共有以下五種。系統級(system):用高級語言結構實現設計模塊的外部性能的模型。算法級(algorithm):用高級語言結構實現設計算法的模型。RTL級(RegisterTransferLevel):描述數據在寄存器之間流動和如何處理這些數據的模型。門級(gate-level):描述邏輯門以及邏輯門之間的連接的模型。

開關級(switch-level):描述器件中三極管和儲存節點以及它們之間連接的模型。

一個復雜電路系統的完整VerilogHDL模型是由若干個VerilogHDL模塊構成的,每一個模塊又可以由若干個子模塊構成。其中有些模塊需要綜合成具體電路,而有些模塊只是與用戶所設計的模塊交互的現存電路或激勵信號源。利用VerilogHDL語言結構所提供的這種功能就可以構造一個模塊間的清晰層次結構來描述極其復雜的大型設計,并對所作設計的邏輯電路進行嚴格的驗證。VerilogHDL行為描述語言作為一種結構化和過程性的語言,其語法結構非常適合于算法級和RTL級的模型設計。這種行為描述語言具有以下功能:可描述順序執行或并行執行的程序結構。

用延遲表達式或事件表達式來明確地控制過程的啟動時間。

通過命名的事件來觸發其它過程里的激活行為或停止行為。

提供了條件、if-else、case、循環程序結構。

提供了可帶參數且非零延續時間的任務(task)程序結構。

提供了可定義新的操作符的函數結構(function)。

提供了用于建立表達式的算術運算符、邏輯運算符、位運算符。

VerilogHDL語言作為一種結構化的語言也非常適合于門級和開關級的模型設計。因其結構化的特點又使它具有以下功能:

提供了完整的一套組合型原語(primitive);

提供了雙向通路和電阻器件的原語;

可建立MOS器件的電荷分享和電荷衰減動態模型。

VerilogHDL的構造性語句可以精確地建立信號的模型。這是因為在VerilogHDL中,提供了延遲和輸出強度的原語來建立精確程度很高的信號模型。信號值可以有不同的的強度,可以通過設定寬范圍的模糊值來降低不確定條件的影響。VerilogHDL作為一種高級的硬件描述編程語言,有著類似C語言的風格。其中有許多語句如:if語句、case語句等和C語言中的對應語句十分相似。如果讀者已經掌握C語言編程的基礎,那么學習VerilogHDL并不困難,我們只要對VerilogHDL某些語句的特殊方面著重理解,并加強上機練習就能很好地掌握它,利用它的強大功能來設計復雜的數字邏輯電路。下面我們將對VerilogHDL中的基本語法逐一加以介紹。

簡單的VerilogHDL模塊

簡單的VerilogHDL程序介紹下面先介紹幾個簡單的VerilogHDL程序,然后從中分析VerilogHDL程序的特性。

moduleadder(count,sum,a,b,cin);input[2:0]a,b;inputcin;outputcount;output[2:0]sum;assign{count,sum}=a+b+cin;endmodule上面這個例子通過連續賦值語句描述了一個名為adder的三位加法器可以根據兩個三比特數a、b和進位(cin)計算出和(sum)和進位(count)。從例子中可以看出整個VerilogHDL程序是嵌套在module和endmodule聲明語句里的。

modulecompare(equal,a,b);

input

[1:0]

a,b;

//聲明輸入信號a,b

outputequal;//聲明輸出信號equal

assignequal=(a==b)?1:0;

/*如果a、b兩個輸入信號相等,輸出為1。否則為0*/

endmodule上面這個程序通過連續賦值語句描述了一個名為compare的比較器。對兩比特數a、b進行比較,如a與b相等,則輸出equal為高電平,否則為低電平。在這個程序中,/*........*/和//.........表示注釋部分,注釋只是為了方便程序員理解程序,對編譯是不起作用的。

moduletrist2(out,in,enable);inputin,enable;outputout;

bufif1

mybuf(out,in,enable);

endmodule上面這個程序描述了一個名為trist2的三態驅動器。程序通過調用一個在Verilog語言庫中現存的三態驅動器實例元件bufif1來實現其功能。

moduletrist1(out,in,enable);inputin,enable;outputout;mytri

tri_inst(out,in,enable);

//調用由mytri模塊定義的實例元件tri_inst

endmodule

modulemytri(out,in,enable);inputin,enable;outputout;assignout=enable?in:'bz;endmodule這個程序例子通過另一種方法描述了一個三態門。在這個例子中存在著兩個模塊。模塊trist1調用由模塊mytri定義的實例元件tri_inst。模塊trist1是頂層模塊。模塊mytri則被稱為子模塊。

通過上面的例子可以了解到:VerilogHDL程序是由模塊構成,每個模塊的內容都是嵌在module和endmodule兩個語句之間。每個模塊實現特定的功能。模塊是可以進行層次嵌套的。正因為如此,才可以將大型的數字電路設計分割成不同的小模塊來實現特定的功能,最后通過頂層模塊調用子模塊來實現整體功能。每個模塊要進行端口定義,并說明輸入輸出口,然后對模塊的功能進行行為邏輯描述。VerilogHDL程序的書寫格式自由,一行可以寫幾個語句,一個語句也可以分寫多行。除了endmodule語句外,每個語句和數據定義的最后必須有分號。可以用/*.....*/和//.......對VerilogHDL程序的任何部分作注釋。一個有使用價值的源程序都應當加上必要的注釋,以增強程序的可讀性和可維護性。

模塊的結構Verilog的基本設計單元是“模塊”(block)。一個模塊是由兩部分組成的,一部分描述接口,另一部分描述邏輯功能,即定義輸入是如何影響輸出的。下面舉例說明:

moduleblock(a,b,c,d);inputa,b;outputc,d;assignc=a|b;assignd=a&b;endmodule上面的例子,程序模塊下面是一個電路圖的符號。在眾多時候,程序模塊和電路圖符號是一致的,這是因為電路圖符號的引腳也就是程序模塊的接口。而程序模塊描述了電路圖符號所實現的邏輯功能。上面的Verilog設計中,模塊中的第3、第4行說明接口的信號流向,第6、第7行說明了模塊的邏輯功能。以上就是設計一個簡單的Verilog程序模塊所需的全部內容。從上面的例子可以看出,Verilog結構完全嵌在module和endmodule聲明語句之間,每個Verilog程序包括四個主要部分:端口定義、I/O說明、內部信號聲明、功能定義。

模塊的端口定義模塊的端口聲明了模塊的輸入輸出口。其格式如下:module模塊名(口1,口2,口3,口4,………);

模塊內容

模塊的內容包括I/O說明、內部信號聲明、功能定義。1、I/O說明的格式如下:輸入口:input端口名1,端口名2,………,端口名i;//(共有i個輸入口)

輸出口:output端口名1,端口名2,………,端口名j;//(共有j個輸出口)I/O說明也可以寫在端口聲明語句里。其格式如下:

modulemodule_name(inputport1,inputport2,…outputport1,outputport2…);

2、內部信號說明:在模塊內用到的和與端口有關的wire和reg變量的聲明。

如:reg[width-1:0]R變量1,R變量2。。。。;

wire[width-1:0]W變量1,W變量2。。。。;……

3、功能定義:

模塊中最重要的部分是邏輯功能定義部分。有三種方法可在模塊中產生邏輯。1).用“assign”聲明語句。如:assigna=b&c;這種方法的句法很簡單,只需寫一個“assign”,后面再加一個方程式即可。例子中的方程式描述了一個有兩個輸入的與門。2).

用實例元件。如:andand_inst(q,a,b);采用實例元件的方法象在電路圖輸入方式下,調入庫元件一樣。鍵入元件的名字和相連的引腳即可,表示在設計中用到一個跟與門(and)一樣的名為and_inst的與門,其輸入端為a,b,輸出為q。要求每個實例元件的名字必須是唯一的,以避免與其他調用與門(and)的實例混淆。

3).用“always”塊。

always@(posedgeclkorposedgeclr)beginif(clr)q<=0;elseif(en)q<=d;end采用“assign”語句是描述組合邏輯最常用的方法之一。而“always”塊既可用于描述組合邏輯也可描述時序邏輯。上面的例子用“always”塊生成了一個帶有異步清除端的D觸發器。“always”塊可用很多種描述手段來表達邏輯,例如上例中就用了if...else語句來表達邏輯關系。如按一定的風格來編寫“always”塊,可以通過綜合工具把源代碼自動綜合成用門級結構表示的組合或時序邏輯電路。注意:如果用Verilog模塊實現一定的功能,首先應該清楚哪些是同時發生的,哪些是順序發生的。上面三個例子分別采用了“assign”語句、實例元件和“always”塊。這三個例子描述的邏輯功能是同時執行的。也就是說,如果把這三項寫到一個VeriIog模塊文件中去,它們的次序不會影響邏輯實現的功能。這三項是同時執行的,也就是并發的。

然而,在“always”模塊內,邏輯是按照指定的順序執行的。“always”塊中的語句稱為“順序語句”,因為它們是順序執行的。請注意,兩個或更多的“always”模塊也是同時執行的,但是模塊內部的語句是順序執行的。看一下“always”內的語句,你就會明白它是如何實現功能的。if..else…if必須順序執行,否則其功能就沒有任何意義。如果else語句在if語句之前執行,功能就會不符合要求。為了能實現上述描述的功能,“always”模塊內部的語句將按照書寫的順序執行。

數據類型及其常量、變量

VerilogHDL中總共有十九種數據類型,數據類型是用來表示數字電路硬件中的數據儲存和傳送元素的。在這里我們先只介紹四個最基本的數據類型,它們是:

reg型、wire型、integer型、parameter型,其它數據類型在后面逐步介紹,也可以查閱相關VerilogHDL語法參考書,其它的類型如下:large型、medium型、scalared型、time型、small型、tri型、trio型、tri1型、triand型、trior型、trireg型、vectored型、wand型、wor型。這些數據類型除time型外都與基本邏輯單元建庫有關,與系統設計沒有很大的關系。在一般電路設計自動化的環境下,仿真用的基本部件庫是由半導體廠家和EDA工具廠家共同提供的。系統設計工程師不必過多地關心門級和開關級的VerilogHDL語法現象。VerilogHDL語言中也有常量和變量之分。它們分別屬于以上這些類型。下面就最常用的幾種進行介紹。

常量

在程序運行過程中,其值不能被改變的量稱為常量。下面首先對在VerilogHDL語言中使用的數字及其表示方式進行介紹。

一.數字型

整數:

在VerilogHDL中,整型常量即整常數有以下四種進制表示形式:1)二進制整數(b或B)2)十進制整數(d或D)

3)十六進制整數(h或H)

4)八進制整數(o或O)

數字表達方式有以下三種:

1)<位寬><進制><數字>這是一種全面的描述方式。2)<進制><數字>在這種描述方式中,數字的位寬采用缺省位寬(這由具體的機器系統決定,但至少32位)。3)<數字>在這種描述方式中,采用缺省進制十進制。在表達式中,位寬指明了數字的精確位數。例如:一個4位二進制數的數字的位寬為4,一個4位十六進制數的數字的位寬為16(因為每單個十六進制數就要用4位二進制數來表示)。見下例:8'b10101100//位寬為8的數的二進制表示,'b表示二進制8'ha2//位寬為8的數的十六進制,'h表示十六進制。

x和z值:

在數字電路中,x代表不定值,z代表高阻值。一個x可以用來定義十六進制數的四位二進制數的狀態,八進制數的三位,二進制數的一位。z的表示方式同x類似。z還有一種表達方式是可以寫作?。在使用case表達式時建議使用這種寫法,以提高程序的可讀性。見下例:4'b10x0//位寬為4的二進制數從低位數起第二位為不定值4'b101z//位寬為4的二進制數從低位數起第一位為高阻值12'dz//位寬為12的十進制數其值為高阻值(第一種表達方式)12'd?//位寬為12的十進制數其值為高阻值(第二種表達方式)8'h4x//位寬為8的十六進制數其低四位值為不定值。

負數:

一個數字可以被定義為負數,只需在位寬表達式前加一個減號,減號必須寫在數字定義表達式的最前面。注意減號不可以放在位寬和進制之間也不可以放在進制和具體的數之間。見下例:-8'd5//這個表達式代表5的補數(用八位二進制數表示)8'd-5//非法格式。

下劃線(underscore_):

下劃線可以用來分隔開數的表達以提高程序可讀性。但不可以用在位寬和進制處,只能用在具體的數字之間。見下例:

16'b1010_1011_1111_1010//合法格式

8'b_0011_1010//非法格式

當常量不說明位數時,默認值是32位,每個字母用8位的ASCII值表示。

例:

10=32’d10=32’b1010211=32’d1=32’b1

-1=-32’d1=32’hFFFFFFFF

‘BX=32’BX=32’BXXXXXXX…X

“AB”=16’B01000001_01000010

二.參數(Parameter)型

在VerilogHDL中用parameter來定義常量,即用parameter來定義一個標識符代表一個常量,稱為符號常量,即標識符形式的常量,采用標識符代表一個常量可提高程序的可讀性和可維護性。parameter型數據是一種常數型的數據,其說明格式如下:parameter參數名1=表達式,參數名2=表達式,…,參數名n=表達式;parameter是參數型數據的確認符,確認符后跟著一個用逗號分隔開的賦值語句表。在每一個賦值語句的右邊必須是一個常數表達式。也就是說,該表達式只能包含數字或先前已定義過的參數。見下例:

parametermsb=7;//定義參數msb為常量7parametere=25,f=29;//定義二個常數參數parameterr=5.7;//聲明r為一個實型參數parameterbyte_size=8,byte_msb=byte_size-1;//用常數表達式賦值parameteraverage_delay=(r+f)/2;//用常數表達式賦值參數型常數經常用于定義延

溫馨提示

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

評論

0/150

提交評論