ch03-Verilog HDL基礎(chǔ)與組合電路建模_第1頁(yè)
ch03-Verilog HDL基礎(chǔ)與組合電路建模_第2頁(yè)
ch03-Verilog HDL基礎(chǔ)與組合電路建模_第3頁(yè)
ch03-Verilog HDL基礎(chǔ)與組合電路建模_第4頁(yè)
ch03-Verilog HDL基礎(chǔ)與組合電路建模_第5頁(yè)
已閱讀5頁(yè),還剩108頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、工程學(xué)院 信息技術(shù)教研室,Verilog HDL與FPGA 數(shù)字系統(tǒng)設(shè)計(jì),3.1 Verilog HDL基本語法規(guī)則,3.2 Verilog HDL門級(jí)建模,3.3 Verilog HDL數(shù)據(jù)流建模與運(yùn)算符,3.4 組合電路的行為級(jí)建模,3.5分層次的電路設(shè)計(jì)方法,3.1 Verilog HDL基本語法規(guī)則,3.1.1 詞法規(guī)定 3.1.2 邏輯值集合 3.1.3 常量及其表示 3.1.4 數(shù)據(jù)類型,3,3.1.1 詞法規(guī)定,為對(duì)數(shù)字電路進(jìn)行描述,Verilog語言規(guī)定了一套完整的語法結(jié)構(gòu)。,1間隔符: Verilog 的間隔符主要起分隔文本的作用,可以使文本錯(cuò)落有致,便于閱讀與修改。 間隔符

2、包括空格符(b)、TAB 鍵(t)、換行符(n)及換頁(yè)符。,2注釋符:注釋只是為了改善程序可讀性,編譯時(shí)不起作用。 多行注釋符(用于寫多行注釋): /* - */; 單行注釋符 :以/開始到行尾結(jié)束為注釋文字。,4,任何用Verilog HDL語言描述的“東西”都通過其名字來識(shí)別,這個(gè)名字被稱為標(biāo)識(shí)符。 如源文件名、模塊名、端口名、變量名、常量名、實(shí)例名等。 標(biāo)識(shí)符可由字母、數(shù)字、下劃線和$符號(hào)構(gòu)成;但第一個(gè)字符必須是字母或下劃線,不能是數(shù)字或$符號(hào)! 在Verilog HDL中變量名是區(qū)分大小寫的! 合法的名字: A_99_Z Reset _54MHz_Clock$ Module,不合法的名

3、字: 123a $data module 7seg.v,標(biāo)識(shí)符不能與關(guān)鍵字同名!,三、標(biāo)識(shí)符和關(guān)鍵字,5,關(guān)鍵字事先定義好的確認(rèn)符,用來組織語言結(jié)構(gòu);或者用于定義Verilog HDL提供的門元件(如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,為了表示數(shù)字邏輯電路的邏輯狀態(tài),Verilog語言規(guī)定了 4種基本的邏輯值。,

4、3.1.2 邏輯值集合,7,數(shù)據(jù)類型是用來表示數(shù)字電路硬件中的數(shù)據(jù)存儲(chǔ)和傳送元素的。 常量是在程序運(yùn)行過程中,其值不能被改變的量。,3.1.3 常量及其表示,8,3.1.3 常量及其表示,三種類型的常量,整數(shù)型常量 實(shí)數(shù)型常量 字符串型常量,實(shí)數(shù)型常量,整數(shù)型常量,例如:3b101、5o37、8he3,8b1001_0011,9,3.1.3 常量及其表示,;,Verilog 允許用參數(shù)定義語句定義一個(gè)標(biāo)識(shí)符來代表一個(gè)常量,稱為符號(hào)常量。定義的格式為: parameter 參數(shù)名1常量表達(dá)式1,參數(shù)名2常量表達(dá)式2 如 parameter BIT=1, BYTE=8, PI=3.14;,字符串常

5、量,字符串是用雙撇號(hào)括起來的字符序列,它必須包含在同一行中,不能分成多行書寫。例如: this is a string hello world!,符號(hào)常量,10,3.1.4 數(shù)據(jù)類型,寄存器型,線網(wǎng)型,線網(wǎng)類:是指輸出始終根據(jù)輸入的變化而更新其值的變量,它一般指的是硬件電路中的各種物理連接.,11,wire型數(shù)據(jù)常用來表示用以assign關(guān)鍵字指定的組合邏輯信號(hào)。 Verilog 程序模塊中輸入、輸出信號(hào)類型默認(rèn)時(shí),自動(dòng)定義為wire型。 wire型信號(hào)可以用做任何方程式的輸入,也可以用做assign語句或?qū)嵗妮敵觥?wire a; /定義了一個(gè)1位的wire型數(shù)據(jù) wire7:0 b;

6、 /定義了一個(gè)8位的wire型數(shù)據(jù) wire4:1 c,d; /定義了二個(gè)4位的wire型數(shù)據(jù),wire型,12,表3.1.3 線網(wǎng)類型變量及其說明,13,關(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è)輸出變量的情況。,例如,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,3.1.4 數(shù)據(jù)類型,寄存器型,線網(wǎng)型,寄存器型變量對(duì)應(yīng)的是具有狀態(tài)保持作用的電路等元件,如觸發(fā)器寄存器。寄存器型變量只能在initial或always內(nèi)部

7、被賦值。,15,寄存器變量類型,表3.1.5 寄存器變量類型及其說明,例: reg clock; /一個(gè)1位寄存器變量的聲明 reg 3:0 counter; /一個(gè)4位寄存器變量的聲明,end,16,3.2 Verilog HDL門級(jí)建模,3.2.1 多輸入門,3.2.4 門級(jí)建模舉例,3.2.2 多輸出門,3.2.3 三態(tài)門,17,基本概念:,結(jié)構(gòu)級(jí)建模: 就是根據(jù)邏輯電路的結(jié)構(gòu)(邏輯圖),實(shí)例引用Verilog HDL中內(nèi)置的基本門級(jí)元件或者用戶定義的元件或其他模塊,來描述結(jié)構(gòu)圖中的元件以及元件之間的連接關(guān)系。 門級(jí)建模: Verilog HDL中內(nèi)置了12個(gè)基本門級(jí)元件(Primiti

8、ve,有的翻譯為“原語”)模型,引用這些基本門級(jí)元件對(duì)邏輯圖進(jìn)行描述,也稱為門級(jí)建模。,18,Verilog HDL 基本門級(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、下拉電阻pulldown,19,6.4.1 多輸入門,共6個(gè): and、nand、 or、nor、 xor、xnor 特點(diǎn):只有1個(gè)輸出, 有多個(gè)輸入,多輸入門的

9、一般引用格式為: Gate_ name (OutputA, Input1, Input2, InputN);,20,基本門的調(diào)用方法舉例:,若同一個(gè)基本門在當(dāng)前模塊中被調(diào)用多次,可在一條調(diào)用語句中加以說明,中間以逗號(hào)相隔。,and A1(out,in1,in2,in3); xnor NX1(out,in1,in2,in3,in4);,對(duì)基本門級(jí)元件,調(diào)用名A1、NX1可以省略。,21,真值表舉例,表3.2.2 and、nand真值表,22,3.2.2 多輸出門,允許有多個(gè)輸出,但只有一個(gè)輸入。,not N1(out1,out2,in);,buf B1(out1,out2,in);,23,3.2

10、.3 三態(tài)門,有一個(gè)輸出、一個(gè)數(shù)據(jù)輸入和一個(gè)輸入控制。 如果輸入控制信號(hào)無效,則三態(tài)門的輸出為高阻態(tài)z。,24,/Gate-level description module _2to1muxtri (a,b,sel,out); input a,b,sel; output out; tri out; bufif1 (out,b,sel); bufif0 (out,a,sel); endmodule, 2選1數(shù)據(jù)選擇器,小結(jié): 門級(jí)建模就是列出電路圖結(jié)構(gòu)中的元件,并按網(wǎng)表連接 。,3.2.4 門級(jí)建模舉例,25,module addbit (a, b, ci, sum, co); input a,

11、 b, ci; output sum, co; wire a, b, ci, sum, co, n1, n2, n3; xor u0(n1, a, b,), u1(sum, n1, ci); and u2(n2, a, b), u3(n3, n1, ci); or (co, n2, n3); endmodule, 1位全加器,3.2.4 門級(jí)建模舉例,26,門級(jí)描述小結(jié):,1.給電路圖中的每個(gè)輸入輸出引腳 賦以 端口名. 2.給電路圖中每條內(nèi)部連線 取上各自的連線名. 3.給電路圖中的每個(gè)邏輯元件取一個(gè)編號(hào) (即“調(diào)用名”). 4.給所要描述的這個(gè)電路模塊確定一個(gè)模塊名.,5.用module定

12、義相應(yīng)模塊名的結(jié)構(gòu)描述,并將邏輯圖中所有的輸入輸出端口名列入端口名表項(xiàng)中,再完成對(duì)各端口的輸入輸出類型說明. 6.依照電路圖中的連接關(guān)系,確定各單元之間端口信號(hào)的連接,完成對(duì)電路圖內(nèi)部的結(jié)構(gòu)描述. 7.最后用endmodule結(jié)束模塊描述全過程.,end,27,3.3 Verilog HDL數(shù)據(jù)流建模與運(yùn)算符,3.3.1 數(shù)據(jù)流建模,3.3.2 運(yùn)算符及其優(yōu)先級(jí),28,在數(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ù)流建模。

13、,3.3 Verilog HDL數(shù)據(jù)流建模與運(yùn)算符,29,3.3 Verilog HDL數(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,3.3.1 數(shù)據(jù)流建模,數(shù)據(jù)流建模使用的連續(xù)賦值語句,由關(guān)鍵詞assign開始,后面跟著由操作數(shù)和運(yùn)算符等組成的邏輯表達(dá)式。,一般用法如

14、下: wire 位寬說明 變量名1,變量名2,變量名n; assign 變量名表達(dá)式;,注意,assign 語句只能對(duì)wire型變量進(jìn)行賦值,所以等號(hào)左邊變量名的數(shù)據(jù)類型必須是wire型。,31,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,module mux2to1_dataflow(D0, D1

15、, S, Y ); input D0, D1, S; output Y; wire Y ; /下面是邏輯功能描述 assign Y = (S /表達(dá)式左邊Y必須是wire型 endmodule,電路結(jié)構(gòu)描述,數(shù)據(jù)類型說明,例 用數(shù)據(jù)流描述方式建立模型,33,module mux2x1_df (D0,D1,S,L); input D0,D1,S; output L; assign L = S ? D1 : D0; endmodule,例:用條件運(yùn)算符描述了一個(gè)2選1的數(shù)據(jù)選擇器。,條件運(yùn)算符:如果S1,則輸出LD1; 否則LD0。,34,例:用數(shù)據(jù)流建模方法對(duì)2線-4線譯碼器的行為進(jìn)行描述。,3

16、5,module decoder_df (A1,A0,E,Y); input A1,A0,E; output 3:0 Y; assign Y0 = (A1 endmodule,例:用數(shù)據(jù)流建模方法對(duì)2線-4線譯碼器的行為進(jìn)行描述。,36,例:用數(shù)據(jù)流描述風(fēng)格對(duì)一個(gè)4位二進(jìn)制數(shù)的加法器建模。,module adder4(Cout,Sum,A,B,Cin); parameter width=4; outputwidth-1:0 Sum; output Cout; inputwidth-1:0 A,B; input Cin; assign Cout,Sum=A+B+Cin;endmodule,37,

17、3.3.1 數(shù)據(jù)流建模,數(shù)據(jù)流建模提供了用邏輯表達(dá)式描述電路的一 種方式。不必考慮電路的組成以及元件之間的 連接,是描述組合邏輯電路常用的一種方式。,38,3.3.2 表達(dá)式與操作數(shù),表達(dá)式由運(yùn)算符合操作數(shù)構(gòu)成,其目的是根據(jù)運(yùn)算符的含義 計(jì)算出一個(gè)結(jié)果值。,AB; Add131:20+Add231:20,操作數(shù)可以是常數(shù)、整數(shù)、實(shí)數(shù)、線網(wǎng)、寄存器、時(shí)間 等任何數(shù)據(jù)類型。,39,運(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類: 單目運(yùn)算符帶一個(gè)操作數(shù) 邏輯非!,按位取反,縮減運(yùn)算符,

18、移位運(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,3.3.3 運(yùn)算符及其優(yōu)先級(jí),1.運(yùn)算符 (9類),41,一、算術(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 + PLUS II不支持 “/” 和“%”運(yùn)算! Quartus II都支持!,42,例 除法和求模運(yùn)算的

19、區(qū)別,注意/和%的區(qū)別!,43,9/4 = 2,9%4 =1,arithmetic.vwf,44,二、關(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)算符。 例 asize - 1等同于: a(size - 1) size -(1a)不等同于: size-1a,45,三、等式運(yùn)算符,雙目運(yùn)算符,運(yùn)算結(jié)果為1位的邏輯值1或0或x。 等于運(yùn)算符(= =)和全等運(yùn)算符(= = =)的區(qū)別:

20、使用等于運(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 + PLUS II和Quartus II都不支持!,46,例 if(A = = 1bx) $display(“AisX”);/當(dāng)A為不定值時(shí), 式(A = = 1bx)的運(yùn)算結(jié)果為x,則該語句不執(zhí)行 if(A = = = 1bx) $display(“AisX”);/當(dāng)A為

21、不定值時(shí),式(A = = = 1bx)的運(yùn)算結(jié)果為1,該語句執(zhí)行,“= =”的真值表,“= = =”的真值表,等于運(yùn)算的結(jié)果可能為1或0或x,全等于運(yùn)算的結(jié)果只有1或0,47,a、b的初值同為4b0100,c和d的初值同為4b10 x0,相等與全等運(yùn)算符,(邏輯相等), !(邏輯不等) (條件全等),!(條件不全等),48,四、邏輯運(yùn)算符 邏輯運(yùn)算符把它的操作數(shù)當(dāng)作布爾變量: 非零的操作數(shù)被認(rèn)為是真(1b1); 零被認(rèn)為是假(1b0); 不確定的操作數(shù)如4bxx00, 被認(rèn)為是不確定的(可能為零,也可能為非零)(記為1bx); 但4bxx11被認(rèn)為是真(記為1b1,因?yàn)樗隙ㄊ欠橇愕模?進(jìn)行

22、邏輯運(yùn)算后的結(jié)果為布爾值(為1或0或x)!,49,“ b=|a; /等效于 b =( (a0 | a1) | a(2) | a3,注意縮減運(yùn)算符和位運(yùn)算符的區(qū)別!,52,位運(yùn)算符與縮位運(yùn)算的比較,A:4b1010 、 B:4b1111,,53,七、移位運(yùn)算符,單目運(yùn)算符,只有當(dāng)右操作數(shù)為常數(shù)時(shí)MAX + PLUS II支持!,左移會(huì)擴(kuò)充位數(shù)!,用法:An 或 A3 = 4b0001; 4b10014 = 4b0000 4b10011 = 5b10010; 4b10012 = 6b100100; 16 = 32b1000000,將操作數(shù)右移或左移n位,相當(dāng)于將操作數(shù)除以或乘以2n。,右移位數(shù)不變

23、,但右移的數(shù)據(jù)會(huì)丟失!,54,八、條件運(yùn)算符,三目運(yùn)算符,信號(hào) = 條件?表達(dá)式1:表達(dá)式2,條件運(yùn)算符為?: 用法:,例 數(shù)據(jù)選擇器assign out = sel? in1:in0;,當(dāng)條件為真,信號(hào)取表達(dá)式1的值;為假,則取表達(dá)式2的值。,sel=1時(shí)out=in1; sel=0時(shí)out=in0,55,對(duì)同一個(gè)操作數(shù)的重復(fù)拼接還可以雙重大括號(hào)構(gòu)成的運(yùn)算符 例如4A=4b1111,2A,2B,C=8b11101000。,在Verilog HDL語言中有一個(gè)特殊的運(yùn)算符:位拼接運(yùn)算符 作用是將兩個(gè)或多個(gè)信號(hào)的某些位拼接起來成為一個(gè)新的操作數(shù),進(jìn)行運(yùn)算操作。,九、位拼接運(yùn)算符,設(shè)A=1b1,B

24、=2b10,C=2b00,則B,C4b1000 A,B1,C03b110 A,B,C,3b101=8b11000101。,信號(hào)1的某幾位,信號(hào)2的某幾位,信號(hào)n的某幾位,56,2. 運(yùn)算符的優(yōu)先級(jí),優(yōu)先級(jí)的順序從下向上依次增加。,end,為提高程序的可讀性,建議使用括號(hào)來控制運(yùn)算的優(yōu)先級(jí)! 例(ab) end,beginend 之間只有一條語句時(shí),關(guān)鍵詞可以省略;,beginend 之間的多條語句被稱為順序語句塊??梢越o語句塊取一個(gè)名字,稱為有名塊。,“”稱為事件控制運(yùn)算符,用于掛起某個(gè)動(dòng)作,直到事件發(fā)生?!笆录刂票磉_(dá)式”也稱為敏感事件表,它是后面begin和end之間的語句執(zhí)行的條件。當(dāng)事

25、件發(fā)生或某一特定的條件變?yōu)椤罢妗睍r(shí),后面的過程賦值語句就會(huì)被執(zhí)行。,67,時(shí)延控制“#10”,always語句從時(shí)刻0開始,每隔10個(gè)單位時(shí)間就把Clk上的值翻轉(zhuǎn)一次,這樣就在Clk上得到了一個(gè)周期為20的波形信號(hào)。 always中的時(shí)序控制可以是上例中的時(shí)延控制,也可以是事件控制。事件控制就是等待某一事件發(fā)生,該事件的發(fā)生將執(zhí)行always語句。,68,例用符號(hào)“”定義了事件控制的always語句。 reg 0:5 InstrReg; reg 3:0 Accum; wire ExecuteCycle; always (EcecuteCycle) /always語句開始執(zhí)行的條件是事件Ecec

26、uteCycle的發(fā)生 begin /順序語句塊開始 case(InstrReg 0 : 1 ) /順序語句塊內(nèi)的case開始 2b00: Store (Accum, InstrReg2:5 ) ; /Store是用戶在別處自定義的任務(wù) 2b11: Load (Accum, InstrReg2:5 ) ; /Load是用戶在別處自定義的任務(wù) 2b01: Jump (InstrReg2:5 ) ; /Jump是用戶在別處自定義的任務(wù) 2b10 : ; /不做任何操作 endcase /順序語句塊內(nèi)的case結(jié)構(gòu)開始 end /順序語句塊結(jié)束,69,這個(gè)always語句用到了符號(hào),意思是只要Exe

27、cuteCycle上有事件發(fā)生(值的變化),就執(zhí)行順序語句塊中的語句。 符號(hào)“”定義的是觸發(fā)事件,一旦檢測(cè)到ExecuteCycle上的電平跳變時(shí)的邊沿,就執(zhí)行always語句。 事件控制”缺省為“電平敏感事件”,若使用關(guān)鍵詞“posedge”和“negedge”定義邊沿觸發(fā)。,70,module DFF(Clk, D, Set, Q, Qbar ) ; input Clk, D, Set; output Q, Qbar; reg Q, Qbar; always (negedge Clk) begin if (Set!= 1) begin #5 Q = D; #1 Qbar =Q; end e

28、lse begin #3 Q = 1; #2 Qbar = 0; end end endmodule,例一個(gè)邊沿敏感事件控制的always語句,71,begin 語句1; 語句2; 語句n; end,begin:塊名 塊內(nèi)聲明語句; 語句1; 語句2; 語句n; end,注:塊內(nèi)聲明語句可以是參數(shù)聲明、reg型變量聲明、integer型變量聲明、real型變量聲明語句。,或,3、順序塊的格式,72,例1begin b = a ; c = b; /c的值為a的值 end 例2 begin b = a ; #10 c = b; /在兩條賦值語句間延遲10個(gè)時(shí)間單位 end,注:這里標(biāo)識(shí)符“#”表示

29、延遲; 在模塊調(diào)用中“#”表示參數(shù)的傳遞,舉例,73,例使用行為描述風(fēng)格對(duì)下圖所示的2線4線譯碼器進(jìn)行建模,74,75,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)放在“a

30、lways”塊內(nèi)!,76,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; else if(表達(dá)式2)語句2; else if(表達(dá)式n)語句n;,方式1:,方式2:,方式3:,適于對(duì)不同的條件,執(zhí)行不同的語句,77,4、 條件語句,if語句可以嵌套; 若if與else的數(shù)目不一樣,注意用“begin_end”語句來確定if與else的配

31、對(duì)關(guān)系!,if(表達(dá)式1) if(表達(dá)式2)語句1; else 語句2; else if(表達(dá)式3)語句3; else 語句4;,if(表達(dá)式1) begin if(表達(dá)式2)語句1; end else 語句2;,當(dāng)if與else的數(shù)目不一樣時(shí),最好用“begin_end”語句將單獨(dú)的if語句括起來:,if語句的嵌套:,78,例:使用if-else語句對(duì)4選1數(shù)據(jù)選擇器的行為進(jìn)行描述,注意,過程賦值語句只能給寄存器型變量賦值,因此,輸出變量Y的數(shù)據(jù)類型定義為reg。,module mux4to1_bh(D, S, Y); input 3:0 D; /輸入端口 input 1:0 S; /輸入端

32、口 output reg Y; /輸出端口及變量數(shù)據(jù)類型 always (D, S) /電路功能描述 if (S = 2b00) Y = D0; else if (S= 2b01) Y = D1; else if (S= 2b10) Y = D2; else Y = D3; endmodule,79,5、多路分支語句(case語句),case(敏感表達(dá)式) 值1:語句1; 值2:語句2; 值n:語句n; default: 語句n+1; endcase,1. case語句,當(dāng)敏感表達(dá)式取不同的值時(shí), 執(zhí)行不同的語句。 功能:當(dāng)某個(gè)(控制)信號(hào)取不同的值時(shí),給另一個(gè)(輸出)信號(hào)賦不同的值。常用于多

33、條件譯碼電路(如譯碼器、數(shù)據(jù)選擇器、狀態(tài)機(jī)、微處理器的指令譯碼)! case語句有3種形式:case,casez,casex,適于對(duì)同一個(gè)控制 信號(hào)取不同的值時(shí), 輸出取不同的值!,case語句與if-else語句有什么區(qū)別呢?,80,說明: 其中“敏感表達(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,2. ca

34、sez與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,例:對(duì)具有使能端En 的4選1數(shù)據(jù)選擇器的行為進(jìn)行Verilog描述。當(dāng)En=0時(shí),數(shù)據(jù)選擇器工作,En=1時(shí),禁止工作,輸出為0。,module mux4to1_bh (D, S, Y,En); input 3:0 D,1:0

35、S; input En; output reg Y; always (D, S, En) begin if (En=1) Y = 0; /En=1時(shí),輸出為0 else /En=0時(shí),選擇器工作 case (S) 2d0: Y = D0; 2d1: Y = D1; 2d2: Y = D2; 2d3: Y = D3; endcase end endmodule,83,應(yīng)注意列出所有條件分支,否則當(dāng)條件不滿足時(shí),編譯器會(huì)生成一個(gè)鎖存器保持原值! 這一點(diǎn)可用于設(shè)計(jì)時(shí)序電路,如計(jì)數(shù)器:條件滿足時(shí)加1,否則保持原值不變。 而在組合電路設(shè)計(jì)中,應(yīng)避免生成隱含鎖存器!有效的方法是在if語句最后寫上else項(xiàng)

36、;在case語句最后寫上default項(xiàng)。,三、使用條件語句注意事項(xiàng),84,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,一、fo

37、r語句,for (表達(dá)式1;表達(dá)式2;表達(dá)式3)語句,for(循環(huán)變量賦初值;循環(huán)執(zhí)行條件;循環(huán)變量增值) 執(zhí)行語句,兩條語句,一般形式,簡(jiǎn)單應(yīng)用形式,相當(dāng)于采用while語句建立的循環(huán)結(jié)構(gòu): begin 循環(huán)變量賦初值; while(循環(huán)執(zhí)行條件) begin 循環(huán)變量增值; end end,for語句比while語句簡(jiǎn)潔!,86,例:用for實(shí)現(xiàn)顯示一個(gè)32位整數(shù)的循環(huán),module loop1; integer i; initial for(i=0;i4;i=i+1) begin $display(i=%h,i); end endmodule,87,module ecoder3to8_b

38、h(A,En,Y); input 2:0 A,En; output reg 7:0Y; integer k; /聲明一個(gè)整型變量k always (A, En) / begin Y = 8b1111_1111; /設(shè)譯碼器輸出的默認(rèn)值 for(k = 0; k = 7; k = k+1) /下面的if-else語句循環(huán)8次 if (En=1) /處理使能無效或輸入無效的情況 end endmodule,試用Verilog語言描述具有高電平使能的3線-8線譯碼器.,88,例用for語句描述的7人投票表決器:若超過4人(含4人)投贊成票,則表決通過。,module vote7 ( pass,vot

39、e ); output pass; input 6:0 vote; reg2:0 sum; /sum為reg型變量,用于統(tǒng)計(jì)贊成的人數(shù) integer i; reg pass; always (vote) begin sum = 0; /sum初值為0 for(i = 0;i=6;i = i+1) /for語句 if(votei) sum = sum+1; /只要有人投贊成票,則 sum加1 if(sum2) pass = 1; /若超過4人贊成,則表決通過else pass = 0; end endmodule,或?qū)憺閕f(sum2:0=3d4),89,超過4人贊成,則pass=1,90,例

40、編寫一個(gè)能夠統(tǒng)計(jì)輸入變量Din中1 的個(gè)數(shù)的程序。,module forloop_demo(Din,out); input2:0 Din; output1:0 out; integer num_bits; always (Din) begin: B1 integer i; num_bits=0; for(i=0;i3;i=i+1) if(Dini=1) num_bits=num_bits+1; else num_bits=num_bits; end assign out=num_bits; endmodule,91,92,1.while語句 有條件地執(zhí)行一條或多條語句。 首先判斷循環(huán)執(zhí)行條件表

41、達(dá)式是否為真。若為真,則執(zhí)行后面的語句或語句塊;然后再回頭判斷循環(huán)執(zhí)行條件表達(dá)式是否為真,若為真,再執(zhí)行一次后面的語句;如此不斷,直到條件表達(dá)式不為真。,while (循環(huán)執(zhí)行條件表達(dá)式)語句,while (循環(huán)執(zhí)行條件表達(dá)式) begin end,或,格式,二、 while和forever語句,93,注1:首先判斷循環(huán)執(zhí)行條件表達(dá)式是否為真,若不為真,則其后的語句一次也不被執(zhí)行! 注2:在執(zhí)行語句中,必須有一條改變循環(huán)執(zhí)行條件表達(dá)式的值的語句! 注3:while語句只有當(dāng)循環(huán)塊有事件控制(即(posedge clock)時(shí)才可綜合!,94,module count1s_while ( cou

42、nt,rega,clk ); output3:0 count; input 7:0 rega; input clk; reg3:0 count; always (posedge clk) begin:count1 reg7:0 tempreg; /用作循環(huán)執(zhí)行條件表達(dá)式 count = 0; / count初值為0 tempreg = rega; / tempreg 初值為rega while(tempreg) / 若tempreg非0,則執(zhí)行以下語句 begin if(tempreg0) count = count+1; /只要tempreg最低位為1,則 count加1 tempreg =

43、 tempreg 1; /右移1位 end end endmodule,例用while語句對(duì)一個(gè)8位二進(jìn)制數(shù)中值為1的位進(jìn)行計(jì)數(shù)。,改變循環(huán)執(zhí)行條件表達(dá)式的值,95,96,無條件連續(xù)執(zhí)行forever后面的語句或語句塊。,forever 語句,forever begin end,或,常用在測(cè)試模塊中產(chǎn)生周期性的波形,作為仿真激勵(lì)信號(hào)。 常用disable語句跳出循環(huán)!,注:不同于always語句,不能獨(dú)立寫在程序中, 一般用在initial語句塊中!,格式,initial begin : Clocking clk = 0; #10 forever #10 clk = !clk; end ini

44、tial begin : Stimulus disable Clocking; / 停止時(shí)鐘 end,一般情況下 是不可綜合的!常用在測(cè)試文件中,2.forever語句,97,連續(xù)執(zhí)行一條或多條語句n次。,repeat (循環(huán)次數(shù)表達(dá)式)語句,repeat (循環(huán)次數(shù)表達(dá)式) begin end,執(zhí)行語句為多條語句,或,格式,只有部分綜合工具可以綜合此語句!,三、repeat語句,98,3.5.1 設(shè)計(jì)方法 3.5.2 模塊實(shí)例引用語句,3.5 分層次的電路設(shè)計(jì)方法,3.5.1 設(shè)計(jì)方法,分層次建模就是將一個(gè)比較復(fù)雜數(shù)字電路劃分為多個(gè)組成模塊,分別對(duì)每個(gè)模塊建模,然后將這些模塊組合成一個(gè)總模塊

45、,完成所需的功能。 通常有自頂向下(top-down)和自底向上(bottom-up) 自頂向下:先將最終設(shè)計(jì)目標(biāo)定義成頂層模塊,再按一定方法將頂層模塊劃分成各個(gè)子模塊,然后對(duì)子模塊進(jìn)行邏輯設(shè)計(jì)。 自底向上: 由基本元件構(gòu)成的各個(gè)子模塊首先被確定下來,然后將這些子模塊組合起來構(gòu)成頂層模塊,最后得到所要求的電路。,100,Bottom Up的設(shè)計(jì)方法,101,傳統(tǒng)的電路系統(tǒng)設(shè)計(jì)方法的步驟: 1.采用自下而上的設(shè)計(jì)方法-從狀態(tài)圖的簡(jiǎn)化,寫出最 簡(jiǎn)邏輯表達(dá)式; 2. 采用通用邏輯元器件-通常采用74系列和CMOS4000系列的產(chǎn)品進(jìn)行設(shè)計(jì); 3.在系統(tǒng)硬件設(shè)計(jì)的后期進(jìn)行調(diào)試和仿真 ; 只有在部分或全部硬件電路連接完畢,才可以進(jìn)行電路調(diào)試,一旦考慮不周到,系統(tǒng)設(shè)計(jì)存在較大缺陷,則要重新設(shè)計(jì),使設(shè)計(jì)周期延長(zhǎng)。 4.設(shè)計(jì)結(jié)果是一張電路圖 ; 當(dāng)設(shè)計(jì)調(diào)試完畢后,形成電原理圖,該圖包括元器件型號(hào)和信號(hào)之間的互連關(guān)系等等,Bottom Up,102,優(yōu)點(diǎn):,1.設(shè)計(jì)人員對(duì)于用這種方法進(jìn)行設(shè)計(jì)比較熟悉; 2.實(shí)現(xiàn)各個(gè)子塊電路所需的時(shí)間短。 缺點(diǎn): 1.一般來講,對(duì)系統(tǒng)的整體功能把握不足; 2.實(shí)現(xiàn)整個(gè)系統(tǒng)的功能所需的時(shí)間長(zhǎng),因?yàn)楸仨毾?將各個(gè)小模塊完成,使用這種方法對(duì)設(shè)計(jì)人員之間相互進(jìn)行協(xié)作有比較高的要求。,103,Top down 的設(shè)計(jì)方法,104

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論