




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
期中檢測說明11月28號期中檢測按小組抽簽決定(cpld和單片機前四個實驗為基礎,適當變化)123.8循環(huán)語句3.9結構說明語句3.10編譯預處理語句3.11語句的順序執(zhí)行與并行執(zhí)行3.12不同抽象級別的VerilogHDL模型3.13設計技巧3.1引言3.2VerilogHDL基本結構3.3數據類型及常量、變量3.4運算符及表達式3.5語句3.6賦值語句和塊語句3.7條件語句第3章硬件描述語言VerilogHDL33.1引言一、什么是VerilogHDL二、VerilogHDL的發(fā)展歷史三、不同層次的VerilogHDL抽象四、VerilogHDL的特點內容概要43.1引言一、什么是VerilogHDLVerilogHDL是一種用于數字邏輯電路設計的硬件描述語言(HradwareDescriptionLanguage),可以用來進行數字電路的仿真驗證、時序分析、邏輯綜合。用VerilogHDL描述的電路設計就是該電路的VerilogHDL模型。VerilogHDL既是一種行為描述語言也是一種結構描述語言。既可以用電路的功能描述,也可以用元器件及其之間的連接來建立VerilogHDL模型。53.1引言二、VerilogHDL的發(fā)展歷史1983年,由GDA(GateWayDesignAutomation)公司的PhilMoorby首創(chuàng);1989年,Cadence公司收購了GDA公司;1990年,Cadence公司公開發(fā)表VerilogHDL;1995年,IEEE制定并公開發(fā)表VerilogHDL1364-1995標準;1999年,模擬和數字電路都適用的Verilog標準公開發(fā)表63.1引言三、不同層次的VerilogHDL抽象VerilogHDL模型可以是實際電路的不同級別的抽象。抽象級別可分為五級:系統(tǒng)級(systemlevel):用高級語言結構(如case語句)實現的設計模塊外部性能的模型;算法級(algorithmiclevel):用高級語言結構實現的設計算法模型(寫出邏輯表達式);RTL級(registertransferlevel):描述數據在寄存器之間流動和如何處理這些數據的模型;門級(gatelevel):描述邏輯門(如與門、非門、或門、與非門、三態(tài)門等)以及邏輯門之間連接的模型;開關級(switchlevel):描述器件中三極管和儲存節(jié)點及其之間連接的模型。返回3.1273.1引言四、VerilogHDL的特點語法結構上的主要特點:形式化地表示電路的行為和結構;借用C語言的結構和語句;可在多個層次上對所設計的系統(tǒng)加以描述,語言對設計規(guī)模不加任何限制;具有混合建模能力:一個設計中的各子模塊可用不同級別的抽象模型來描述;基本邏輯門、開關級結構模型均內置于語言中,可直接調用;易創(chuàng)建用戶定義原語(UDP,UserDesignedPrimitive)。易學易用,功能強與C語言非常相似!83.2VerilogHDL基本結構一、簡單的VerilogHDL例子二、VerilogHDL模塊的結構三、邏輯功能定義四、關鍵字五、標識符六、編寫VerilogHDL源代碼的標準內容概要93.2VerilogHDL基本結構一、簡單的VerilogHDL例子[例3.2.1]8位全加器
moduleadder8(cout,sum,a,b,cin); outputcout; //輸出端口聲明
output[7:0]sum; input[7:0]a,b; //輸入端口聲明
inputcin; assign{cout,sum}=a+b+cin;
endmodule
assign語句:無論右邊表達式操作數何時發(fā)生變化,右邊表達式都會重新計算,并且在指定的延遲后給左邊表達式賦值。I/O說明端口定義功能描述模塊名(文件名)整個VerilogHDL程序嵌套在module和endmodule聲明語句中。每條語句相對module和endmodule最好縮進2格或4格!//
……
表示注釋部分,一般只占據一行。對編譯不起作用!單行注釋符103.2VerilogHDL基本結構[例3.2.2]8位計數器
modulecounter8(out,cout,data,load,cin,clk); output[7:0]out; outputcout; input[7:0]data; inputload,cin,clk; reg[7:0]out; always@(posedge
clk) begin
if(load) out<=data;//同步預置數據
else out<=out+1+cin;//加1計數
endassigncout=&out&
cin;//若out為8‘hFF,cin為1,則cout為1
endmoduleI/O說明端口定義功能描述信號類型聲明縮減運算符位運算符113.2VerilogHDL基本結構[例3.2.3]2位比較器
modulecompare2(equal,a,b); outputequal; input[1:0]a,b; assignequal=(a==b)?1:0;/*如果a等于b,則equal為1,否則為0*/
endmodule“<=”非阻塞過程性賦值:將想要賦給左式的值安排在未來時刻。不等上一個賦值完成執(zhí)行下個賦值語句?!?”阻塞過程性賦值:按照順序執(zhí)行,前一個賦值結束才執(zhí)行下邊的賦值語句。連續(xù)賦值語句條件運算符/*……*/內表示注釋部分,一般可占據多行。對編譯不起作用!多行注釋符123.2VerilogHDL基本結構[例3.2.4]三態(tài)驅動器
moduletrist2(out,in,enable); outputout; inputin,enable;
bufif1
mybuf(out,in,enable);
endmodule例化元件名門元件關鍵字門元件例化——程序通過調用一個在Verilog語言庫中現存的實例門元件來實現某邏輯門功能。
Inputs|OutputINENABLE |OUTX 0 |Z1 1 |10 1 |0bufif1的真值表門元件例化13moduletrist1(out,in,enable);outputout;inputin,enable;
mytri
tri_inst(out,in,enable);endmodulemodulemytri(out,in,enable);outputout;inputin,enable;assignout=enable?
in:’bz;/*如果enable為1,則out=in,否則為高阻態(tài)*/endmodule3.2VerilogHDL基本結構[例3.2.5]
三態(tài)驅動器例化元件名子模塊名頂層模塊子模塊模塊元件例化模塊元件例化——頂層模塊(trist1)調用由某子模塊(mytri)定義的實例元件(tri_inst)來實現某功能。返回邏輯功能定義143.2VerilogHDL基本結構VerilogHDL程序是由模塊構成的。每個模塊嵌套在module和endmodule聲明語句中。模塊是可以進行層次嵌套的。每個VerilogHDL源文件中只準有一個頂層模塊,其他為子模塊。每個模塊要進行端口定義,并說明輸入輸出端口,然后對模塊的功能進行行為邏輯描述。程序書寫格式自由,一行可以寫幾個語句,一個語句也可以分多行寫。除了endmodule語句、begin_end語句和fork_join語句外,每個語句和數據定義的最后必須有分號??捎?*.....*/和//...對程序的任何部分作注釋。加上必要的注釋,以增強程序的可讀性和可維護性??偨Y153.2VerilogHDL基本結構二、VerilogHDL模塊的結構Verilog的基本設計單元是“模塊
(block)”
。Verilog模塊的結構由在module和endmodule關鍵詞之間的4個主要部分組成:moduleblock1(a,b,c,d);
inputa,b,c;
outputd;
wirex;
assignd=a|x;assignx=(b&~c);endmoduleI/O說明端口定義功能描述信號類型聲明1234163.2VerilogHDL基本結構三、邏輯功能定義在Verilog模塊中有3種方法可以描述電路的邏輯功能:(1)用assign語句
assignx=(b&~c);連續(xù)賦值語句常用于描述組合邏輯門元件例化模塊元件例化例化元件名門元件關鍵字(2)用元件例化(instantiate)
and
myand3(f,a,b,c);注1:元件例化即是調用VerilogHDL提供的元件;注2:元件例化包括門元件例化和模塊元件例化;注3:每個實例元件的名字必須唯一!以避免與其它調用元件的實例相混淆。注4:例化元件名也可以省略!173.2VerilogHDL基本結構(3)用“always”塊語句
always@(posedge
clk)//每當時鐘上升沿到來時執(zhí)行一遍塊內語句
begin
if(load) out=data;//同步預置數據
else out=data+1+cin;//加1計數
end結構說明語句注1:“always”塊語句常用于描述時序邏輯,也可描述組合邏輯。注2:“always”塊可用多種手段來表達邏輯關系,如用if-else語句或case語句。注3:“always”塊語句與assign語句是并發(fā)執(zhí)行的,assign語句一定要放在“always”塊語句之外!183.2VerilogHDL基本結構VerilogHDL模塊的模板(僅考慮用于邏輯綜合的部分)module<頂層模塊名>(<輸入輸出端口列表>);
output
輸出端口列表;
input
輸入端口列表;
//(1)使用assign語句定義邏輯功能
wire結果信號名;
assign<結果信號名>=表達式;
//(2)使用always塊定義邏輯功能
always@(<敏感信號表達式>)begin //過程賦值語句
//if語句
//case語句
//while,repeat,for循環(huán)語句
//task,function調用
end193.2VerilogHDL基本結構//(3)元件例化
<module_name
><instance_name
>(<port_list>);//模塊元件例化
<gate_type_keyword><instance_name
>(<port_list>);//門元件例化endmodule例化元件名也可以省略!203.2VerilogHDL基本結構四、關鍵字關鍵字——事先定義好的確認符,用來組織語言結構;或者用于定義VerilogHDL提供的門元件(如and,not,or,buf)。用小寫字母定義!
——如always,assign,begin,case,casex,else,end,for,function,if,input,output,repeat,table,time,while,wire見《數字系統(tǒng)設計與VerilogHDL》P285附錄A。用戶程序中的變量、節(jié)點等名稱不能與關鍵字同名!213.2VerilogHDL基本結構VerilogHDL關鍵字edgeelseendendcaseendfunctionendprimitiveendmoduleendspecifyendtableendtaskeventforforceforeverforkfunctionhighz0highz1ififnoneinitialinoutinputintegerjoinlargemacromodulemediummodulenandnegedgenornotnotif0notif1nmosoroutputparameterpmosposedgeprimitivepulldownpulluppull0pull1andalwaysassignbeginbufbufif0bufif1casecasexcasezcmosdeassigndefaultdefparamdisable223.2VerilogHDL基本結構VerilogHDL關鍵字(續(xù))tri0tri1vectoredwaitwandweak0weak1whilewireworxnorxorrcmosrealrealtimeregreleaserepeatrnmosrpmosrtranrtranif0rtranif1scalaredsmallspecifyspecparamstrengthstrong0strong1supply0supply1tabletasktrantranif0tranif1timetritriandtriortrireg233.2VerilogHDL基本結構五、標識符
任何用VerilogHDL語言描述的“東西”都通過其名字來識別,這個名字被稱為標識符。如源文件名、模塊名、端口名、變量名、常量名、實例名等。標識符可由字母、數字、下劃線和$符號構成;但第一個字符必須是字母或下劃線,不能是數字或$符號!在VerilogHDL中變量名是區(qū)分大小寫的!合法的名字:A_99_ZReset_54MHz_Clock$Module
不合法的名字:123a$datamodule7seg.v標識符不能與關鍵字同名!243.2VerilogHDL基本結構六、編寫VerilogHDL源代碼的標準編寫VerilogHDL源代碼的標準分為兩類:(1)語匯代碼的編寫標準
規(guī)定了文本布局、命名和注釋的約定,以提高源代碼的可讀性和可維護性。(2)綜合代碼的編寫標準
規(guī)定了Verilog風格,盡量保證能夠綜合,以避免常見的不能綜合及綜合結果存在缺陷的問題,并在設計流程中及時發(fā)現綜合中存在的錯誤。綜合:將用HDL語言或圖形方式描述的電路設計轉換為實際門級電路(如觸發(fā)器、邏輯門等),得到一個網表文件,用于進行適配(在實際器件中進行布局和布線)。253.2VerilogHDL基本結構(1)每個VerilogHDL源文件中只準編寫一個頂層模塊,也不能把一個頂層模塊分成幾部分寫在幾個源文件中。(2)源文件名字應與文件內容有關,最好與頂層模塊同名!源文件名字的第一個字符必須是字母或下劃線,不能是數字或$符號?。?)每行只寫一個聲明語句或說明。(4)源代碼用層層縮進的格式來寫。1
語匯代碼的編寫標準263.2VerilogHDL基本結構(5)定義變量名的大小寫應自始至終保持一致(如變量名第一個字母均大寫)。(6)變量名應該有意義,而且含有一定的有關信息。局部變量名(如循環(huán)變量)應簡單扼要。(7)通過注釋對源代碼做必要的說明,尤其對接口(如模塊參數、端口、任務、函數變量)做必要的注釋很重要。(8)常量盡可能多地使用參數定義和宏定義,而不要在語句中直接使用字母、數字和字符串。參數定義(用一個標識符來代表一個常量)的格式:
parameter
參數名1=表達式,參數名2=表達式,……;宏定義(用一個簡單的宏名來代替一個復雜的表達式)的格式:
’define
標志符(即宏名)字符串(即宏內容)1
語匯代碼的編寫標準(續(xù))273.2VerilogHDL基本結構(1)把設計分割成較小的功能塊,每塊用行為風格設計。除設計中對速度響應要求比較臨界的部分外,都應避免門級描述。(2)建立一個好的時鐘策略(如單時鐘、多相位時鐘,經過門產生的時鐘、多時鐘域等)。保證源代碼中時鐘和復位信號是干凈的(即不是由組合邏輯或沒有考慮到的門產生的)。(3)建立一個好的測試策略,使所有觸發(fā)器都是可復位的,使測試能通過外部管腳進行,又沒有冗余的功能。(4)所有源代碼都必須遵守并符合在always塊語句的4種可綜合標準模板之一。(5)描述組合和鎖存邏輯的always塊,必須在always塊開頭的控制事件列表中列出所有的輸入信號。2
綜合代碼的編寫標準always塊語句模板283.2VerilogHDL基本結構(6)描述組合邏輯的always塊,一定不能有不完全賦值,即所有輸出變量必須被各輸入值的組合值賦值,不能有例外。(7)描述組合和鎖存邏輯的always塊一定不能包含反饋,即在always塊中已被定義為輸出的寄存器變量絕對不能再在該always塊中讀進來作為輸入信號。(8)時鐘沿觸發(fā)的always塊必須是單時鐘的,且任何異步控制輸入(通常是復位或置位信號)必須在控制事件列表中列出。例:always@(posedge
clkornegedgesetornegedgereset)(9)避免生成不想要的鎖存器。在無時鐘的always塊中,若有的輸出變量被賦了某個信號變量值,而該信號變量并未在該always塊的電平敏感控制事件中列出,則會在綜合中生成不想要的鎖存器。2
綜合代碼的編寫標準(續(xù)1)293.2VerilogHDL基本結構(10)避免生成不想要的觸發(fā)器。在時鐘沿觸發(fā)的always塊中,如果用非阻塞賦值語句對reg型變量賦值;或者當reg型變量經過多次循環(huán)其值仍保持不變,則會在綜合中生成觸發(fā)器。用reg型變量生成觸發(fā)器舉例:
modulerw2(clk,d,out1);
inputclk,d;
outputout1;
regout1;
always@(posedgeclk)//沿觸發(fā)
out1<=d;
endmodule
2
綜合代碼的編寫標準(續(xù)2)非阻塞賦值語句dclkout1DQDFF303.2VerilogHDL基本結構若不想生成觸發(fā)器,而是希望用reg型變量生成組合邏輯,則應使用電平觸發(fā):
modulerw2(clk,d,out1);
inputclk,d;
outputout1;
regout1;
always@(d)//電平觸發(fā)
out1<=d;
endmodule
2
綜合代碼的編寫標準(續(xù)3)dout1BUFF313.2VerilogHDL基本結構(11)所有內部狀態(tài)寄存器必須是可復位的,這是為了使RTL級和門級描述能夠被復位成同一個已知的狀態(tài),以便進行門級邏輯驗證。(12)對存在無效狀態(tài)的有限狀態(tài)機和其他時序電路(如4位十進制計數器有6個無效狀態(tài)),必須明確描述所有的2的N次冪種狀態(tài)下的行為(包括無效狀態(tài)),才能綜合出安全可靠的狀態(tài)機。(13)一般地,在賦值語句中不能使用延遲,否則是不可綜合的。(14)不要使用integer型和time型寄存器,否則將分別綜合成32位和64位的總線。(15)仔細檢查代碼中使用動態(tài)指針(如用指針或地址變量檢索的位選擇或存儲單元)、循環(huán)聲明或算術運算部分,因為這類代碼在綜合后會生成大量的門,且難以優(yōu)化。2
綜合代碼的編寫標準(續(xù)4)323.3數據類型及常量、變量一、數據類型二、常量三、變量內容概要333.3數據類型及常量、變量一、數據類型數據類型是用來表示數字電路中的數據存儲和傳送單元。VerilogHDL中共有19種數據類型;其中4個最基本的數據類型為:integer型parameter型reg型wire型
其它數據類型:large型、medium型、scalared型、small型、time型、tri型、tri0型、tri1型、triand型、trior型、trireg型、vectored型、wand型、wor型等二、常量在程序運行過程中,其值不能被改變的量,稱為常量。數字(包括整數,x和z值,負數)parameter常量(或稱符號常量)343.3數據類型及常量、變量整常數的3種表達方式:表達方式說明舉例<位寬>’<進制><數字>完整的表達方式8’b11000101或8’hc5<進制><數字>缺省位寬,則位寬由機器系統(tǒng)決定,至少32位hc5<數字>缺省進制為十進制,位寬默認為32位197(1)整數型常量(即整常數)的4種進制表示形式:二進制整數(b或B);十進制整數(d或D);十六進制整數(h或H);八進制整數(o或O)。注:這里位寬指對應二進制數的寬度。353.3數據類型及常量、變量(2)x和z值x表示不定值,z表示高阻值;8’b1001xxxx或8’h9x8’b1010zzzz或8’haz每個字符代表的二進制數的寬度取決于所用的進制;當用二進制表示時,已標明位寬的數若用x或z表示某些位,則只有在最左邊的x或z具有擴展性!為清晰可見,最好直接寫出每一位的值![例]8’bzx=8’bzzzz_zzzx[例]8’b1x=8’b0000_001x“?”是z的另一種表示符號,建議在case語句中使用?表示高阻態(tài)z[例]casez(select)4’b???1:out=a;4’b??1?:out=b;4’b?1??:out=c;4’b1???:out=d;endcase363.3數據類型及常量、變量(3)負數在位寬前加一個減號,即表示負數如:-8’d5//5的補數,=8‘b11111011減號不能放在位寬與進制之間,也不能放在進制與數字之間!8’d-5//非法格式為提高可讀性,在較長的數字之間可用下劃線_隔開!但不可以用在<進制>和<數字>之間。如:16‘b1010_1011_1100_1111//合法
8‘b_0011_1010//非法當常量未指明位寬時,默認為32位。10=32‘d10=32’b1010-1=-32’d1=32’b1111……1111=32’hFFFFFFFF373.3數據類型及常量、變量(4)parameter常量(符號常量)用parameter來定義一個標識符,代表一個常量——稱為符號常量。參數型數據的確認符parameter
參數名1=表達式,參數名2=表達式,……;每個賦值語句的右邊必須為常數表達式,即只能包含數字或先前定義過的符號常量!
parameteraddrwidth=16;//合法格式
parameteraddrwidth=datawidth*2;//非法格式常用參數來定義延遲時間和變量寬度??捎米址硎镜娜魏蔚胤?都可以用定義的參數來代替。參數是本地的,其定義只在本模塊內有效。在模塊或實例引用時,可通過參數傳遞改變在被引用模塊或實例中已定義的參數!賦值語句表格式383.3數據類型及常量、變量模塊實例引用時參數的傳遞——方法之一:利用defparam定義參數聲明語句!defparam例化模塊名.參數名1=常數表達式,
例化模塊名.參數名2=常數表達式,……;格式defparam語句在編譯時可重新定義參數值??删C合性問題:一般情況下是不可綜合的。提示:不要使用defparam語句!在模塊的實例引用時可用“#”號后跟參數的語法來重新定義參數。39[例]modulemod(out,ina,inb);…parametercycle=8,real_constant=2.039,file=“/user1/jmdong/design/mem_file.dat”;…endmodulemoduletest;…modmk(out,ina,inb);//對模塊mod的實例引用
defparammk.cycle=6,mk.file=“../my_mem.dat”;//參數的傳遞
…endmodule3.3數據類型及常量、變量被引用模塊參數名例化模塊名40[例]modulemod(out,ina,inb);…parametercycle=8,real_constant=2.039,file=“/user1/jmdong/design/mem_file.dat”;…endmodulemoduletest;…mod#(5,3.20,“../my_mem.dat”)mk(out,ina,inb);
//對模塊mod的實例引用
…endmodule3.3數據類型及常量、變量模塊實例引用時參數的傳遞——方法之二:利用特殊符號“#”
被引用模塊參數的傳遞必須與被引用模塊中的參數一一對應!建議用此方法!被引用模塊名#(參數1,參數2,…)例化模塊名(端口列表);格式413.3數據類型及常量、變量三、變量在程序運行過程中,其值可以改變的量,稱為變量。其數據類型有19種,常用的有3種:網絡型(netstype)寄存器型(registertype)數組(memorytype)1.nets型變量定義——輸出始終隨輸入的變化而變化的變量。表示結構實體(如門)之間的物理連接。常用nets型變量:wire,tri:連線類型(兩者功能一致)wor,trior:具有線或特性的連線(兩者功能一致)wand,triand:具有線與特性的連線(兩者功能一致)tri1,tri0:上拉電阻和下拉電阻supply1,supply0:電源(邏輯1)和地(邏輯0)
nets型變量不能儲存值!423.3數據類型及常量、變量wire型變量最常用的nets型變量,常用來表示以assign語句賦值的組合邏輯信號。模塊中的輸入/輸出信號類型缺省為wire型??捎米鋈魏畏匠淌降妮斎耄颉癮ssign”語句和實例元件的輸出。wire
數據名1,數據名2,……,數據名n;wire[n-1:0]
數據名1,數據名2,……,數據名m;或wire[n:1]
數據名1,數據名2,……,數據名m;每條總線位寬為n共有m條總線wire型向量(總線)格式433.3數據類型及常量、變量定義——對應具有狀態(tài)保持作用的電路元件(如觸發(fā)器、寄存器等),常用來表示過程塊語句(如initial,always,task,function)內的指定信號。常用register型變量:reg:常代表觸發(fā)器integer:32位帶符號整數型變量real:64位帶符號實數型變量time:無符號時間變量純數學的抽象描述2.register型變量443.3數據類型及常量、變量register型變量與nets型變量的根本區(qū)別是:register型變量需要被明確地賦值,并且在被重新賦值前一直保持原值。register型變量必須通過過程賦值語句賦值!不能通過assign語句賦值!在過程塊內被賦值的每個信號必須定義成register型!453.3數據類型及常量、變量reg型變量定義——在過程塊中被賦值的信號,往往代表觸發(fā)器,但不一定就是觸發(fā)器(也可以是組合邏輯信號)!reg
數據名1,數據名2,……,數據名n;reg[n-1:0]
數據名1,數據名2,……,數據名m;或reg[n:1]
數據名1,數據名2,……,數據名m;每個向量位寬為n共有m個reg型向量[例]reg[4:1]regc,regd;//regc,regd為4位寬的reg型向量reg型向量(總線)格式463.3數據類型及常量、變量用reg型變量生成組合邏輯舉例:
modulerw1(a,b,out1,out2);
inputa,b;
outputout1,out2;
regout1;
wireout2;
assignout2=a;
always@(b)
out1<=~b;
endmoduleaout2BUFFbINVout1過程賦值語句連續(xù)賦值語句電平觸發(fā)Verilog中reg與wire的區(qū)別reg型變量既可生成觸發(fā)器,也可生成組合邏輯;wire型變量只能生成組合邏輯。473.3數據類型及常量、變量用reg型變量生成觸發(fā)器舉例:
modulerw2(clk,d,out1,out2);
inputclk,d;
outputout1,out2;
regout1;
wireout2;
assignout2=d&~out1;
always@(posedgeclk)
begin
out1<=d;
end
endmodule
過程賦值語句連續(xù)賦值語句dout2AND2i1clkout1DQDFF沿觸發(fā)483.3數據類型及常量、變量定義——由若干個相同寬度的reg型向量構成的數組。VerilogHDL通過reg型變量建立數組來對存儲器建模。memory型變量可描述RAM、ROM和reg文件。memory型變量通過擴展reg型變量的地址范圍來生成:reg[n-1:0]
存儲器名[m-1:0];或reg[n-1:0]存儲器名[m:1];每個存儲單元位寬為n共有m個存儲單元3.memory型變量——數組QuartusII不支持!VerilogHDL中的變量名、參數名等標記符是對大小寫字母敏感的!493.3數據類型及常量、變量含義不同
[例]reg[n-1:0]
rega;//一個n位的寄存器
regmema[n-1:0];//由n個1位寄存器組成的存儲器
必須指明存儲單元的地址!0n-10n-1n-2···地址賦值方式不同
一個n位的寄存器可用一條賦值語句賦值;一個完整的存儲器則不行!若要對某存儲器中的存儲單元進行讀寫操作,必須指明該單元在存儲器中的地址!
[例]rega=0;
//合法賦值語句
mema=0;
//非法賦值語句
mema[8]=1;
//合法賦值語句
mema[1023:0]=0;//合法賦值語句memory型變量與reg型變量的區(qū)別503.4運算符及表達式一、算術運算符二、邏輯運算符三、位運算符四、關系運算符五、等式運算符
內容概要六、縮減運算符七、移位運算符八、條件運算符九、位拼接運算符十、運算符的優(yōu)先級513.4運算符及表達式運算符按功能分為9類:算術運算符邏輯運算符關系運算符等式運算符縮減運算符條件運算符位運算符移位運算符位拼接運算符運算符按操作數的個數分為3類:單目運算符——帶一個操作數邏輯非!,按位取反~,縮減運算符,移位運算符雙目運算符——帶兩個操作數算術、關系、等式運算符,邏輯、位運算符的大部分三目運算符——帶三個操作數條件運算符
523.4運算符及表達式一、算術運算符算術運算符說明
+-*/%加減乘除求模雙目運算符進行整數除法運算時,結果值略去小數部分,只取整數部分!%稱為求模(或求余)運算符,要求%兩側均為整型數據;求模運算結果值的符號位取第一個操作數的符號位!
[例]-11%3結果為-2進行算術運算時,若某操作數為不定值x,則整個結果也為x。 MAX+PLUSII不支持“/”
和“%”運算!QuartusII都支持!533.4運算符及表達式[例]除法和求模運算的區(qū)別注意/和%的區(qū)別!543.4運算符及表達式9/4=29%4=1arithmetic.vwf553.4運算符及表達式二、邏輯運算符邏輯運算符把它的操作數當作布爾變量:非零的操作數被認為是真(1‘b1);零被認為是假(1‘b0);不確定的操作數如4’bxx00,被認為是不確定的(可能為零,也可能為非零)(記為1’bx);但4’bxx11被認為是真(記為1’b1,因為它肯定是非零的)。邏輯運算符說明
&&(雙目)||(雙目)!(單目)邏輯與邏輯或邏輯非進行邏輯運算后的結果為布爾值(為1或0或x)!563.4運算符及表達式“&&”和“||”的優(yōu)先級除高于條件運算符外,低于關系運算符、等式運算符等幾乎所有運算符;邏輯非“!”優(yōu)先級最高。[例](a>b)&&(b>c) 可簡寫為:a>b&&b>c
(a==b)||(x==y) 可簡寫為:a==b||x==y
(!a)||(a>b) 可簡寫為:!a||a>b為提高程序的可讀性,明確表達各運算符之間的優(yōu)先關系,建議使用括號!573.4運算符及表達式三、位運算符位運算符說明~&|^^~,~^按位取反按位與按位或按位異或按位同或雙目運算符單目運算符位運算其結果與操作數位數相同。位運算符中的雙目運算符要求對兩個操作數的相應位逐位進行運算。兩個不同長度的操作數進行位運算時,將自動按右端對齊,位數少的操作數會在高位用0補齊。
[例]若A=5’b11001,B=3’b101,則A&B=(5’b11001)&(5’b00101)=5’b00001
583.4運算符及表達式[例]&&運算符和&(按位與)的區(qū)別&&運算的結果為1位的邏輯值注意&&和&的區(qū)別!被認為是
1‘b1被認為是
1‘bx邏輯與結果為
1‘bx593.4運算符及表達式四、關系運算符關系運算符說明<<=>>=小于小于或等于大于大于或等于雙目運算符括號內先運算!算術運算先運算!運算結果為1位的邏輯值1或0或x。關系運算時,若關系為真,則返回值為1;若聲明的關系為假,則返回值為0;若某操作數為不定值x,則返回值為x。所有的關系運算符優(yōu)先級別相同。關系運算符的優(yōu)先級低于算術運算符。[例]a<size-1 等同于:a<(size-1)size-(1<a) 不等同于:size-1<a603.4運算符及表達式五、等式運算符等式運算符說明==!====!==等于不等于全等不全等雙目運算符運算結果為1位的邏輯值1或0或x。等于運算符(==)和全等運算符(===)的區(qū)別:使用等于運算符時,兩個操作數必須逐位相等,結果才為1;若某些位為x或z,則結果為x。使用全等運算符時,若兩個操作數的相應位完全一致(如同是1,或同是0,或同是x,或同是z),則結果為1;否則為0。所有的等式運算符優(yōu)先級別相同。===和!==運算符常用于case表達式的判別,又稱為“case等式運算符”。MAX+PLUSII和QuartusII都不支持!613.4運算符及表達式[例]if(A
==
1’bx)$display(“AisX”);//當A為不定值時,式(A==1’bx)的運算結果為x,則該語句不執(zhí)行
if(A
===
1’bx)$display(“AisX”);//當A為不定值時,式(A===1’bx)的運算結果為1,該語句執(zhí)行==01xz01xz10xx01xxxxxxxxxx===01xz01xz1000010000100001表3-1“==”的真值表表3-2“===”的真值表等于運算的結果可能為1或0或x全等于運算的結果只有1或0623.4運算符及表達式六、縮減運算符縮減運算符說明&~&|~|^^~,~^與與非或或非異或同或單目運算符運算法則與位運算符類似,但運算過程不同!對單個操作數進行遞推運算,即先將操作數的最低位與第二位進行與、或、非運算,再將運算結果與第三位進行相同的運算,依次類推,直至最高位。運算結果縮減為1位二進制數。[例]reg[3:0]a;b=|a;//等效于b=((a[0]|a[1])|a(2))|a[3]注意縮減運算符和位運算符的區(qū)別!633.4運算符及表達式七、移位運算符移位運算符說明>><<右移左移單目運算符只有當右操作數為常數時MAX+PLUSII支持!左移會擴充位數!用法:A>>n或A<<n
將操作數右移或左移n位,同時用n個0填補移出的空位。[例]4’b1001>>3=4’b0001;4’b1001>>4=4’b00004’b1001<<1=5’b10010;4’b1001<<2=6’b100100;
1<<6=32’b1000000將操作數右移或左移n位,相當于將操作數除以或乘以2n。右移位數不變,但右移的數據會丟失!643.4運算符及表達式八、條件運算符三目運算符in1outMUXin0sel信號=條件?表達式1:表達式2條件運算符為?:用法:[例]數據選擇器assignout=sel?in1:in0;當條件為真,信號取表達式1的值;為假,則取表達式2的值。sel=1時out=in1;sel=0時out=in0653.4運算符及表達式九、位拼接運算符位拼接運算符為{}用于將兩個或多個信號的某些位拼接起來,表示一個整體信號。用法:{信號1的某幾位,信號2的某幾位,……,信號n的某幾位}例如在進行加法運算時,可將進位輸出與和拼接在一起使用。[例1]output[3:0]sum;//和
outputcout;//進位輸出
input[3:0]ina,inb;inputcin;assign{cout,sum}=ina+inb+cin;//進位與和拼接在一起[例2]{a,b[3:0],w,3’b101}={a,b[3],b[2],b[1],b[0],w,1’b1,1’b0,1’b1}663.4運算符及表達式可用重復法簡化表達式,如:{4{w}}//等同于{w,w,w,w}還可用嵌套方式簡化書寫,如:
{b,{3{a,b}}}//等同于{b,{a,b},{a,b},{a,b}},也等同于{b,a,b,a,b,a,b}用于表示重復的表達式必須為常數表達式!在位拼接表達式中,不允許存在沒有指明位數的信號,必須指明信號的位數;若未指明,則默認為32位的二進制數!如{1,0}=64’h00000001_00000000,注意{1,0}不等于2‘b10673.4運算符及表達式十、運算符的優(yōu)先級類別運算符優(yōu)先級邏輯、位運算符!~高低算術運算符*/%+-移位運算符<<>>關系運算符<<=>>=等式運算符==!====!==縮減、位運算符&~&^^~|~|邏輯運算符&&||條件運算符?:表3-3運算符的優(yōu)先級為提高程序的可讀性,建議使用括號來控制運算的優(yōu)先級&&(b>c)
(a==b)||(x==y)
(!a)||(a>b)683.5語句賦值語句塊語句條件語句循環(huán)語句結構說明語句編譯預處理語句內容概要693.5語句賦值語句連續(xù)賦值語句過程賦值語句塊語句begin_end語句fork_join語句QuartusII不支持條件語句if_else語句case語句循環(huán)語句forever語句MAX+PLUSII不支持repeat語句MAX+PLUSII不支持while語句MAX+PLUSII不支持for語句結構說明語句initial語句QuartusII不支持always語句task語句MAX+PLUSII不支持function語句編譯預處理語句‘define語句‘include語句QuartusII不支持‘timescale語句QuartusII不支持表3-4VerilogHDL的語句703.5語句注:上表中,凡QuartusII不支持的語句是不可綜合的,通常用在測試文件中;未注明“QuartusII不支持”的語句均是可綜合的。repeat語句和task語句MAX+PLUSII不支持,但QuartusII支持;forever語句、while語句MAX+PLUSII不支持,QuartusII支持,但通常用在測試模塊中;表中只有4種語句(fork_join,initial,‘include,‘timescale)是QuartusII不支持的,它們通常用在測試模塊中(ModelSim軟件支持)。713.6賦值語句和塊語句一、賦值語句二、非阻塞賦值與阻塞賦值的區(qū)別三、塊語句內容概要723.6賦值語句和塊語句一、賦值語句分為兩類:(1)連續(xù)賦值語句——assign語句,用于對wire型變量賦值,是描述組合邏輯最常用的方法之一。
[例]assignc=a&b;//a、b、c均為wire型變量(2)過程賦值語句——用于對reg型變量賦值,有兩種方式:非阻塞(non-blocking)賦值方式:
賦值符號為<=,如b<=a;阻塞(blocking)賦值方式:
賦值符號為=,如b=a;733.6賦值語句和塊語句二、非阻塞賦值與阻塞賦值的區(qū)別1.非阻塞賦值方式
always@(posedgeclk)
begin
b<=a;
c<=b;
endclkDFFcDQDQabDFF非阻塞賦值在塊結束時才完成賦值操作!注:c的值比b的值落后一個時鐘周期!743.6賦值語句和塊語句2.阻塞賦值方式
always@(posedgeclk)
begin
b=a;
c=b;
end阻塞賦值在該語句結束時就完成賦值操作!clkDFFcDQab注:在一個塊語句中,如果有多條阻塞賦值語句,在前面的賦值語句沒有完成之前,后面的語句就不能被執(zhí)行,就像被阻塞了一樣,因此稱為阻塞賦值方式。這里c的值與b的值一樣
!753.6賦值語句和塊語句非阻塞(non-blocking)賦值方式(b<=a):b的值被賦成新值a的操作,并不是立刻完成的,而是在塊結束時才完成;塊內的多條賦值語句在塊結束時同時賦值;硬件有對應的電路。阻塞(blocking)賦值方式(b=a):b的值立刻被賦成新值a;完成該賦值語句后才能執(zhí)行下一句的操作;硬件沒有對應的電路,因而綜合結果未知。非阻塞賦值與阻塞賦值方式的主要區(qū)別建議在初學時只使用一種方式,不要混用!建議在可綜合風格的模塊中使用非阻塞賦值!763.6賦值語句和塊語句三、塊語句用來將兩條或多條語句組合在一起,使其在格式上更像一條語句,以增加程序的可讀性。塊語句有兩種:begin_end語句——標識順序執(zhí)行的語句fork_join語句——標識并行執(zhí)行的語句用begin_end標識的塊QuartusII不支持,通常用在測試文件中1.順序塊特點塊內的語句是順序執(zhí)行的;每條語句的延遲時間是相對于前一條語句的仿真時間而言的;直到最后一條語句執(zhí)行完,程序流程控制才跳出該順序塊。773.6賦值語句和塊語句begin
語句1;語句2;
…
語句n;endbegin:塊名塊內聲明語句;語句1;語句2;
…
語句n;end注:塊內聲明語句可以是參數聲明、reg型變量聲明、integer型變量聲明、real型變量聲明語句。或順序塊的格式783.6賦值語句和塊語句[例1]begin
b=a;
c=b;//c的值為a的值
end[例2]begin
b=a;
#10
c=b;//在兩條賦值語句間延遲10個時間單位
end注:這里標識符“#”表示延遲;在模塊調用中“#”表示參數的傳遞舉例793.6賦值語句和塊語句
[例3]用順序塊和延遲控制組合產生一個時序波形。
parameterd=50;
reg[7:0]r;
begin //由一系列延遲產生的波形
#dr=’
h35;
#dr=’
hE2;
#dr=’
h00;
#dr=’
hF7;
#d–>end_wave;
//觸發(fā)事件end_wave
end注:每條語句的延遲時間d是相對于前一條語句的仿真時間而言的!803.6賦值語句和塊語句2.并行塊用fork_join標識的塊特點塊內的語句是同時執(zhí)行的;塊內每條語句的延遲時間是相對于程序流程控制進入到塊內時的仿真時間而言的;延遲時間用于給賦值語句提供時序;當按時間排序在最后的語句執(zhí)行完或一個disable語句執(zhí)行時,程序流程控制跳出該并行塊。fork語句是不可綜合的!813.6賦值語句和塊語句fork
語句1;語句2;
…
語句n;joinfork:塊名塊內聲明語句;語句1;語句2;
…
語句n;join或注:塊內聲明語句可以是參數聲明、reg型變量聲明、integer型變量聲明、real型變量聲明語句、time型變量聲明語句和事件(event)說明語句。并行塊的格式823.6賦值語句和塊語句[例4]用并行塊和延遲控制組合產生一個時序波形。
reg[7:0]r;
fork
//由一系列延遲產生的波形
#50r=’
h35;
#100r=’
hE2;
#150r=’
h00;
#200r=’
hF7;
#250–>end_wave;
//觸發(fā)事件end_wave
join波形同例3注:在fork_join塊內,各條語句不必按順序給出!但為增加可讀性,最好按被執(zhí)行的順序書寫!833.7條件語句一、if-else語句二、case語句三、使用條件語句注意事項內容概要843.7條件語句一、if-else語句判定所給條件是否滿足,根據判定的結果(真或假)決定執(zhí)行給出的兩種操作之一。if-else語句有3種形式其中“表達式”為邏輯表達式或關系表達式,或一位的變量。若表達式的值為0、或z,則判定的結果為“假”;若為1,則結果為“真”。語句可為單句,也可為多句;多句時一定要用“begin_end”語句括起來,形成一個復合塊語句。對于每個判定只有兩個分支條件語句分為兩種:if-else語句和case語句;它們都是順序語句,應放在“always”塊內!853.7條件語句允許一定形式的表達式簡寫方式,如:if(expression)等同于if(expression==1)if(!expression)等同于if(expression!=1)
if(表達式)語句1;if(表達式1)語句1;else
語句2;if(表達式1)語句1;elseif(表達式2)語句2;
…elseif(表達式n)語句n;方式1:方式2:方式3:適于對不同的條件,執(zhí)行不同的語句863.7條件語句if語句可以嵌套;若if與else的數目不一樣,注意用“begin_end”語句來確定if與else的配對關系!if(表達式1)
if(表達式2)語句1;
else
語句2;else
if(表達式3)語句3;
else
語句4;if(表達式1)
begin
if(表達式2)語句1;
endelse
語句2;當if與else的數目不一樣時,最好用“begin_end”語句將單獨的if語句括起來:if語句的嵌套:873.7條件語句[例]模為60的BCD碼加法計數器counter60.valways塊語句和assign語句是并行執(zhí)行的!在always塊內的語句是順序執(zhí)行的!883.7條件語句注意:if(reset)elseif(load)elseif(cin)
不要寫成3個并列的if語句:
if(reset)if(load)if(cin)因為這樣寫則是同時對3個信號reset、load和cin進行判斷,現實中很可能出現三者同時為“1”的情況,即3個條件同時滿足,則應該同時執(zhí)行它們對應的執(zhí)行語句,但3條執(zhí)行語句是對同一個信號qout賦不同的值,顯然相互矛盾。故編譯時會報錯!893.7條件語句cin為來自下一級計數器的進位always與assign語句是并行執(zhí)行的!count60.vwf置數進位輸出當cin=1則加1計數903.7條件語句二、case語句多分支語句case(敏感表達式)值1:語句1;值2:語句2;
…
值n:語句n;
default:
語句n+1;endcase1.case語句當敏感表達式取不同的值時,執(zhí)行不同的語句。功能:當某個(控制)信號取不同的值時,給另一個(輸出)信號賦不同的值。常用于多條件譯碼電路(如譯碼器、數據選擇器、狀態(tài)機、微處理器的指令譯碼)!case語句有3種形式:case,casez,casex適于對同一個控制信號取不同的值時,輸出取不同的值!case語句與if-else語句有什么區(qū)別呢?
913.7條件語句說明:其中“敏感表達式”又稱為“控制表達式”,通常表示為控制信號的某些位。值1~值n稱為分支表達式,用控制信號的具體狀態(tài)值表示,因此又稱為常量表達式。default項可有可無,一個case語句里只能有一個default項!值1~值n必須互不相同,否則矛盾。值1~值n的位寬必須相等,且與控制表達式的位寬相同。92
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 教改課題申報書地方
- 教育小課題立項申報書
- 電商課題申報書
- 南非施工合同范本
- 創(chuàng)業(yè)合伙協(xié)議合同范本
- 同城配送員工餐飲合同范本
- 申報書課題類別
- 旅游教改課題申報書
- 化工自提合同范本
- 合同內歸屬權合同范本
- 報驗申請表模板
- 《中外廣播電視史》課件
- 北京四中英語教學觀
- 小學生主題班會 我能傾聽不插嘴 課件(共21張PPT)
- 兒童感覺統(tǒng)合講座課件
- 采購員崗位月度KPI績效考核表
- 山地光伏施工方案
- 六年級心理健康ppt名師優(yōu)質課獲獎市賽課一等獎課件
- 四川輕化工大學
- 六西格瑪質量管理在口腔科器械管理中的作用
- 高中心理健康教育-認識自我悅納自我教學課件設計
評論
0/150
提交評論