HDL第五章語法與要素_第1頁
HDL第五章語法與要素_第2頁
HDL第五章語法與要素_第3頁
HDL第五章語法與要素_第4頁
HDL第五章語法與要素_第5頁
已閱讀5頁,還剩27頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第5章Verilog語法與要素

本章介紹VerilogHDL的基本要素,包括數字、字符串、標識符、運算符、數據類型和關鍵字等。5.1Verilog語言要素1、空白符

包含空格符、Tab、換行、換頁。每條Verilog語句以;結尾。教材P121中段兩個書寫格式具有相同效果。2、注釋有兩種形式的注釋

單行注釋:以//打頭,直到本行結束,不允許續行。

多行注釋:以/*開始,直到*/結束。30cout//非法:以數字為首out*//非法:

包含不允許字符*3、標識符VerilogHDL中的標識符(identifier)可以是任意一組字母、數字、$符號和_(下劃線)符號的組合,但標識符的第一個字符必須是字母或者下劃線。另外,標識符是區分大小寫的。以下是標識符的幾個例子:4、關鍵字Verilog系統內部使用的詞,關鍵字用戶不可用重定義其它含義。所有的關鍵字都是小寫字母組成。例如always是關鍵字,但是ALWAYS不是關鍵字。5.2常量Verilog中常量主要有三種類型:整數、實數、字符串5.2.1整數。+/-<size>’<base><value>

+/-<二進制位寬>’<進制><數字序列>進制有以下4種形式:

二進制:b或B,不區別大寫、小寫字母;十進制:d或D或缺省,不區別大寫、小寫字母;十六進制:h或H,不區別大寫、小寫字母;

八進制:o或O,不區別大寫、小寫字母;8’b11011010//位寬為8位二進制數110110108’hd5//位寬為8位十六進制數d5(即二進制數11010101)5’o27//位寬為5位八進制數27(即二進制數10111)4’D2//位寬為4位十進制數2(即二進制數0010)4’B1x_01//位寬為4位二進制數1x015’Hx//位寬為5位十六進制數x(即二進制數xxxxx)4’hz//位寬為4位十六進制數z二進制數zzzz)8‘h2A//位寬為8位十六進制數2A即二進制數(00101010)合格的整數書寫例子。不合格的整數書寫例子。3’b001//’與基數b之間不允許出現空格4’d-4//數值不允許正、負符號(+或-)正、負符號只//允許出現在最左面(3+2)’b10//位寬為不可以是表達式在書寫數字時需要注意:1)在較長數字之間可以因_分開,用來提高可讀性,但第一個數字

之前不可以加下劃線。2)無位寬說明時,默認為為32位(二進制)。3)x或z在二進制中代表一位x或z,在八進制中代表3位x或z,在十六

位進制中代表4為x或z.

例如:8’b1001xxxx與8’h9x相同8’b1010zzzz與8’haz相同4)如果沒有定義一個整數的位寬,則其寬度為響應數所需的二進制位。

例如:’o721//9位二進制數111010001‘hAF//8位二進制數101011115)如果定義的位寬比實際的位數長,則通常左邊添0補位,但如果數的

最左邊為x或z,則左邊添x或z。

例如:10’b10//左邊添8位0,即000000001010’bx0x1//左邊添6位x,即xxxxxxx0x1

如果定義的位寬比實際的位小,則左邊(高位)的位數被截掉。

例如:3’b1001_0011同3’b0115’H0FFF同5’H1F6)?是高阻態z的另一種表示方法,在表示數字時完全等同替代。7)整數可以帶正、負符號,正、負號必須寫在最左面。負數通常用

二進制補碼表示。

例如:-8’h72//-72H的8位二進制補碼100011108)當位寬與進制缺省時表示是十進制數。

例如32//表示十進制數32-15//表示十進制數-159)在位寬與’之間,以及進制和數字之間允許出現空格但’與進制之間以

及數字之間不允許出現空格。

例如:6‘b110001//合法,表示6位二進制數1100016’b110001//不合法,在’與進制b之間出現空格6’b110001//不合法,在數字之間出現空格5.2.2實數

實數可以用下列兩種形式定義:1)十進制計數法;例如2)科學計數法;這種形式的實數舉例如下:5.2.3字符串

字符串是雙引號內的字符序列。字符串不能分成多行書寫。例如:字符符的作用主要是在仿真時,顯示一些相關的信息,或者指定顯示格式。字符串屬于reg型變量,其寬度為此字符串中的字符個數乘以8.例如:reg[8*12:1]stringvar;/*tringvar是reg型變量,該變量可以存放包含12個字符的字符串,共96bit*/beginstringvar=“Helloword!”;//變量stringvar存放字符串(包含12個字符)end

轉義標識符(escapedidentifier)可以在一條標識符中包含任何可打印字符。轉義標識符以\(反斜線)符號開頭,以空白結尾(空白可以是一個空格、一個制表字符或換行符)。下面例舉了幾個轉義標識符:反斜線和結束空格并不是轉義標識符的一部分。特殊字符說明\n換行\tTab鍵\\符號\\”符號“\ddd八進制數ddd對應的ASCII字符例如:\1238進制數123對應的ASCII字符是大寫字母S5.3數據類型數據類型是用來表示數字電路中的物理連線、數據存儲和傳輸單元等物理量。VerilogHDL有下列四種邏輯值狀態:1)0:低電平、邏輯0或邏輯非(“假”)2)1:高電平、邏輯1或“真”3)x或X:不確定或未知的邏輯狀態4)z或Z:高阻態VerilogHDL中的變量部分為如下兩種類數據類型:net型和variable型1、

線網類型。net類型表示Verilog結構化元件間的物理連線。它的值由驅動元件的值決定,例如連續賦值或門的輸出。如果沒有驅動元件連接到線網,線網的缺省值為z。可綜合的net型變量有:wire型、tri型、supply1和supply0。見教材P126表5.21)wire型

是最常用的net型數據變量,,VarilogHDL模塊中的輸入/輸出信號未被明確指定數據類型時都被默認為wire型。可以取值0、1、X、Z,如果wire型變量沒有被連接到驅動,其值為高阻態Z。wire型變量定義格式為:wire數據名1,數據名2,…數據名i;//變量位寬為一位。例如:wirea,b;//定義兩個位寬一位的wire型變量a和b。或:wire[n-1:0]數據名1,數據名2,…數據名Ii;//變量位寬為n位。或:wire[n:1]數據名1,數據名2,…數據名Ii;//變量位寬為n位。例如:wire[7:0]databus;//定義位寬8位wire型變量databus。wire[19:0]addrbus;//定義位寬20位wire型變daddrbuswire[0:7]a;//定義位寬為8位的wire型變量2)tri型功能與使用方法與wire型相同,只是為了增加程序的可讀性,可更清楚表示該信號綜合后的電路具有三態的功能。3)supply0h和supply1型supply0用于對“地”建模,即低電平0;supply1網用于對電源建模,即高電平1;例如:2、variable類型。variable類型表示一個抽象的數據存儲單元,它只能在always語句和initial語句中被賦值,在always、initial等模塊內被賦值的信號必須定義為variable型。1)reg型是最常用的variable型變量。被定義為reg型變量在綜合時,

綜合器會根據本具體情況確定將其映射成寄存器還是連線。

定義格式如下:reg數據名1,數據名2,…數據名i;//變量位寬為一位。例如:rega,b;//定義兩個位寬為一位的reg型變量a和b。或:reg[n-1:0]數據名1,數據名2,…數據名i;//變量位寬為n位。或:reg[n:1]數據名1,數據名2,…數據名i;//變量位寬為n位。例如:reg[7:0]qout;//定義位寬

為8位reg型變量qout。reg[8:1]qout;//定義位寬

為8位reg型變量qout。2)integer型多用于表示循環變量,表示循環次數。integer型變量只

能被整體使用,不能作為位向量使用。

定義格式變量同reg:integeri,j;//i、j被定為兩個integer變量。5.4參數Verilog用參數parameter來定義符號常量。參數經常用于定義時延和變量的寬度。使用參數說明的參數只被賦值一次。參數說明形式如下:

參數名通常用大寫字母表示,而標識名、變量采用小寫字母表示。modulecompare_w(a,b,larger,equal,less);//六位數據比較器parameterSIZE=6;//參數定義,可以改變SIZE值input[SIZE-1:0]a,b;outputlarger,equal,less;wirelarger,equal,less;assignlarger=(a>b);assignequal=(a==b);assignless=(a<b);endmodulemoduleadd_w(a,b,sum);//十六位加法器parameterMSB=15;//參數定義,可以改變MSB值input[MSB:0]a,b;output[MSB+1:0]sum;assignsum=a+b;endmodulemodulecount_w(en,clk,reset,out);//八位二進制計數器inputclk,reset,,en;parameterWIDTH=8;//參數定義,可以改變SIZE值output[WIDTH-1:0]out;wire[WIDTH-1:0]out;always@(posedgeclkornegedgereset)if(!reset)out=0;elseif(en)out=out+1;endmodule ````` `modulejohnsont_w(clk,clr,qout);//八位約翰遜計數器inputclk,clr;parameterWIDTH=8;//參數定義,可以改變WIDTH值outputreg[WIDTH-1:0]qout;always@(posedgeclkorposedgeclr)beginif(clr)oqut<=0;elsebeginqout<=qout<<+1;qout[0]<=qout[WIDTH-1];endendendmodule ````` `1、向量與標量5.4向量標量:寬度為一位的變量。如果在變量聲明中沒有指定位寬,則默認

為標量。例如:wirea;//標量aregclr;//reg型標量clr向量(vector):寬度為大于一位的變量。向量的寬度定義形式為:[MSB:LSB]

方括號左邊的數字表示向量的最高位,右邊的數字表示最低位。例如:wire[3:0]bus;//

4位總線標量bus[3]bus[2]bus[1]bus[0]reg[0:7]rc;//8位寄存器rc[0]rc[1]rc[2]rc[3]…rc[7]2、位選擇和域選擇

有兩類向量:標量類向量,未加特別說明定義的向量;

向量類向量,定義時用關鍵字vectored說明。例如:

wirevectored[7:0]databus;//8位向量類標量databusreg[31:0]rega;//32位標量類向量regaVerilogHDL只允許對標量類向量進行位選擇和域選擇。位選擇:在表達式中選擇向量中的某一位。域選擇:表達式中選擇向量中相鄰幾位。

在進行位選擇、域選擇時,必須等號左右兩端的位寬一致。例如:

a=mybyte[6];//位選擇,將mybyte[6]位的值賦給變量a,a是標量。b=mybate[5:2];//將mybyte的第5、4、3、2位的值賦給b,b是//4位向量。例如:

reg[7:0]a,b;reg[3:0]c;regd;d=a[7]&b[7];//位選擇c=a[7:4]+b[3:0];//域選擇3.存儲器

存儲器可以看作是二維向量。Verilog定義存儲器時,必須指明存儲器的容量:單元數和每個存儲單元的字長。用如下方式存儲器:

reg[7:0]mymem[63:0];/*定義存儲器mymem,64個單元,字長8位*/reg[3:0]amem[63:0];//定義存儲器amen,容量64,字長4位regbmem[5:1];//定義存儲器bmen,容量5個單元,字長1位parameterWIDTH=8,MEMSISE=1024;

reg[WIDTH-1:0]mymem[MEMSISE-1:0];//定義字長8bit容量為1024個單元的存儲器mymem,

例如:reg[7:0]mymem[63:0];//定義存儲的存儲器mymem,mymem[8]=8’b10001001;//mymem第8的單元存放10001001。mymem[25]=65;//mymem第25的單元存放十進制數65(01000001)。

對存儲器賦值必須對一個單元整體賦值,不允許對

存儲器進行位選擇和域選擇。Verilog將寄存器看作向量。如果需要對存儲器進行位選擇或域選擇時,可以先將存儲單元讀入寄存器,然后對寄存器進行位選擇或域選擇。

例如:reg[7:0]rega;//定義寄存器8位的rega,reg[7:0]mymem[63:0];//定義存儲的存儲器mymem,mymem[8]=8’b10001001;//mymem第8的單元存放10001001。rega=mvmem[8];rega[3]=rega[3]&®a[2];mvmem=rega;//mymem第8單元的值是10000001

有一種存儲器賦值的方法是分別對存儲器中的每個字賦值。例如:為存儲器賦值的另一種方法是使用系統任務:1)$readmemb(加載二進制值)2)$readmemh(加載十六進制值)

這些系統任務從指定的文本文件中讀取數據并加載到存儲器。文本文件必須包含相應的二進制或者十六進制數。例如:存儲器文件中必須包含二進制值,也可以包含空白空間和注釋VerilogHDL中的操作符可以分為下述類型:1)算術操作符2)關系操作符3)相等操作符4)邏輯操作符5)按位操作符6)歸約操作符7)移位操作符8)條件操作符9)連接和復制操作符5.6運算符1算術運算符雙目運算符算術操作符有:+加雙目運算符-減雙目運算符*乘雙目運算符/除雙目運算符%求模雙目運算符2邏輯運算符

這些操作符在邏輯值0或1上操作。邏輯操作的結果為0或1。對于向量操作,將向量作整體處理,非0向量作為1處理。全0向量作0處理如果任意一個操作數包含x,結果也為x。!x結果為x&01x|01x^01x^~01x0000001x001x010X101X1111110x101Xx0xxxx1xxxxxxxxx位運算是對操作數按位對應進行邏輯運算。位運算包括:

~單目運算符,對操作數各位進行取反運算。&雙目運算符,對兩個操作數按位進行與邏輯運算。|雙目運算符,對兩個操作數按位進行或邏輯運算。^雙目運算符,對兩個操作數按位進行異或邏輯運算。^~雙目運算符,對兩個操作數按位進行同或邏輯運算。~01X10x3.位運算符

若a=5’b11001,b=5’b10101,則:~a的結果為5’b00110,a&b的結果為5’b10001,a|b的結果為5’b11101,a^b的結果為5’b01100.。兩個不同長度的數據進行位操作時,自動按右端(最低位)對齊,位少的數高位自動補0.4.關系運算符雙目運算符關系運算符有:>大于<小于>=不小于(大于等于)<=不大于(小于等于)

關系操作符的結果:關系成立為真(1);關系不成立為假(0)。如果操作數中有一位為X或Z,那么結果為X。例如:23>45結果為假(0),52<8'hxFF結果為x。

如果操作數長度不同,長度較短的操作數在高位(左方)添0補齊。例如:5.等式運算符雙目運算符相等運算符(==)與全等運算符(===)的過程是參與比較運算的兩個操作數必須逐位進行比較,如果兩個操作數各位均是確定的邏輯值(0或1),則兩個數各位對應相等,結果為1,否則為0。如果兩個操作數中如果某位是不定態(x)或高阻值(z),則相等比較(==)的結果是不定值,而全等比較(===)則對這些不定態或高阻值的位也逐位比較,只有兩個操作數完全逐位相等,其結果為1,否則為0。

如果操作數的長度不相等,長度較小的操作數在左側添0補位,例如:==等于!=不等于===全等于!==全不等于等式運算結果是邏輯值:1或0.例:adata=‘b11x0bdata=‘b11x0則adata==bdata運算結果是x

而adata===bdata

運算結果是16縮位運算符單目運算符

溫馨提示

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

評論

0/150

提交評論