




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
FPGA技術之Verilog語法基本概念Verilog語法的基本概念一、VerilogHDLVerilogHDL是一種用于數字系統設計的語言。用VerilogHDL描述的電路設計就是該電路的VerilogHDL模型也稱為模塊。VerilogHDL既是一種行為描述的語言也是一種結構描述的語言。這也就是說,無論描述電路功能行為的模塊或描述元器件或較大部件互連的模塊都可以用Verilog語言來建立電路模型。如果按照一定的規(guī)矩編寫,功能行為模塊可以通過工具自動地轉換為門級互連模塊。Verilog模型可以是實際電路的不同級別的抽象。這些抽象的級別和它們對應的模型類型共有以下五種:1.1
系統級(system):用語言提供的高級結構實現設計模塊外部性能的模型。1.2
算法級(algorithm):用語言提供的高級結構實現算法運行的模型。1.3
RTL級(RegisterTransferLevel):描述數據在寄存器之間流動和如何處理和控制這些數據流動的模型。1.4
門級(gate-level):描述邏輯門以及邏輯門之間的連接的模型。1.5
開關級(switch-level):描述器件中三極管和儲存節(jié)點以及它們之間連接的模型。二、VerilogHDL模塊一個復雜電路系統的完整VerilogHDL模型是由若干個VerilogHDL模塊構成的,每一個模塊又可以由若干個子模塊構成。其中有些模塊需要綜合成具體電路,而有些模塊只是與用戶所設計的模塊有交互聯系的現存電路或激勵信號源。利用VerilogHDL語言結構所提供的這種功能就可以構造一個模塊間的清晰層次結構來描述極其復雜的大型設計,并對所作設計的邏輯電路進行嚴格的驗證。VerilogHDL行為描述語言作為一種結構化和過程性的語言,其語法結構非常適合于算法級和RTL級的模型設計。這種行為描述語言具有以下功能:(1)
可描述順序執(zhí)行或并行執(zhí)行的程序結構。(2)
用延遲表達式或事件表達式來明確地控制過程的啟動時間。(3)
通過命名的事件來觸發(fā)其它過程里的激活行為或停止行為。(4)
提供了條件、if-else、case、循環(huán)程序結構。(5)
提供了可帶參數且非零延續(xù)時間的任務(task)程序結構。(6)
提供了可定義新的操作符的函數結構(function)。(7)
提供了用于建立表達式的算術運算符、邏輯運算符、位運算符。VerilogHDL作為一種高級的硬件描述編程語言,與C語言的風格有許多類似之處。其中有許多語句如:if語句、case語句等和C語言中的對應語句十分相似。如果讀者已經掌握C語言編程的基礎,那么學習VerilogHDL并不困難。我們只要對VerilogHDL某些語句的特殊方面著重理解,并加強上機練習就能很好地掌握它,就能利用它的強大功能來設計復雜的數字邏輯電路系統。2.1
簡單的VerilogHDL模塊2.1.1
Verilog
語法簡介下面先介紹一個個簡單的VerilogHDL程序,從中了解Verilog模塊的特性。moduletest_project_top(//模塊名inputclk,//
時鐘輸入inputresetn,//
復位input[7:0]a,//信號輸入,信號a位寬為8bitinput[7:0]b,//信號輸入,信號b位寬為8bitinputen,//
信號是能輸入信號en位寬為1bitoutputreg[8:0]c,//
寄存器類型定義,信號輸出c為9bitoutputreg[15:0]d//
寄存器類型定義,信號輸出d為16bit);/*........*///.........表示注釋部分,注釋只是為了方便程序員理解程序,對編譯是不起作用的。/*一個.v文件中主要由一個或多個module...endmodule塊組成每個module塊內包括:模塊名,輸入端口,輸出端口,以及多個時序電路,組合電路等組成*///
簡單的時序電路組成always@(posedgeclkornegedgeresetn)beginif(~resetn)//
或者if(!resetn)取resetn反begind<=16'h0;endelsebeginif(en)//ifen==1
那么d等于a*b+a/b;否則d<=0d<=a*b+a/b;//+
,-,*,/加減乘除elsed<=0;endend//
簡單的組合電路always@(aorb)//
只要其中a或b一個變化就執(zhí)行always塊內語句beginif(en)//verilog
語法if...else...,在組合電路中一個if對應一個else,不能缺else,防止產生鎖存器c<=a*b+a/b;elsec<=0;endwire[8:0]sum;//
常見變量定義類型:wire-線網型,reg-寄存器assignsum=a+b;//
組合電路賦值,關鍵字assignwire[15:0]multy;assignmulty=(en)?a*b:0;//
如果en==1,那么multy=a*b,否則multy=0;wiree;assigne=&a;//&
按位與wiref;assignf=|b;//|
按位或wire[8:0]c_sum;//
實例化模塊my_addu_add_top(//my_add
模塊名,u_add_top實例化名.clk(clk),//端口連接輸入.resetn(resetn),//端口連接輸入.a(a),//端口連接輸入.b(b),//端口連接輸入.c(c_sum)//端口連接輸出);endmodule這個小程序表述了一個.v文件包含了常用的verilog語法,變量的定義類型包括:wire,reg等,常見的運算符號跟C語言中相同,理解較容易。在這個例子中存在著兩個模塊。模塊test_project_top引用由模塊my_add定義的實例部件u_add_top。模塊test_project_top是頂層模塊。模塊my_add則被稱為子模塊。在實例部件u_add_top中,帶“.”的表示被引用模塊的端口,名稱必須與被引用模塊my_add的端口定義一致,小括號中表示在本模塊中與之連接的線路。2.1.2
Verilog用于模塊的測試Verilog還可以用來描述變化的測試信號。描述測試信號的變化和測試過程的模塊也叫做測試平臺(Testbench或Testfixture),它可以對上面介紹的電路模塊(無論是行為的或結構的)進行動態(tài)的全面測試。通過觀測被測試模塊的輸出信號是否符合要求,可以調試和驗證邏輯系統的設計和結構正確與否,發(fā)現問題及時修改。下面我們來看一個Verilog的測試模塊,//
測試激勵產生`timescale1ns/1psmoduletest_project_top_tb;//
測試文件模塊名//
信號測試激勵,輸入變量聲明regclk;regreset;reg[7:0]a;reg[7:0]b;regen;//
輸出變量聲明wire[8:0]c;wire[15:0]d;//
信號變量初始化,關鍵字initialinitialbeginclk=0;reset=0;a=0;b=0;en=0;#1000;//
在1000ns后reset拉高reset=1;end//
時鐘生成always#5clk=~clk;//時鐘周期10ns,每隔5ns取反一次always@(posedgeclk)begin//{$random}
為系統任務,它會產生一個隨機數#1a={$random}%256;//
產生隨機的位信號流a和b,%256為做模256運算#3b={$random}%256;//
分別延遲1和3個時間單位后產生隨機的位信號流a和bendalways#10000en=!en;//產生周期為10000個單位時間的選通信號變化//
實例化被測試模塊test_project_topu_top(.clk(clk),//
時鐘輸入.resetn(reset),//
復位.a(a),//信號輸入,信號a位寬為8bit.b(b),//信號輸入,信號b位寬為8bit.en(en),//
信號是能輸入信號en位寬為1bit.c(c),//
寄存器類型定義,信號輸出c為9bit.d(d)//
寄存器類型定義,信號輸出d為16bit);endmodule本測試例程是對2.1.1中的小程序的測試,屬于RTL級功能仿真,主要調試語法及時序信號是否跟設計時一致。對于初學者來說,這是最基本的技能,必須熟練掌握。圖1仿真時序圖2.1.3
總結:通過上面這些的例子可以看到以下幾點:(1)VerilogHDL程序是由模塊構成的。每個模塊的內容都是位于module和endmodule兩個語句之間,每個模塊實現特定的功能。(2)模塊是可以進行層次嵌套的。正因為如此,才可以將大型的數字電路設計分割成不同的小模塊來實現特定的功能。(3)每個模塊都是可以綜合的,通過綜合工具可以把它們的功能描述全都轉換為最基本的邏輯單元描述,最后可以用一個上層模塊通過實例引用把這些模塊連接起來,把它們整合成一個很大的邏輯系統。(4)Verilog模塊可以分為兩種類型:一種是為了讓模塊最終能生成電路結構,另一種只是為了測試所設計的電路其邏輯功能是否正確。(5)每個模塊要進行端口定義,并說明輸入輸出口,然后對模塊的功能進行描述。(6)VerilogHDL程序的書寫格式自由,一行可以寫幾個語句,一個語句也可以分寫多行。(7)除了endmodule語句外,每個語句和數據定義的最后必須有分號。(8)可以用/*.....*/和//.......對VerilogHDL程序的任何部分作注釋。一個好的,有使用價值的源程序都應當加上必要的注釋,以增強程序的可讀性和可維護性。第三章
verilog語法進階三、模塊的結構、數據類型、變量和基本運算符號3.1
模塊的結構Verilog的基本設計單元是“模塊”(block)。一個模塊是由兩部分組成的,一部分描述接口,另一部分描述邏輯功能,即定義輸入是如何影響輸出的。下面舉例說明:圖2模塊簡圖請看上面的例子:程序模塊旁邊有一個電路圖的符號。在許多方面,程序模塊和電路圖符號是一致的,這是因為電路圖符號的引腳也就是程序模塊的接口。而程序模塊描述了電路圖符號所實現的邏輯功能。以上就是設計一個簡單的Verilog程序模塊所需的全部內容。從上面的例子可以看出,Verilog結構位于在module和endmodule聲明語句之間,每個Verilog程序包括四個主要部分:端口定義、I/O說明、內部信號聲明、功能定義。3.1.1
模塊的端口定義模塊的端口聲明了模塊的輸入輸出口。其格式如下:module
模塊名(口1,口2,口3,口4,………);…….endmodule模塊的端口表示的是模塊的輸入和輸出口名,也就是它與別的模塊聯系端口的標識。在模塊被引用時,在引用的模塊中,有些信號要輸入到被引用的模塊中,有的信號需要從被引用的模塊中取出來。在引用模塊時其端口可以用兩種方法連接:1)在引用時,嚴格按照模塊定義的端口順序來連接,不用標明原模塊定義時規(guī)定的端口名,舉例說明如下:模塊名實例化名(連接端口1信號名,連接端口2信號名,連接端口3信號名,….,,,);2)在引用時用“.”標明原模塊定義時規(guī)定的端口名,舉例說明如下:模塊名實例化名(.端口1名(連接信號1名),.端口2名(連接信號2名),….,,,);這樣表示的好處在于可以用端口名與被引用模塊的端口對應,不必嚴格按端口順序對應,提高了程序的可讀性和可移植性。3.1.2
模塊內容模塊的內容包括I/O說明、內部信號聲明、功能定義。
I/O說明的格式如下:輸入口:input[信號位寬-1:0]端口名1;input[信號位寬-1:0]端口名2;………;input[信號位寬-1:0]端口名i;//(共有i個輸入口)輸出口:output[信號位寬-1:0]端口名1;output[信號位寬-1:0]端口名2;………;output[信號位寬-1:0]端口名j;//(共有j個輸出口)輸入/輸出口:inout[信號位寬-1:0]端口名1;inout[信號位寬-1:0]端口名2;………;inout[信號位寬-1:0]端口名k;//(共有k個雙向總線端口)I/O說明也可以寫在端口聲明語句里。其格式如下:modulemodule_name(inputport1,inputport2,…outputport1,outputport2…);
內部信號說明:在模塊內用到的和與端口有關的wire和reg類型變量的聲明。如:reg[width-1:0]R變量1,R變量2。。。。;wire[width-1:0]W變量1,W變量2。。。。;………..
功能定義:模塊中最重要的部分是邏輯功能定義部分。有三種方法可在模塊中產生邏輯。1)用“assign”聲明語句,如:assigna=b&c;2)實例化模塊,如:andu1(q,a,b);3)用“always”塊如:always@(posedgeclkorposedgeclr)beginif(clr)q<=0;elseif(en)q<=d;end采用“assign”語句是描述組合邏輯最常用的方法之一。而“always”塊既可用于描述組合邏輯也可描述時序邏輯。上面的例子用“always”塊生成了一個帶有異步清除端的D觸發(fā)器?!癮lways”塊可用很多種描述手段來表達邏輯,例如上例中就用了if...else語句來表達邏輯關系。如按一定的風格來編寫“always”塊,可以通過綜合工具把源代碼自動綜合成用門級結構表示的組合或時序邏輯電路。3.1.3
理解要點:如果用Verilog模塊實現一定的功能,首先應該清楚哪些是同時發(fā)生的,哪些是順序發(fā)生的。上面分別采用了“assign”語句、實例元件和“always”塊,描述的邏輯功能是同時執(zhí)行的。也就是說,如果把這三項寫到一個VeriIog模塊文件中去,它們的次序不會影響邏輯實現的功能。這三項是同時執(zhí)行的,也就是并發(fā)的。然而,在“always”模塊內,邏輯是按照指定的順序執(zhí)行的?!癮lways”塊中的語句稱為“順序語句”,因為它們是順序執(zhí)行,所以“always”塊也稱作“過程塊”。請注意,兩個或更多的“always”語句塊,它們是同時執(zhí)行的,而模塊內部的語句是順序執(zhí)行的??匆幌隆癮lways”塊內的語句,你就會明白它是如何實現功能的。if..else…if必須順序執(zhí)行,否則其功能就沒有任何意義。如果else語句在if語句之前執(zhí)行,其功能就會不符合要求!為了能實現上述描述的功能,“always”語句塊內部的語句將按照書寫的順序執(zhí)行。在Verilog模塊中所有過程塊(如:initial塊、always塊)、連續(xù)賦值語句、實例引用都是并行的。它們表示的是一種通過變量名互相連接的關系。在同一模塊中這三者出現的先后次序沒有關系。只有連續(xù)賦值語句assign和實例引用語句可以獨立于過程塊而存在于模塊的功能定義部分。以上是與C語言有很大的不同。許多與C語言類似的語句只能出現在過程塊中,而不能隨意出現在模塊功能定義的范圍內。3.2
數據類型及其常量、變量VerilogHDL中總共有十九種數據類型,數據類型是用來表示數字電路硬件中的數據儲存和傳送元素的。先只介紹四個最基本的數據類型,它們是:reg型、wire型、integer型、parameter型。其它數據類型也有很多:large型、medium型、scalared型、time型、small型、tri型、trio型、tri1型、triand型、trior型、trireg型、vectored型、wand型、wor型。3.2.1
常量在程序運行過程中,其值不能被改變的量稱為常量。下面首先對在VerilogHDL語言中使用的數字及其表示方式進行介紹。
整數:在VerilogHDL中,整型常量即整常數有以下四種進制表示形式:1)二進制整數(b或B)2)十進制整數(d或D)3)十六進制整數(h或H)4)八進制整數(o或O)
x和z值:在數字電路中,x代表不定值,z代表高阻值。一個x可以用來定義十六進制數的四位二進制數的狀態(tài),八進制數的三位,二進制數的一位。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//非法格式3.2.2
參數(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;//用常數表達式賦值3.2.3
變量
wire型wire型數據常用來表示用于以assign關鍵字指定的組合邏輯信號。Verilog程序模塊中輸入輸出信號類型缺省時自動定義為wire型。wire型信號可以用作任何方程式的輸入,也可以用作“assign”語句或實例元件的輸出。wire型信號的格式同reg型信號的很類似。其格式如下:wire[n-1:0]數據名1,數據名2,…數據名i;//共有i條總線,每條總線內有n條線路wire[n:1]數據名1,數據名2,…數據名i;wire是wire型數據的確認符,[n-1:0]和[n:1]代表該數據的位寬,即該數據有幾位。最后跟著的是數據的名字。如果一次定義多個數據,數據名之間用逗號隔開。聲明語句的最后要用分號表示語句結束。如下格式:wirea;//定義了一個一位的wire型數據wire[7:0]b;//定義了一個八位的wire型數據wire[4:1]c,d;//定義了二個四位的wire型數據
reg型寄存器是數據儲存單元的抽象。寄存器數據類型的關鍵字是reg。通過賦值語句可以改變寄存器儲存的值,其作用與改變觸發(fā)器儲存的值相當。reg類型數據的缺省初始值為不定值,x。reg型只表示被定義的信號將用在“always”塊內。reg型數據常用來表示用于“always”模塊內的指定信號,常代表觸發(fā)器。通常,在設計中要由“always”塊通過使用行為描述語句來表達邏輯關系。在“always”塊內被賦值的每一個信號都必須定義成reg型。reg型數據的格式如下:reg[n-1:0]數據名1,數據名2,…數據名i;reg[n:1]數據名1,數據名2,…數據名i;reg是reg型數據的確認標識符,[n-1:0]和[n:1]代表該數據的位寬,即該數據有幾位(bit)。最后跟著的是數據的名字。如果一次定義多個數據,數據名之間用逗號隔開。聲明語句的最后要用分號表示語句結束。如下:regrega;//定義了一個一位的名為rega的reg型數據reg[3:0]regb;//定義了一個四位的名為regb的reg型數據reg[4:1]regc,regd;//定義了兩個四位的名為regc和regd的reg型數據
memory型VerilogHDL通過對reg型變量建立數組來對存儲器建模,可以描述RAM型存儲器,ROM存儲器和reg文件。數組中的每一個單元通過一個數組索引進行尋址。在Verilog語言中沒有多維數組存在。memory型數據是通過擴展reg型數據的地址范圍來生成的。其格式如下:reg[n-1:0]
存儲器名[m-1:0];或reg[n-1:0]存儲器名[m:1];在這里,reg[n-1:0]定義了存儲器中每一個存儲單元的大小,即該存儲單元是一個n位的寄存器。存儲器名后的[m-1:0]或[m:1]則定義了該存儲器中有多少個這樣的寄存器。最后用分號結束定義語句。下面舉例說明:reg[7:0]mema[255:0];這個例子定義了一個名為mema的存儲器,該存儲器有256個8位的存儲器。該存儲器的地址范圍是0到255。注意:對存儲器進行地址索引的表達式必須是常數表達式。另外,在同一個數據類型聲明語句里,可以同時定義存儲器型數據和reg型數據。見下例:parameterwordsize=16,//定義二個參數memsize=256;reg[wordsize-1:0]mem[memsize-1:0],writereg,readreg;盡管memory型數據和reg型數據的定義格式很相似,但要注意其不同之處。如一個由n個1位寄存器構成的存儲器組是不同于一個n位的寄存器的。見下例:reg[n-1:0]rega;//一個n位的寄存器regmema[n-1:0];//一個由n個1位寄存器構成的存儲器組一個n位的寄存器可以在一條賦值語句里進行賦值,而一個完整的存儲器則不行。見下例:rega=0;//合法賦值語句mema=0;//非法賦值語句如果想對memory中的存儲單元進行讀寫操作,必須指定該單元在存儲器中的地址。下面的寫法是正確的。mema[3]=0;//給memory中的第3個存儲單元賦值為0。進行尋址的地址索引可以是表達式,這樣就可以對存儲器中的不同單元進行操作。表達式的值可以取決于電路中其它的寄存器的值。例如可以用一個加法計數器來做RAM的地址索引。3.3
運算符及表達式VerilogHDL語言的運算符范圍很廣,其運算符按其功能可分為以下幾類:1)算術運算符(+,-,×,/,%)2)賦值運算符(=,<=)3)關系運算符(>,<,>=,<=)4)邏輯運算符(&&,||,!)5)條件運算符(?:)6)位運算符(~,|,^,&,^~)7)移位運算符(<<,>>)8)拼接運算符({})9)其它在VerilogHDL語言中運算符所帶的操作數是不同的,按其所帶操作數的個數運算符可分為三種:1)單目運算符(unaryoperator):可以帶一個操作數,操作數放在運算符的右邊。2)二目運算符(binaryoperator):可以帶二個操作數,操作數放在運算符的兩邊。3)三目運算符(ternaryoperator):可以帶三個操作,這三個操作數用三目運算符分隔開。clock=~clock;//~是一個單目取反運算符,clock是操作數。c=a|b;//是一個二目按位或運算符,a和b是操作數。r=s?t:u;//?:是一個三目條件運算符,s,t,u是操作數。下面對常用的幾種運算符進行介紹。3.3.1
基本的算術運算符在VerilogHDL語言中,算術運算符又稱為二進制運算符,共有下面幾種:1)+(加法運算符,或正值運算符,如rega+regb,+3)2)-(減法運算符,或負值運算符,如rega-3,-3)3)×(乘法運算符,如rega*3)4)/(除法運算符,如5/3)5)%(模運算符,或稱為求余運算符,要求%兩側均為整型數據。如7%3的值為1)3.3.2
位運算符VerilogHDL作為一種硬件描述語言,是針對硬件電路而言的。在硬件電路中信號有四種狀態(tài)值1,0,x,z.在電路中信號進行與或非時,反映在VerilogHDL中則是相應的操作數的位運算。
"取反"運算符~~是一個單目運算符,用來對一個操作數進行按位取反運算。其運算規(guī)則見下表:圖3取反求值rega='b1010;//rega的初值為'b1010rega=~rega;//rega的值進行取反運算后變?yōu)?b010
“按位與”運算符&按位與運算就是將兩個操作數的相應位進行與運算,其運算規(guī)則見下表:圖4按位與求值
“按位或”運算符|按位或運算就是將兩個操作數的相應位進行或運算。其運算規(guī)則見下表:圖5按位或求值
“按位異或”運算符^(也稱之為XOR運算符)按位異或運算就是將兩個操作數的相應位進行異或運算。其運算規(guī)則見下表:圖6按位異或求值
“按位同或”運算符^~按位同或運算就是將兩個操作數的相應位先進行異或運算再進行非運算。其運算規(guī)則見下表:圖7按位同或求值
不同長度的數據進行位運算兩個長度不同的數據進行位運算時,系統會自動的將兩者按右端對齊。位數少的操作數會在相應的高位用0填滿,以使兩個操作數按位進行操作。3.4
邏輯運算符在VerilogHDL語言中存在三種邏輯運算符:1)&&邏輯與2)||邏輯或3)!邏輯非“&&”和“||”是二目運算符,它要求有兩個操作數,如(a>b)&&(b>c),(a<b)||(b<c)。"!"是單目運算符,只要求一個操作數,如!(a>b)。下表為邏輯運算的真值表。它表示當a和b的值為不同的組合時,各種邏輯運算所得到的值。圖8求與邏輯運算符中“&&”和“||”的優(yōu)先級別低于關系運算符,“!”高于算術運算符。3.5
關系運算符關系運算符共有以下四種:a<ba小于ba>ba大于ba<=ba小于或等于ba>=ba大于或等于b在進行關系運算時,如果聲明的關系是假的(false),則返回值是0,如果聲明的關系是真的(true),則返回值是1,如果某個操作數的值不定,則關系是模糊的,返回值是不定值。3.6
等式運算符在VerilogHDL語言中存在四種等式運算符:1)==(等于)2)!=(不等于)3)===(等于)4)!==(不等于)注意:求反號、雙等號、三個等號之間不能有空格這四個運算符都是二目運算符,它要求有兩個操作數。"=="和"!="又稱為邏輯等式運算符。其結果由兩個操作數的值決定。由于操作數中某些位可能是不定值x和高阻值z,結果可能為不定值x。而“===”和“!==”運算符則不同,它在對操作數進行比較時對某些位的不定值x和高阻值z也進行比較,兩個操作數必需完全一致,其結果才是1,否則為0。“===”和“!==”運算符常用于case表達式的判別,所以又稱為“case等式運算符”。這四個等式運算符的優(yōu)先級別是相同的。下面畫出==與===的真值表,幫助理解兩者間的區(qū)別。圖9===與==的區(qū)別下面舉一個例子說明“==”和“===”的區(qū)別。例:if(A==1‘bx)$display(“AisX”);(當A等于X時,這個語句不執(zhí)行)if(A===1‘bx)$display(“AisX”);(當A等于X時,這個語句執(zhí)行)3.7
移位運算符在VerilogHDL中有兩種移位運算符:<<(左移位運算符)和>>(右移位運算符)。其使用方法如下:a>>n或a<<na代表要進行移位的操作數,n代表要移幾位。這兩種移位運算都用0來填補移出的空位。3.8
位拼接運算符(Concatation)在VerilogHDL語言有一個特殊的運算符:位拼接運算符{}。用這個運算符可以把兩個或多個信號的某些位拼接起來進行運算操作。其使用方法如下:{信號1的某幾位,信號2的某幾位,..,..,信號n的某幾位}即把某些信號的某些位詳細地列出來,中間用逗號分開,最后用大括號括起來表示一個整體信號。見下例:{a,b[3:0],w,3’b101}也可以寫成為{a,b[3],b[2],b[1],b[0],w,1’b1,1’b0,1’b1}在位拼接表達式中不允許存在沒有指明位數的信號。這是因為在計算拼接信號的位寬的大小時必需知道其中每個信號的位寬。位拼接還可以用重復法來簡化表達式。見下例:{4{w}}//這等同于{w,w,w,w}位拼接還可以用嵌套的方式來表達。見下例:{b,{3{a,b}}}//這等同于{b,a,b,a,b,a,b}用于表示重復的表達式如上例中的4和3,必須是常數表達式。3.9
縮減運算符(reductionoperator)縮減運算符是單目運算符,也有與或非運算。其與或非運算規(guī)則類似于位運算符的與或非運算規(guī)則,但其運算過程不同。位運算是對操作數的相應位進行與或非運算,操作數是幾位數則運算結果也是幾位數。而縮減運算則不同,縮減運算是對單個操作數進行或與非遞推運算,最后的運算結果是一位的二進制數??s減運算的具體運算過程是這樣的:第一步先將操作數的第一位與第二位進行或與非運算,第二步將運算結果與第三位進行或與非運算,依次類推,直至最后一位。例如:reg[3:0]B;regC;C=&B;相當于:C=((B[0]&B[1])&B[2])&B[3];由于縮減運算的與、或運算規(guī)則類似于位運算符與、或運算規(guī)則,這里不再詳細講述,請參照位運算符的運算規(guī)則介紹。3.10
優(yōu)先級別下面對各種運算符的優(yōu)先級別關系作一個總結。見下表:圖10運算符優(yōu)先級3.11
關鍵詞在VerilogHDL中,所有的關鍵詞是事先定義好的確認符,用來組織語言結構。關鍵詞是用小寫字母定義的,因此在編寫程序代碼時必須注意關鍵詞的書寫,以避免出錯。下面是VerilogHDL中使用的關鍵詞always,and,assign,begin,buf,bufif0,bufif1,case,casex,casez,cmos,deassign,default,defparam,disable,edge,else,end,endcase,endmodule,endfunction,endprimitive,endspecify,endtable,endtask,event,for,force,forever,fork,function,highz0,highz1,if,initial,inout,input,integer,join,large,macromodule,medium,module,nand,negedge,nmos,nor,not,notif0,notifl,or,output,parameter,pmos,posedge,primitive,pull0,pull1,pullup,pulldown,rcmos,reg,releses,repeat,mmos,rpmos,rtran,rtranif0,rtranif1,scalared,small,specify,specparam,strength,strong0,strong1,supply0,supply1,table,task,time,tran,tranif0,tranif1,tri,tri0,tri1,triand,trior,trireg,vectored,wait,wand,weak0,weak1,while,wire,wor,xnor,xor注意在
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年遼寧省大連市單招職業(yè)傾向性測試題庫及答案參考
- 2024年一級建造師題庫匯編帶答案解析
- 科室新入人員崗前培訓
- 演出經紀人員資格考試題目解析2025
- 2025年廣東省清遠市單招職業(yè)傾向性測試題庫帶答案
- 制作簡易太陽能熱水器(教學設計)-2024-2025學年科學五年級上冊人教鄂教版
- 消防培訓課件解讀
- 2025至2030年中國五金標準件數據監(jiān)測研究報告
- 小學美術嶺南版二年級下冊16. 童話中的城堡教學設計
- 四年級信息技術上冊 月球探秘 1教學設計 冀教版
- DB32/T 4443-2023 罐區(qū)內在役危險化學品(常低壓)儲罐管理規(guī)范
- 雪球特別版:段永平投資問答錄(投資邏輯篇)
- 民航服務心理學-民航旅客的態(tài)度-課件
- 游樂設備(高空攬月)機械結構設計
- 衛(wèi)輝市陳召北井煤礦礦產資源開采與生態(tài)修復方案
- 工程管理筆試題
- 模板支架搭拆安全風險告知卡
- YS/T 751-2011鉭及鉭合金牌號和化學成分
- GB/Z 18620.3-2008圓柱齒輪檢驗實施規(guī)范第3部分:齒輪坯、軸中心距和軸線平行度的檢驗
- GB/T 4436-1995鋁及鋁合金管材外形尺寸及允許偏差
- GB/T 3884.8-2012銅精礦化學分析方法第8部分:鋅量的測定Na2EDTA滴定法
評論
0/150
提交評論