chVerilogHDL基礎(chǔ)與組合電路建模演示文稿_第1頁
chVerilogHDL基礎(chǔ)與組合電路建模演示文稿_第2頁
chVerilogHDL基礎(chǔ)與組合電路建模演示文稿_第3頁
chVerilogHDL基礎(chǔ)與組合電路建模演示文稿_第4頁
chVerilogHDL基礎(chǔ)與組合電路建模演示文稿_第5頁
已閱讀5頁,還剩107頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

chVerilogHDL基礎(chǔ)與組合電路建模演示文稿現(xiàn)在是1頁\一共有112頁\編輯于星期日3.1VerilogHDL基本語法規(guī)則3.2VerilogHDL門級(jí)建模3.3VerilogHDL數(shù)據(jù)流建模與運(yùn)算符3.4組合電路的行為級(jí)建模3.5分層次的電路設(shè)計(jì)方法現(xiàn)在是2頁\一共有112頁\編輯于星期日3.1VerilogHDL基本語法規(guī)則3.1.1詞法規(guī)定3.1.2邏輯值集合3.1.3常量及其表示3.1.4數(shù)據(jù)類型3現(xiàn)在是3頁\一共有112頁\編輯于星期日3.1.1詞法規(guī)定為對(duì)數(shù)字電路進(jìn)行描述,Verilog語言規(guī)定了一套完整的語法結(jié)構(gòu)。1.間隔符:Verilog的間隔符主要起分隔文本的作用,可以使文本錯(cuò)落有致,便于閱讀與修改。間隔符包括空格符(\b)、TAB鍵(\t)、換行符(\n)及換頁符。2.注釋符:注釋只是為了改善程序可讀性,編譯時(shí)不起作用。多行注釋符(用于寫多行注釋):/*---*/;單行注釋符:以//開始到行尾結(jié)束為注釋文字。4現(xiàn)在是4頁\一共有112頁\編輯于星期日任何用VerilogHDL語言描述的“東西”都通過其名字來識(shí)別,這個(gè)名字被稱為標(biāo)識(shí)符。如源文件名、模塊名、端口名、變量名、常量名、實(shí)例名等。標(biāo)識(shí)符可由字母、數(shù)字、下劃線和$符號(hào)構(gòu)成;但第一個(gè)字符必須是字母或下劃線,不能是數(shù)字或$符號(hào)!在VerilogHDL中變量名是區(qū)分大小寫的!合法的名字:A_99_ZReset_54MHz_Clock$Module

不合法的名字:123a$datamodule7seg.v標(biāo)識(shí)符不能與關(guān)鍵字同名!三、標(biāo)識(shí)符和關(guān)鍵字

5現(xiàn)在是5頁\一共有112頁\編輯于星期日關(guān)鍵字——事先定義好的確認(rèn)符,用來組織語言結(jié)構(gòu);或者用于定義VerilogHDL提供的門元件(如and,not,or,buf)。用小寫字母定義!——如always,assign,begin,case,casex,else,end,for,function,if,input,output,repeat,table,time,while,wire用戶程序中的變量、節(jié)點(diǎn)等名稱不能與關(guān)鍵字同名!三、標(biāo)識(shí)符和關(guān)鍵字

6現(xiàn)在是6頁\一共有112頁\編輯于星期日為了表示數(shù)字邏輯電路的邏輯狀態(tài),Verilog語言規(guī)定了4種基本的邏輯值。0邏輯0、邏輯假1邏輯1、邏輯真x或X不確定的值(未知狀態(tài))z或Z高阻態(tài)3.1.2邏輯值集合7現(xiàn)在是7頁\一共有112頁\編輯于星期日數(shù)據(jù)類型是用來表示數(shù)字電路硬件中的數(shù)據(jù)存儲(chǔ)和傳送元素的。常量是在程序運(yùn)行過程中,其值不能被改變的量。3.1.3常量及其表示8現(xiàn)在是8頁\一共有112頁\編輯于星期日3.1.3常量及其表示三種類型的常量整數(shù)型常量實(shí)數(shù)型常量字符串型常量實(shí)數(shù)型常量十進(jìn)制記數(shù)法如:0.1、2.0、5.67科學(xué)記數(shù)法如:23_5.1e2、5E-4

23510.0、0.0005十進(jìn)制數(shù)形式的表示方法:表示有符號(hào)常量例如:30、-2帶基數(shù)形式的表示方法:格式為:<+/-><位寬>’<基數(shù)符號(hào)><數(shù)值>整數(shù)型常量例如:3’b101、5’o37、8’he3,8’b1001_0011

9現(xiàn)在是9頁\一共有112頁\編輯于星期日3.1.3常量及其表示;Verilog允許用參數(shù)定義語句定義一個(gè)標(biāo)識(shí)符來代表一個(gè)常量,稱為符號(hào)常量。定義的格式為:

parameter參數(shù)名1=常量表達(dá)式1,參數(shù)名2=常量表達(dá)式2……如parameterBIT=1,BYTE=8,PI=3.14;字符串常量字符串是用雙撇號(hào)括起來的字符序列,它必須包含在同一行中,不能分成多行書寫。例如:

''thisisastring''''helloworld!''符號(hào)常量10現(xiàn)在是10頁\一共有112頁\編輯于星期日3.1.4

數(shù)據(jù)類型變量的數(shù)據(jù)類型寄存器型線網(wǎng)型線網(wǎng)類:是指輸出始終根據(jù)輸入的變化而更新其值的變量,它一般指的是硬件電路中的各種物理連接.常用的網(wǎng)絡(luò)類型由關(guān)鍵詞wire定義,格式如下:wire[n-1:0]變量名1,變量名2,…,變量名n;變量寬度例:網(wǎng)絡(luò)型變量L的值由與門的驅(qū)動(dòng)信號(hào)a和b所決定,即L=a&b。a、b的值發(fā)生變化,線網(wǎng)L的值會(huì)立即跟著變化。11現(xiàn)在是11頁\一共有112頁\編輯于星期日wire型數(shù)據(jù)常用來表示用以assign關(guān)鍵字指定的組合邏輯信號(hào)。Verilog程序模塊中輸入、輸出信號(hào)類型默認(rèn)時(shí),自動(dòng)定義為wire型。wire型信號(hào)可以用做任何方程式的輸入,也可以用做assign語句或?qū)嵗妮敵?。wirea;//定義了一個(gè)1位的wire型數(shù)據(jù)wire[7:0]b;//定義了一個(gè)8位的wire型數(shù)據(jù)wire[4:1]c,d;//定義了二個(gè)4位的wire型數(shù)據(jù)wire型12現(xiàn)在是12頁\一共有112頁\編輯于星期日表3.1.3線網(wǎng)類型變量及其說明線網(wǎng)類型功能說明wire,tri用于表示單元(元件)之間的連線,wire為一般連線;tri用于描述由多個(gè)信號(hào)源驅(qū)動(dòng)的線網(wǎng),并沒有其他特殊意義,兩者的功能完全相同。wor,trior具有線或特性的線網(wǎng),用于一個(gè)線網(wǎng)被多個(gè)信號(hào)驅(qū)動(dòng)的情況wand,riand具有線與特性的線網(wǎng),用于一個(gè)線網(wǎng)被多個(gè)信號(hào)驅(qū)動(dòng)的情況trireg具有電荷保持特性的線網(wǎng)類型,用于開關(guān)級(jí)建模tri1上拉電阻,用于開關(guān)級(jí)建模tri0下拉電阻,用于開關(guān)級(jí)建模supply1用于對(duì)電源建模,高電平1supply0用于對(duì)地建模,低電平013現(xiàn)在是13頁\一共有112頁\編輯于星期日關(guān)于“多重驅(qū)動(dòng)”在寫可綜合的Verilog代碼時(shí),建議不要對(duì)同一個(gè)變量進(jìn)行多次賦值(簡(jiǎn)稱多重驅(qū)動(dòng)),以避免出現(xiàn)多個(gè)信號(hào)同時(shí)驅(qū)動(dòng)一個(gè)輸出變量的情況。BLAC圖3.1.2多重驅(qū)動(dòng)示意圖例如,A、B、C三個(gè)內(nèi)部信號(hào)同時(shí)接到(驅(qū)動(dòng))一個(gè)輸出端L。或者說,輸出L同時(shí)被三個(gè)內(nèi)部信號(hào)所驅(qū)動(dòng)。此時(shí)L的邏輯值可能無法確定。14現(xiàn)在是14頁\一共有112頁\編輯于星期日3.1.4

數(shù)據(jù)類型變量的數(shù)據(jù)類型寄存器型線網(wǎng)型寄存器型變量對(duì)應(yīng)的是具有狀態(tài)保持作用的電路等元件,如觸發(fā)器寄存器。寄存器型變量只能在initial或always內(nèi)部被賦值。15現(xiàn)在是15頁\一共有112頁\編輯于星期日寄存器變量類型寄存器類型功能說明reg常用的寄存器型變量integer32位帶符號(hào)的整數(shù)型變量real/realtime64位帶符號(hào)的實(shí)數(shù)型變量time64位無符號(hào)的時(shí)間變量表3.1.5寄存器變量類型及其說明例:regclock;//一個(gè)1位寄存器變量的聲明

reg[3:0]counter;//一個(gè)4位寄存器變量的聲明抽象描述,不對(duì)應(yīng)具體硬件end16現(xiàn)在是16頁\一共有112頁\編輯于星期日3.2VerilogHDL門級(jí)建模3.2.1多輸入門3.2.4門級(jí)建模舉例3.2.2多輸出門3.2.3三態(tài)門17現(xiàn)在是17頁\一共有112頁\編輯于星期日基本概念:結(jié)構(gòu)級(jí)建模:就是根據(jù)邏輯電路的結(jié)構(gòu)(邏輯圖),實(shí)例引用VerilogHDL中內(nèi)置的基本門級(jí)元件或者用戶定義的元件或其他模塊,來描述結(jié)構(gòu)圖中的元件以及元件之間的連接關(guān)系。門級(jí)建模:VerilogHDL中內(nèi)置了12個(gè)基本門級(jí)元件(Primitive,有的翻譯為“原語”)模型,引用這些基本門級(jí)元件對(duì)邏輯圖進(jìn)行描述,也稱為門級(jí)建模。18現(xiàn)在是18頁\一共有112頁\編輯于星期日VerilogHDL基本門級(jí)元件(Primitive:原語)

多輸入門:and、nand、or、nor、xor、xnor

只有單個(gè)輸出,1個(gè)或多個(gè)輸入多輸出門:not、buf

允許有多個(gè)輸出,但只有一個(gè)輸入三態(tài)門:bufif0、bufif1、notif0、notif1

有一個(gè)輸出,一個(gè)數(shù)據(jù)輸入和一個(gè)控制輸入上拉電阻pullup、下拉電阻pulldown19現(xiàn)在是19頁\一共有112頁\編輯于星期日6.4.1多輸入門原語名稱圖形符號(hào)邏輯表達(dá)式and(與門)L=A&Bnand(與非門)L=~(A&B)or(或門)L=A|Bnor(或非門)L=~(A|B)xor(異或門)L=A^Bxnor(同或門)L=A~^B

共6個(gè):and、nand、or、nor、xor、xnor

特點(diǎn):只有1個(gè)輸出,有多個(gè)輸入多輸入門的一般引用格式為:Gate_name<instance>(OutputA,Input1,Input2,…,InputN);20現(xiàn)在是20頁\一共有112頁\編輯于星期日基本門的調(diào)用方法舉例:若同一個(gè)基本門在當(dāng)前模塊中被調(diào)用多次,可在一條調(diào)用語句中加以說明,中間以逗號(hào)相隔。andA1(out,in1,in2,in3);xnorNX1(out,in1,in2,in3,in4);

對(duì)基本門級(jí)元件,調(diào)用名A1、NX1可以省略。21現(xiàn)在是21頁\一共有112頁\編輯于星期日真值表舉例表3.2.2and、nand真值表and輸入1nand輸入101xz01xz輸入200000輸入201111101xx110xxx0xxxx1xxxz0xxxz1xxx22現(xiàn)在是22頁\一共有112頁\編輯于星期日3.2.2多輸出門允許有多個(gè)輸出,但只有一個(gè)輸入。notN1(out1,out2,…,in);xx10zx10輸入buf輸出buf真值表輸出xx01zx10輸入notnot真值表bufB1(out1,out2,…,in);out1inout2outN…23現(xiàn)在是23頁\一共有112頁\編輯于星期日3.2.3三態(tài)門有一個(gè)輸出、一個(gè)數(shù)據(jù)輸入和一個(gè)輸入控制。如果輸入控制信號(hào)無效,則三態(tài)門的輸出為高阻態(tài)z。24現(xiàn)在是24頁\一共有112頁\編輯于星期日boutasel//Gate-leveldescriptionmodule_2to1muxtri(a,b,sel,out);inputa,b,sel;outputout;triout;bufif1(out,b,sel);bufif0(out,a,sel);endmodule-2選1數(shù)據(jù)選擇器一些Verilog原型(Primitive)小結(jié):門級(jí)建模就是列出電路圖結(jié)構(gòu)中的元件,并按網(wǎng)表連接。3.2.4門級(jí)建模舉例25現(xiàn)在是25頁\一共有112頁\編輯于星期日moduleaddbit(a,b,ci,sum,co);inputa,b,ci;outputsum,co;wirea,b,ci,sum,co,n1,n2,n3;xoru0(n1,a,b,),

u1(sum,n1,ci);andu2(n2,a,b),

u3(n3,n1,ci);or(co,n2,n3);endmodule-1位全加器3.2.4門級(jí)建模舉例26現(xiàn)在是26頁\一共有112頁\編輯于星期日門級(jí)描述小結(jié):1.給電路圖中的每個(gè)輸入輸出引腳賦以端口名.2.給電路圖中每條內(nèi)部連線取上各自的連線名.3.給電路圖中的每個(gè)邏輯元件取一個(gè)編號(hào)(即“調(diào)用名”).4.給所要描述的這個(gè)電路模塊確定一個(gè)模塊名.5.用module定義相應(yīng)模塊名的結(jié)構(gòu)描述,并將邏輯圖中所有的輸入輸出端口名列入端口名表項(xiàng)中,再完成對(duì)各端口的輸入輸出類型說明.6.依照電路圖中的連接關(guān)系,確定各單元之間端口信號(hào)的連接,完成對(duì)電路圖內(nèi)部的結(jié)構(gòu)描述.7.最后用endmodule結(jié)束模塊描述全過程.end27現(xiàn)在是27頁\一共有112頁\編輯于星期日3.3VerilogHDL數(shù)據(jù)流建模與運(yùn)算符3.3.1數(shù)據(jù)流建模3.3.2運(yùn)算符及其優(yōu)先級(jí)28現(xiàn)在是28頁\一共有112頁\編輯于星期日在數(shù)字電路中,信號(hào)經(jīng)過組合邏輯時(shí)會(huì)類似于數(shù)據(jù)流動(dòng),即信號(hào)從輸入流向輸出,并不會(huì)在其中存儲(chǔ)。當(dāng)輸入發(fā)生變化時(shí),總會(huì)在一定時(shí)間以后體現(xiàn)在輸出端。同樣,我們可以模擬數(shù)字電路的這一特性,對(duì)其進(jìn)行建模,這種建模方式通常被稱為數(shù)據(jù)流建模。3.3VerilogHDL數(shù)據(jù)流建模與運(yùn)算符29現(xiàn)在是29頁\一共有112頁\編輯于星期日3.3VerilogHDL數(shù)據(jù)流建模與運(yùn)算符對(duì)于基本單元邏輯電路,使用Verilog語言提供的門級(jí)元件模型描述電路非常方便。但隨著電路復(fù)雜性的增加,使用的邏輯門較多時(shí),使用HDL門級(jí)描述的工作效率就很低。本節(jié)介紹的數(shù)據(jù)流建模能夠在較高的抽象級(jí)別描述電路的邏輯功能,并且通過邏輯綜合軟件,能夠自動(dòng)地將數(shù)據(jù)流描述轉(zhuǎn)換成為門級(jí)電路。數(shù)據(jù)流建模主要使用邏輯表達(dá)式,所以要了解各種運(yùn)算符和表達(dá)式。30現(xiàn)在是30頁\一共有112頁\編輯于星期日3.3.1數(shù)據(jù)流建模

數(shù)據(jù)流建模使用的連續(xù)賦值語句,由關(guān)鍵詞assign開始,后面跟著由操作數(shù)和運(yùn)算符等組成的邏輯表達(dá)式。一般用法如下:

wire[位寬說明]變量名1,變量名2,……,變量名n;

assign變量名=表達(dá)式;注意,assign語句只能對(duì)wire型變量進(jìn)行賦值,所以等號(hào)左邊變量名的數(shù)據(jù)類型必須是wire型。31現(xiàn)在是31頁\一共有112頁\編輯于星期日3.3.1數(shù)據(jù)流建模

數(shù)據(jù)流建模使用的連續(xù)賦值語句,由關(guān)鍵詞assign開始,后面跟著由操作數(shù)和運(yùn)算符等組成的邏輯表達(dá)式。一般用法如下:

wire[位寬說明]變量名1,變量名2,……,變量名n;

assign變量名=表達(dá)式;連續(xù)賦值語句的執(zhí)行過程是:只要邏輯表達(dá)式右邊變量的邏輯值發(fā)生變化,則等式左邊的值立即被計(jì)算出來并賦給左邊的變量。32現(xiàn)在是32頁\一共有112頁\編輯于星期日modulemux2to1_dataflow(D0,D1,S,Y

);

inputD0,D1,S;outputY;wireY;//下面是邏輯功能描述

assignY=(~S&D0)|(S&D1);//表達(dá)式左邊Y必須是wire型endmodule

端口類型說明電路結(jié)構(gòu)描述數(shù)據(jù)類型說明例用數(shù)據(jù)流描述方式建立模型33現(xiàn)在是33頁\一共有112頁\編輯于星期日modulemux2x1_df(D0,D1,S,L);inputD0,D1,S;outputL;assignL=S?D1:D0;endmodule例:用條件運(yùn)算符描述了一個(gè)2選1的數(shù)據(jù)選擇器。條件運(yùn)算符:如果S=1,則輸出L=D1;否則L=D0。34現(xiàn)在是34頁\一共有112頁\編輯于星期日例:用數(shù)據(jù)流建模方法對(duì)2線-4線譯碼器的行為進(jìn)行描述。

35現(xiàn)在是35頁\一共有112頁\編輯于星期日moduledecoder_df(A1,A0,E,Y);inputA1,A0,E;output[3:0]Y;assignY[0]=~(~A1&~A0&~E);assignY[1]=~(~A1&A0&~E);assignY[2]=~(A1&~A0&~E);assignY[3]=~(A1&A0&~E);endmodule例:用數(shù)據(jù)流建模方法對(duì)2線-4線譯碼器的行為進(jìn)行描述。

36現(xiàn)在是36頁\一共有112頁\編輯于星期日例:用數(shù)據(jù)流描述風(fēng)格對(duì)一個(gè)4位二進(jìn)制數(shù)的加法器建模。

moduleadder4(Cout,Sum,A,B,Cin);parameterwidth=4;

output[width-1:0]Sum;

outputCout;

input[width-1:0]A,B;

inputCin;

assign{Cout,Sum}=A+B+Cin;

endmodule37現(xiàn)在是37頁\一共有112頁\編輯于星期日3.3.1數(shù)據(jù)流建模數(shù)據(jù)流建模提供了用邏輯表達(dá)式描述電路的一種方式。不必考慮電路的組成以及元件之間的連接,是描述組合邏輯電路常用的一種方式。38現(xiàn)在是38頁\一共有112頁\編輯于星期日3.3.2

表達(dá)式與操作數(shù)表達(dá)式由運(yùn)算符合操作數(shù)構(gòu)成,其目的是根據(jù)運(yùn)算符的含義計(jì)算出一個(gè)結(jié)果值。A~^B;Add1[31:20]+Add2[31:20]操作數(shù)可以是常數(shù)、整數(shù)、實(shí)數(shù)、線網(wǎng)、寄存器、時(shí)間等任何數(shù)據(jù)類型。39現(xiàn)在是39頁\一共有112頁\編輯于星期日運(yùn)算符按功能分為9類:算術(shù)運(yùn)算符邏輯運(yùn)算符關(guān)系運(yùn)算符等式運(yùn)算符縮減運(yùn)算符條件運(yùn)算符位運(yùn)算符移位運(yùn)算符位拼接運(yùn)算符運(yùn)算符按操作數(shù)的個(gè)數(shù)分為3類:?jiǎn)文窟\(yùn)算符——帶一個(gè)操作數(shù)邏輯非!,按位取反~,縮減運(yùn)算符,移位運(yùn)算符雙目運(yùn)算符——帶兩個(gè)操作數(shù)算術(shù)、關(guān)系、等式運(yùn)算符,邏輯、位運(yùn)算符的大部分三目運(yùn)算符——帶三個(gè)操作數(shù)條件運(yùn)算符

3.3.3

運(yùn)算符及其優(yōu)先級(jí)40現(xiàn)在是40頁\一共有112頁\編輯于星期日3.3.3

運(yùn)算符及其優(yōu)先級(jí)1.運(yùn)算符(9類)?:條件運(yùn)算符{}連接運(yùn)算符<<,>>邏輯移位運(yùn)算符==,!=,===,!==相等與全等運(yùn)算符<,>,<=,>=關(guān)系運(yùn)算符(雙目)!,&&,||邏輯運(yùn)算符&,~&,|,~|,^,^~or~^縮位運(yùn)算符(單目)~,&,|,^,^~or~^位運(yùn)算符+,-,*,/,%算術(shù)運(yùn)算符所含運(yùn)算符運(yùn)算符分類41現(xiàn)在是41頁\一共有112頁\編輯于星期日一、算術(shù)運(yùn)算符算術(shù)運(yùn)算符說明+-*/%加減乘除求模雙目運(yùn)算符進(jìn)行整數(shù)除法運(yùn)算時(shí),結(jié)果值略去小數(shù)部分,只取整數(shù)部分!%稱為求模(或求余)運(yùn)算符,要求%兩側(cè)均為整型數(shù)據(jù);求模運(yùn)算結(jié)果值的符號(hào)位取第一個(gè)操作數(shù)的符號(hào)位!

[例]-11%3結(jié)果為-2進(jìn)行算術(shù)運(yùn)算時(shí),若某操作數(shù)為不定值x,則整個(gè)結(jié)果也為x。 MAX+PLUSII不支持“/”

和“%”運(yùn)算!QuartusII都支持!42現(xiàn)在是42頁\一共有112頁\編輯于星期日[例]除法和求模運(yùn)算的區(qū)別注意/和%的區(qū)別!43現(xiàn)在是43頁\一共有112頁\編輯于星期日9/4=29%4=1arithmetic.vwf44現(xiàn)在是44頁\一共有112頁\編輯于星期日二、關(guān)系運(yùn)算符關(guān)系運(yùn)算符說明<<=>>=小于小于或等于大于大于或等于雙目運(yùn)算符括號(hào)內(nèi)先運(yùn)算!算術(shù)運(yùn)算先運(yùn)算!運(yùn)算結(jié)果為1位的邏輯值1或0或x。關(guān)系運(yùn)算時(shí),若關(guān)系為真,則返回值為1;若聲明的關(guān)系為假,則返回值為0;若某操作數(shù)為不定值x,則返回值為x。所有的關(guān)系運(yùn)算符優(yōu)先級(jí)別相同。關(guān)系運(yùn)算符的優(yōu)先級(jí)低于算術(shù)運(yùn)算符。[例]a<size-1 等同于:a<(size-1)

size-(1<a) 不等同于:size-1<a45現(xiàn)在是45頁\一共有112頁\編輯于星期日三、等式運(yùn)算符等式運(yùn)算符說明==!====!==等于不等于全等不全等雙目運(yùn)算符運(yùn)算結(jié)果為1位的邏輯值1或0或x。等于運(yùn)算符(==)和全等運(yùn)算符(===)的區(qū)別:使用等于運(yùn)算符時(shí),兩個(gè)操作數(shù)必須逐位相等,結(jié)果才為1;若某些位為x或z,則結(jié)果為x。使用全等運(yùn)算符時(shí),若兩個(gè)操作數(shù)的相應(yīng)位完全一致(如同是1,或同是0,或同是x,或同是z),則結(jié)果為1;否則為0。所有的等式運(yùn)算符優(yōu)先級(jí)別相同。===和!==運(yùn)算符常用于case表達(dá)式的判別,又稱為“case等式運(yùn)算符”。MAX+PLUSII和QuartusII都不支持!46現(xiàn)在是46頁\一共有112頁\編輯于星期日[例]if(A

==

1’bx)$display(“AisX”);//當(dāng)A為不定值時(shí),式(A==1’bx)的運(yùn)算結(jié)果為x,則該語句不執(zhí)行if(A

===

1’bx)$display(“AisX”);//當(dāng)A為不定值時(shí),式(A===1’bx)的運(yùn)算結(jié)果為1,該語句執(zhí)行==01xz01xz10xx01xxxxxxxxxx===01xz01xz1000010000100001“==”的真值表“===”的真值表等于運(yùn)算的結(jié)果可能為1或0或x全等于運(yùn)算的結(jié)果只有1或047現(xiàn)在是47頁\一共有112頁\編輯于星期日a、b的初值同為4‘b0100,c和d的初值同為4’b10x0a==ba!=ba===ba!==b1010c==dc!=dc===dc!==dxx10相等與全等運(yùn)算符==(邏輯相等),!=(邏輯不等)===(條件全等),!==(條件不全等)48現(xiàn)在是48頁\一共有112頁\編輯于星期日四、邏輯運(yùn)算符邏輯運(yùn)算符把它的操作數(shù)當(dāng)作布爾變量:非零的操作數(shù)被認(rèn)為是真(1‘b1);零被認(rèn)為是假(1‘b0);不確定的操作數(shù)如4’bxx00,被認(rèn)為是不確定的(可能為零,也可能為非零)(記為1’bx);但4’bxx11被認(rèn)為是真(記為1’b1,因?yàn)樗隙ㄊ欠橇愕模_壿嬤\(yùn)算符說明

&&(雙目)||(雙目)!(單目)邏輯與邏輯或邏輯非進(jìn)行邏輯運(yùn)算后的結(jié)果為布爾值(為1或0或x)!49現(xiàn)在是49頁\一共有112頁\編輯于星期日“&&”和“||”的優(yōu)先級(jí)除高于條件運(yùn)算符外,低于關(guān)系運(yùn)算符、等式運(yùn)算符等幾乎所有運(yùn)算符;邏輯非“!”優(yōu)先級(jí)最高。[例](a>b)&&(b>c) 可簡(jiǎn)寫為:a>b&&b>c(a==b)||(x==y) 可簡(jiǎn)寫為:a==b||x==y(!a)||(a>b) 可簡(jiǎn)寫為:!a||a>b為提高程序的可讀性,明確表達(dá)各運(yùn)算符之間的優(yōu)先關(guān)系,建議使用括號(hào)!50現(xiàn)在是50頁\一共有112頁\編輯于星期日五、位運(yùn)算符位運(yùn)算符說明~&|^^~,~^按位取反按位與按位或按位異或按位同或雙目運(yùn)算符單目運(yùn)算符位運(yùn)算其結(jié)果與操作數(shù)位數(shù)相同。位運(yùn)算符中的雙目運(yùn)算符要求對(duì)兩個(gè)操作數(shù)的相應(yīng)位逐位進(jìn)行運(yùn)算。兩個(gè)不同長(zhǎng)度的操作數(shù)進(jìn)行位運(yùn)算時(shí),將自動(dòng)按右端對(duì)齊,位數(shù)少的操作數(shù)會(huì)在高位用0補(bǔ)齊。

[例]若A=5’b11001,B=3’b101,則A&B=(5’b11001)&(5’b00101)=5’b00001

51現(xiàn)在是51頁\一共有112頁\編輯于星期日六、縮減運(yùn)算符縮減運(yùn)算符說明&~&|~|^^~,~^與與非或或非異或同或單目運(yùn)算符運(yùn)算法則與位運(yùn)算符類似,但運(yùn)算過程不同!對(duì)單個(gè)操作數(shù)進(jìn)行遞推運(yùn)算,即先將操作數(shù)的最低位與第二位進(jìn)行與、或、非運(yùn)算,再將運(yùn)算結(jié)果與第三位進(jìn)行相同的運(yùn)算,依次類推,直至最高位。運(yùn)算結(jié)果縮減為1位二進(jìn)制數(shù)。[例]reg[3:0]a;

b=|a;//等效于b=((a[0]|a[1])|a(2))|a[3]注意縮減運(yùn)算符和位運(yùn)算符的區(qū)別!52現(xiàn)在是52頁\一共有112頁\編輯于星期日位運(yùn)算符與縮位運(yùn)算的比較A:4’b1010、B:4’b1111,A~^B=1010A^B=0101A|B=1111A&B=1010~A=0101~B=0000

位運(yùn)算~^A=1~^B=1^A=0^B=0|A=1~|B=0~&A=1&B=1&A=1&0&1&0=0

縮位運(yùn)算53現(xiàn)在是53頁\一共有112頁\編輯于星期日七、移位運(yùn)算符移位運(yùn)算符說明>><<右移左移單目運(yùn)算符只有當(dāng)右操作數(shù)為常數(shù)時(shí)MAX+PLUSII支持!左移會(huì)擴(kuò)充位數(shù)!用法:A>>n或A<<n

將操作數(shù)右移或左移n位,同時(shí)用n個(gè)0填補(bǔ)移出的空位。[例]4’b1001>>3=4’b0001;4’b1001>>4=4’b00004’b1001<<1=5’b10010;4’b1001<<2=6’b100100;

1<<6=32’b1000000將操作數(shù)右移或左移n位,相當(dāng)于將操作數(shù)除以或乘以2n。右移位數(shù)不變,但右移的數(shù)據(jù)會(huì)丟失!54現(xiàn)在是54頁\一共有112頁\編輯于星期日八、條件運(yùn)算符三目運(yùn)算符in1outMUXin0sel信號(hào)=條件?表達(dá)式1:表達(dá)式2條件運(yùn)算符為?:用法:[例]數(shù)據(jù)選擇器assignout=sel?in1:in0;當(dāng)條件為真,信號(hào)取表達(dá)式1的值;為假,則取表達(dá)式2的值。sel=1時(shí)out=in1;sel=0時(shí)out=in055現(xiàn)在是55頁\一共有112頁\編輯于星期日對(duì)同一個(gè)操作數(shù)的重復(fù)拼接還可以雙重大括號(hào)構(gòu)成的運(yùn)算符{{}}例如{4{A}}=4’b1111,{2{A},2{B},C}=8’b11101000?!?在VerilogHDL語言中有一個(gè)特殊的運(yùn)算符:位拼接運(yùn)算符{}作用是將兩個(gè)或多個(gè)信號(hào)的某些位拼接起來成為一個(gè)新的操作數(shù),進(jìn)行運(yùn)算操作。九、位拼接運(yùn)算符設(shè)A=1’b1,B=2’b10,C=2’b00則{B,C}=4’b1000{A,B[1],C[0]}=3’b110{A,B,C,3’b101}=8’b11000101。{信號(hào)1的某幾位,信號(hào)2的某幾位,……,信號(hào)n的某幾位}56現(xiàn)在是56頁\一共有112頁\編輯于星期日2.運(yùn)算符的優(yōu)先級(jí)優(yōu)先級(jí)的順序從下向上依次增加。類型符號(hào)優(yōu)先級(jí)別取反!~-(求2的補(bǔ)碼)最高優(yōu)先級(jí)算術(shù)*/+-最低優(yōu)先級(jí)移位>><<關(guān)系<<=>>=等于==!=縮位&~&^^~|~|邏輯&&||條件?:end為提高程序的可讀性,建議使用括號(hào)來控制運(yùn)算的優(yōu)先級(jí)![例](a>b)&&(b>c)

(a==b)||(x==y)

(!a)||(a>b)57現(xiàn)在是57頁\一共有112頁\編輯于星期日3.4組合電路的行為級(jí)建模行為建模是VerilogHDL行為建模的主要方法,也是VerilogHDL最能體現(xiàn)其高級(jí)編程語言之處,如果學(xué)過其他高級(jí)變成語言(如C語言),就會(huì)對(duì)本節(jié)介紹的諸如if-else、for循環(huán)之類的語法結(jié)構(gòu)非常熟悉。此外,本節(jié)還將介紹過程賦值的特點(diǎn)和用法。就像連續(xù)賦值用于數(shù)據(jù)流行為建模一樣,過程賦值用于順序行為建模。現(xiàn)在是58頁\一共有112頁\編輯于星期日3.4VerilogHDL行為級(jí)建模行為級(jí)建模就是描述數(shù)字邏輯電路的功能和算法。在Verilog中,行為級(jí)描述主要使用由關(guān)鍵詞initial或always定義的兩種結(jié)構(gòu)類型的語句。一個(gè)模塊的內(nèi)部可以包含多個(gè)initial或always語句。initial語句是一條初始化語句,僅執(zhí)行一次,經(jīng)常用于測(cè)試模塊中,對(duì)激勵(lì)信號(hào)進(jìn)行描述,在硬件電路的行為描述中,有時(shí)為了仿真的需要,也用initial語句給寄存器變量賦初值。initial語句主要是一條面向仿真的過程語句,不能用于邏輯綜合。在always結(jié)構(gòu)型語句內(nèi)部有一系列過程性賦值語句,用來描述電路的功能(行為)。59現(xiàn)在是59頁\一共有112頁\編輯于星期日3.5VerilogHDL行為級(jí)建模在詳細(xì)解釋二者的使用方法之前,可以僅從其英文單詞的字面意思來了解一下它們的作用:initial用于做“初始化”操作,always則“始終”在執(zhí)行某些操作。作為順序行為建模的兩條基本語句,initial和always存在一些共同的特點(diǎn):60現(xiàn)在是60頁\一共有112頁\編輯于星期日所有的initial和always語句都是在時(shí)刻0(仿真剛開始)開始執(zhí)行;initial和always之后都跟隨著一段程序,這段程序會(huì)被封裝成一個(gè)“程序塊”,可以用begin-end(順序語句塊)封裝,也可以用fork-join(并行語句塊)封裝。如果這段程序只有1條語句,可以不用封裝;一個(gè)模塊中可以包含任意多個(gè)initial或always語句,這些initial語句和always語句彼此之間都是并行執(zhí)行的,即這些語句的執(zhí)行順序與其在模塊中書寫的順序無關(guān)。61現(xiàn)在是61頁\一共有112頁\編輯于星期日3.4.1行為級(jí)建模基礎(chǔ)下面介紹行為級(jí)建模中經(jīng)常使用的語句:1.initial語句結(jié)構(gòu)及過程賦值語句2.always語句結(jié)構(gòu)及過程賦值語句3.條件語句(if-else)4.多路分支語句(case-endcase)5.for循環(huán)語句(例如for等)62現(xiàn)在是62頁\一共有112頁\編輯于星期日1.initial語句的一般用法:所有在initial語句內(nèi)的語句構(gòu)成了一個(gè)initial塊。initial塊從仿真0時(shí)刻開始執(zhí)行,在整個(gè)仿真過程中只執(zhí)行一次。如果一個(gè)模塊中包括了若干個(gè)initial塊,則這些initial塊從仿真0時(shí)刻開始并發(fā)執(zhí)行,且每個(gè)塊的執(zhí)行是各自獨(dú)立的。如果在塊內(nèi)包含了多條行為語句,那么需要將這些語句組成一組,一般是使用關(guān)鍵字begin和end將它們組合為一個(gè)塊語句;如果塊內(nèi)只有一條語句,則不必使用begin和end。由于initial塊語句在整個(gè)仿真期間只能執(zhí)行一次,因此它一般被用于初始化、信號(hào)監(jiān)視、生成仿真波形等目的。63現(xiàn)在是63頁\一共有112頁\編輯于星期日64現(xiàn)在是64頁\一共有112頁\編輯于星期日可以發(fā)現(xiàn),initial語句執(zhí)行時(shí)可以通過指定時(shí)延而控制某個(gè)信號(hào)的值不斷變化。如果這個(gè)變化是很有規(guī)律的,而且所有時(shí)延值都相同,并且值只在0和1之間交替變換,就可以在這個(gè)信號(hào)上形成一個(gè)時(shí)鐘波形。通過改變時(shí)延值和不同的變化值,可以生成任意的波形信號(hào)??梢奿nitial語句主要用于初始化和波形生成。65現(xiàn)在是65頁\一共有112頁\編輯于星期日always語句包括的所有行為語句構(gòu)成了一個(gè)always語句塊。該always語句塊從仿真0時(shí)刻開始順序執(zhí)行其中的行為語句;在最后一條執(zhí)行完成后,再次開始執(zhí)行其中的第一條語句,如此循環(huán)往復(fù),直至整個(gè)仿真結(jié)束。always語句通常用于對(duì)數(shù)字電路中一組反復(fù)執(zhí)行的活動(dòng)進(jìn)行建模。例如時(shí)鐘信號(hào)發(fā)生器,每半個(gè)時(shí)鐘周期時(shí)鐘信號(hào)翻轉(zhuǎn)一次。在現(xiàn)實(shí)電路中只要電源接通,時(shí)鐘信號(hào)發(fā)生器從時(shí)刻0就有效,一直工作下去。2.always語句的一般用法:66現(xiàn)在是66頁\一共有112頁\編輯于星期日2.always語句的一般用法:always@(事件控制表達(dá)式)begin:塊名塊內(nèi)局部變量的定義;過程賦值語句(包括高級(jí)語句);endbegin…end之間只有一條語句時(shí),關(guān)鍵詞可以省略;begin…end之間的多條語句被稱為順序語句塊??梢越o語句塊取一個(gè)名字,稱為有名塊?!癅”稱為事件控制運(yùn)算符,用于掛起某個(gè)動(dòng)作,直到事件發(fā)生?!笆录刂票磉_(dá)式”也稱為敏感事件表,它是后面begin和end之間的語句執(zhí)行的條件。當(dāng)事件發(fā)生或某一特定的條件變?yōu)椤罢妗睍r(shí),后面的過程賦值語句就會(huì)被執(zhí)行。67現(xiàn)在是67頁\一共有112頁\編輯于星期日時(shí)延控制“#10”,always語句從時(shí)刻0開始,每隔10個(gè)單位時(shí)間就把Clk上的值翻轉(zhuǎn)一次,這樣就在Clk上得到了一個(gè)周期為20的波形信號(hào)。always中的時(shí)序控制可以是上例中的時(shí)延控制,也可以是事件控制。事件控制就是等待某一事件發(fā)生,該事件的發(fā)生將執(zhí)行always語句。68現(xiàn)在是68頁\一共有112頁\編輯于星期日[例]用符號(hào)“@”定義了事件控制的always語句。reg[0:5]InstrReg;reg[3:0]Accum;wireExecuteCycle;always@(EcecuteCycle)//always語句開始執(zhí)行的條件是事件EcecuteCycle的發(fā)生begin//順序語句塊開始case(InstrReg[0:1])//順序語句塊內(nèi)的case開始2'b00:Store(Accum,InstrReg[2:5]);//Store是用戶在別處自定義的任務(wù)2'b11:Load(Accum,InstrReg[2:5]);//Load是用戶在別處自定義的任務(wù)2'b01:Jump(InstrReg[2:5]);//Jump是用戶在別處自定義的任務(wù)2'b10:;//不做任何操作endcase//順序語句塊內(nèi)的case結(jié)構(gòu)開始end//順序語句塊結(jié)束69現(xiàn)在是69頁\一共有112頁\編輯于星期日這個(gè)always語句用到了符號(hào)@,意思是只要ExecuteCycle上有事件發(fā)生(值的變化),就執(zhí)行順序語句塊中的語句。符號(hào)“@”定義的是觸發(fā)事件,一旦檢測(cè)到ExecuteCycle上的電平跳變時(shí)的邊沿,就執(zhí)行always語句。事件控制”@”缺省為“電平敏感事件”,若使用關(guān)鍵詞“posedge”和“negedge”定義邊沿觸發(fā)。70現(xiàn)在是70頁\一共有112頁\編輯于星期日moduleDFF(Clk,D,Set,Q,Qbar);inputClk,D,Set;outputQ,Qbar;regQ,Qbar;always@(negedgeClk)beginif(Set!=1)begin#5Q=D;#1Qbar=~Q;endelsebegin#3Q=1;#2Qbar=0;endendendmodule[例]一個(gè)邊沿敏感事件控制的always語句71現(xiàn)在是71頁\一共有112頁\編輯于星期日begin

語句1;語句2;

語句n;endbegin:塊名塊內(nèi)聲明語句;語句1;語句2;

語句n;end注:塊內(nèi)聲明語句可以是參數(shù)聲明、reg型變量聲明、integer型變量聲明、real型變量聲明語句?;?、順序塊的格式72現(xiàn)在是72頁\一共有112頁\編輯于星期日[例1]beginb=a;c=b;//c的值為a的值end[例2]beginb=a;

#10c=b;//在兩條賦值語句間延遲10個(gè)時(shí)間單位end注:這里標(biāo)識(shí)符“#”表示延遲;在模塊調(diào)用中“#”表示參數(shù)的傳遞舉例73現(xiàn)在是73頁\一共有112頁\編輯于星期日[例]使用行為描述風(fēng)格對(duì)下圖所示的2線4線譯碼器進(jìn)行建模74現(xiàn)在是74頁\一共有112頁\編輯于星期日75現(xiàn)在是75頁\一共有112頁\編輯于星期日4、條件語句一、if-else語句判定所給條件是否滿足,根據(jù)判定的結(jié)果(真或假)決定執(zhí)行給出的兩種操作之一。if-else語句有3種形式其中“表達(dá)式”為邏輯表達(dá)式或關(guān)系表達(dá)式,或一位的變量。若表達(dá)式的值為0、x或z,則判定的結(jié)果為“假”;若為1,則結(jié)果為“真”。語句可為單句,也可為多句;多句時(shí)一定要用“begin_end”語句括起來,形成一個(gè)復(fù)合塊語句。對(duì)于每個(gè)判定只有兩個(gè)分支條件語句分為兩種:if-else語句和case語句;它們都是順序語句,應(yīng)放在“always”塊內(nèi)!76現(xiàn)在是76頁\一共有112頁\編輯于星期日4、條件語句允許一定形式的表達(dá)式簡(jiǎn)寫方式,如:if(expression)等同于if(expression==1)if(!expression)等同于if(expression!=1)if(表達(dá)式)語句1;if(表達(dá)式1)語句1;else 語句2;if(表達(dá)式1)語句1;elseif(表達(dá)式2)語句2;

…elseif(表達(dá)式n)語句n;方式1:方式2:方式3:適于對(duì)不同的條件,執(zhí)行不同的語句77現(xiàn)在是77頁\一共有112頁\編輯于星期日4、條件語句if語句可以嵌套;若if與else的數(shù)目不一樣,注意用“begin_end”語句來確定if與else的配對(duì)關(guān)系!if(表達(dá)式1)

if(表達(dá)式2)語句1;

else語句2;elseif(表達(dá)式3)語句3;

else語句4;if(表達(dá)式1)

beginif(表達(dá)式2)語句1;

endelse

語句2;當(dāng)if與else的數(shù)目不一樣時(shí),最好用“begin_end”語句將單獨(dú)的if語句括起來:if語句的嵌套:78現(xiàn)在是78頁\一共有112頁\編輯于星期日例:使用if-else語句對(duì)4選1數(shù)據(jù)選擇器的行為進(jìn)行描述注意,過程賦值語句只能給寄存器型變量賦值,因此,輸出變量Y的數(shù)據(jù)類型定義為reg。modulemux4to1_bh(D,S,Y);input[3:0]D;//輸入端口

input[1:0]S;//輸入端口

outputregY;//輸出端口及變量數(shù)據(jù)類型

always@(D,S)//電路功能描述

if(S==2’b00)Y=D[0];elseif(S==2’b01)Y=D[1];elseif(S==2’b10)Y=D[2];elseY=D[3];endmodule79現(xiàn)在是79頁\一共有112頁\編輯于星期日5、多路分支語句(case語句)case(敏感表達(dá)式)值1:語句1;值2:語句2;

值n:語句n;

default:語句n+1;endcase1.case語句當(dāng)敏感表達(dá)式取不同的值時(shí),執(zhí)行不同的語句。功能:當(dāng)某個(gè)(控制)信號(hào)取不同的值時(shí),給另一個(gè)(輸出)信號(hào)賦不同的值。常用于多條件譯碼電路(如譯碼器、數(shù)據(jù)選擇器、狀態(tài)機(jī)、微處理器的指令譯碼)!case語句有3種形式:case,casez,casex適于對(duì)同一個(gè)控制信號(hào)取不同的值時(shí),輸出取不同的值!case語句與if-else語句有什么區(qū)別呢?80現(xiàn)在是80頁\一共有112頁\編輯于星期日說明:其中“敏感表達(dá)式”又稱為“控制表達(dá)式”,通常表示為控制信號(hào)的某些位。值1~值n稱為分支表達(dá)式,用控制信號(hào)的具體狀態(tài)值表示,因此又稱為常量表達(dá)式。default項(xiàng)可有可無,一個(gè)case語句里只能有一個(gè)default項(xiàng)!值1~值n必須互不相同,否則矛盾。值1~值n的位寬必須相等,且與控制表達(dá)式的位寬相同。3、多路分支語句(case語句)81現(xiàn)在是81頁\一共有112頁\編輯于星期日2.casez與casex語句是case語句的兩種變體在case語句中,分支表達(dá)式每一位的值都是確定的(或者為0,或者為1);在casez語句中,若分支表達(dá)式某些位的值為高阻值z(mì),則不考慮對(duì)這些位的比較;在casex語句中,若分支表達(dá)式某些位的值為z或不定值x,則不考慮對(duì)這些位的比較。在分支表達(dá)式中,可用“?”來標(biāo)識(shí)x或z。

3、多路分支語句(case語句)82現(xiàn)在是82頁\一共有112頁\編輯于星期日例:對(duì)具有使能端En的4選1數(shù)據(jù)選擇器的行為進(jìn)行Verilog描述。當(dāng)En=0時(shí),數(shù)據(jù)選擇器工作,En=1時(shí),禁止工作,輸出為0。modulemux4to1_bh

(D,S,Y,En);input[3:0]D,[1:0]S;inputEn;

outputregY;

always@(D,S,En)beginif(En==1)Y=0;//En=1時(shí),輸出為0

else//En=0時(shí),選擇器工作case(S)2’d0:Y=D[0];2’d1:Y=D[1];2’d2:Y=D[2];2’d3:Y=D[3];endcaseendendmodule83現(xiàn)在是83頁\一共有112頁\編輯于星期日應(yīng)注意列出所有條件分支,否則當(dāng)條件不滿足時(shí),編譯器會(huì)生成一個(gè)鎖存器保持原值!這一點(diǎn)可用于設(shè)計(jì)時(shí)序電路,如計(jì)數(shù)器:條件滿足時(shí)加1,否則保持原值不變。而在組合電路設(shè)計(jì)中,應(yīng)避免生成隱含鎖存器!有效的方法是在if語句最后寫上else項(xiàng);在case語句最后寫上default項(xiàng)。三、使用條件語句注意事項(xiàng)84現(xiàn)在是84頁\一共有112頁\編輯于星期日6、循環(huán)語句循環(huán)語句分為4種:所有的循環(huán)語句都只能在initial或always中使用for語句——通過3個(gè)步驟來決定語句的循環(huán)執(zhí)行:(1)給控制循環(huán)次數(shù)的變量賦初值。(2)判定循環(huán)執(zhí)行條件,若為假則跳出循環(huán);若為真,則執(zhí)行指定的語句后,轉(zhuǎn)到第(3)步。(3)修改循環(huán)變量的值,返回第(2)步。repeat語句——連續(xù)執(zhí)行一條語句n次while語句——執(zhí)行一條語句,直到循環(huán)執(zhí)行條件不滿足;若一開始條件即不滿足,則該語句一次也不能被執(zhí)行!forever語句——無限連續(xù)地執(zhí)行語句,可用disable語句中斷!85現(xiàn)在是85頁\一共有112頁\編輯于星期日一、for語句for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句for(循環(huán)變量賦初值;循環(huán)執(zhí)行條件;循環(huán)變量增值)執(zhí)行語句兩條語句8條語句一般形式簡(jiǎn)單應(yīng)用形式相當(dāng)于采用while語句建立的循環(huán)結(jié)構(gòu):begin

循環(huán)變量賦初值;

while(循環(huán)執(zhí)行條件)

begin

<執(zhí)行語句>

循環(huán)變量增值;

endendfor語句比while語句簡(jiǎn)潔!86現(xiàn)在是86頁\一共有112頁\編輯于星期日例:用for實(shí)現(xiàn)顯示一個(gè)32位整數(shù)的循環(huán)moduleloop1;integeri;initialfor(i=0;i<4;i=i+1)begin$display("i=%h",i);endendmodule87現(xiàn)在是87頁\一共有112頁\編輯于星期日moduleecoder3to8_bh(A,En,Y);input[2:0]A,En;

outputreg[7:0]Y;

integerk;//聲明一個(gè)整型變量k

always@(A,En)//

begin

Y=8’b1111_1111;//設(shè)譯碼器輸出的默認(rèn)值

for(k=0;k<=7;k=k+1)//下面的if-else語句循環(huán)8次

if((En==1)&&(A==k))Y[k]=0;//當(dāng)En=1時(shí),根據(jù)A進(jìn)行譯碼

elseY[k]=1;//處理使能無效或輸入無效的情況

endendmodule

試用Verilog語言描述具有高電平使能的3線-8線譯碼器.循環(huán)8次88現(xiàn)在是88頁\一共有112頁\編輯于星期日[例]用for語句描述的7人投票表決器:若超過4人(含4人)投贊成票,則表決通過。modulevote7(pass,vote); outputpass; input[6:0]vote; reg[2:0]sum;//sum為reg型變量,用于統(tǒng)計(jì)贊成的人數(shù)

integeri;regpass;always@(vote)beginsum=0;//sum初值為0

for(i=0;i<=6;i=i+1)//for語句

if(vote[i])sum=sum+1;

//只要有人投贊成票,則sum加1

if(sum[2])pass=1;//若超過4人贊成,則表決通過

elsepass=0;

endendmodule或?qū)憺閕f(sum[2:0]>=3’d4)

89現(xiàn)在是89頁\一共有112頁\編輯于星期日超過4人贊成,則pass=1

90現(xiàn)在是90頁\一共有112頁\編輯于星期日[例]編寫一個(gè)能夠統(tǒng)計(jì)輸入變量Din中1的個(gè)數(shù)的程序。moduleforloop_demo(Din,out);input[2:0]Din;output[1:0]out;integernum_bits;always@(Din)begin:B1integeri;num_bits=0;for(i=0;i<3;i=i+1)if(Din[i]==1)num_bits=num_bits+1;elsenum_bits=num_bits;endassignout=num_bits;endmodule91現(xiàn)在是91頁\一共有112頁\編輯于星期日92現(xiàn)在是92頁\一共有112頁\編輯于星期日1.while語句有條件地執(zhí)行一條或多條語句。首先判斷循環(huán)執(zhí)行條件表達(dá)式是否為真。若為真,則執(zhí)行后面的語句或語句塊;然后再回頭判斷循環(huán)執(zhí)行條件表達(dá)式是否為真,若為真,再執(zhí)行一次后面的語句;如此不斷,直到條件表達(dá)式不為真。while(循環(huán)執(zhí)行條件表達(dá)式)語句while(循環(huán)執(zhí)行條件表達(dá)式)

begin

……end或格式二、while和forever語句93現(xiàn)在是93頁\一共有112頁\編輯于星期日注1:首先判斷循環(huán)執(zhí)行條件表達(dá)式是否為真,若不為真,則其后的語句一次也不被執(zhí)行!注2:在執(zhí)行語句中,必須有一條改變循環(huán)執(zhí)行條件表達(dá)式的值的語句!注3:while語句只有當(dāng)循環(huán)塊有事件控制(即@(posedgeclock))時(shí)才可綜合!94現(xiàn)在是94頁\一共有112頁\編輯于星期日modulecount1s_while(count,rega,clk); output[3:0]count; input[7:0]rega;inputclk;reg[3:0]count;always@(posedgeclk) begin:count1reg[7:0]tempreg;//用作循環(huán)執(zhí)行條件表達(dá)式

count=0;//count初值為0

tempreg=rega;//tempreg初值為rega

while(tempreg)//若tempreg非0,則執(zhí)行以下語句

beginif(tempreg[0])count=count+1;

//只要tempreg最低位為1,則count加1

tempreg=tempreg>>1;//右移1位

endendendmodule[例]用while語句對(duì)一個(gè)8位二進(jìn)制數(shù)中值為1的位進(jìn)行計(jì)數(shù)。改變循環(huán)執(zhí)行條件表達(dá)式的值95現(xiàn)在是95頁\一共有112頁\編輯于星期日96現(xiàn)在是96頁\一共有112頁\編輯于星期日無條件連續(xù)執(zhí)行forever后面的語句或語句塊。forever

語句foreverbegin……end或常用在測(cè)試模塊中產(chǎn)生周期性的波形,作為仿真激勵(lì)信號(hào)。常用disable語句跳出循環(huán)!注:不同于always語句,不能獨(dú)立寫在程序中,一般用在initial語句塊中!格式initialbegin:Clocking clk=0;#10forever#10clk=!clk;endinitialbegin:Stimulus ……disableClocking;//停止時(shí)鐘

end一般情況下是不可綜合的!常用在測(cè)試文件中2.forever語句97現(xiàn)在是97頁\一共有112頁\編輯于星期日連續(xù)執(zhí)行一條或多條語句n次。repeat

(循環(huán)次數(shù)表達(dá)式)語句repeat(循環(huán)次數(shù)表達(dá)式)

begin

……

end執(zhí)行語句為多條語句或格式只有部分綜合工具可以綜合此語句!三、repeat語句98現(xiàn)在是98頁\一共有112頁\編輯于星期日3.5.1

設(shè)計(jì)方法

3.5.2模塊實(shí)例引用語句

3.5分層次的電路設(shè)計(jì)方法現(xiàn)在是99頁\一共有112頁\編輯于星期日3.5.1設(shè)計(jì)方法

分層次建模就是將一個(gè)比較復(fù)雜數(shù)字電路劃分為多個(gè)組成模塊,分別對(duì)每個(gè)模塊建模,然后將這些模塊組合成一個(gè)總模塊,完成所需的功能。通常有自頂向下(top-down)和自底向上(bottom-up)自頂向下:先將最終設(shè)計(jì)目標(biāo)定義成頂層模塊,再按一定方法將頂層模塊劃分成各個(gè)子模塊,然后對(duì)子模塊進(jìn)行邏輯設(shè)計(jì)。自底向上:由基本元件構(gòu)成的各個(gè)子模塊首先被確定下來,然后將這些子模塊組合起來構(gòu)成頂層模塊,最后得到所要求的電路。100現(xiàn)在是100頁\一共有112頁\編輯于星期日BottomUp的設(shè)計(jì)方法1.由基本門構(gòu)成各個(gè)組合與時(shí)序邏輯2.由邏輯單

溫馨提示

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

評(píng)論

0/150

提交評(píng)論