虛的字體表示塊語句_第1頁
虛的字體表示塊語句_第2頁
虛的字體表示塊語句_第3頁
虛的字體表示塊語句_第4頁
虛的字體表示塊語句_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第五章 例題 例如:if(ab) out1 = int1; else out1 = int2;例如: always ( some_event) /虛的字體表示塊語句 beginif(ab) out1 = int1; else if (a=b) out1 = int2; else out1 = int3; endif(ab)begin out1=int1; out2=int2;endelsebegin out1=int2; out20)for(scani=0;scani0)begin$display(.);memoryscani=0;endelse/*WRONG*/$display(error-

2、indexiszero);盡管程序設(shè)計者把else寫在與第一個if(外層if)同一列上,希望與第一個if對應(yīng),但實際上else是與第二個if對應(yīng),因為它們相距最近。正確的寫法應(yīng)當(dāng)是這樣的:if(index0)beginfor(scani=0;scani0)begin$display(.);memoryscani=0;endendelse /*WRONG*/$display(error-indexiszero);/定義寄存器和參數(shù)。reg 31:0 instruction, segment_area255:0;reg 7:0 index;reg 5:0 modify_seg1, modify_s

3、eg2, modify_seg3;parametersegment1=0, inc_seg1=1,segment2=20, inc_seg2=2,segment3=64, inc_seg3=4,data=128;/檢測寄存器index的值if(indexsegment2)begininstruction = segment_areaindex + modify_seg1;index = index + inc_seg1;endelse if(indexsegment3)begininstruction = segment_areaindex + modify_seg2;index = inde

4、x + inc_seg2;endelse if (indexdata)begininstruction = segment_areaindex + modify_seg3;index = index + inc_seg3;endelseinstruction = segment_areaindex;reg 15:0 rega;reg 9:0 result;case(rega)16 d0: result = 10 b0111111111;16 d1: result = 10 b1011111111;16 d2: result = 10 b1101111111;16 d3: result = 10

5、 b1110111111;16 d4: result = 10 b1111011111;16 d5: result = 10 b1111101111;16 d6: result = 10 b1111110111;16 d7: result = 10 b1111111011;16 d8: result = 10 b1111111101;16 d9: result = 10 b1111111110;default: result =10 bx;endcase例1: case ( select1:2 )2 b00: result = 0;2 b01: result = flaga;2 b0x,2 b

6、0z: result = flaga? bx : 0;2 b10: result = flagb;2 bx0,2 bz0: result = flagb? bx : 0;default: result = bx;endcase例2: case(sig)1 bz: $display(signal is floating);1 bx: $display(signal is unknown);default: $display(signal is %b, sig);endcase 例3: reg7:0 ir;casez(ir) 8 b1?: instruction1(ir); 8 b01?: ins

7、truction2(ir); 8 b00010?: instruction3(ir); 8 b000001?: instruction4(ir);endcase例4: reg7:0 r, mask;mask = 8bx0x0x0x0;casex(rmask) 8 b001100xx: stat1; 8 b1100xx00: stat2; 8 b00xx0011: stat3; 8 bxx001100: stat4;endcase例: always (al or d ) / 有鎖存器begin if ( al ) q = d;endalways (al or d ) / 無鎖存器begin if

8、 ( al ) q = d; else q = 0;end例5: 條件語句舉例/第一類條件語句if ( !lock ) buffer = data ;if ( enable ) out = in ;/第二類條件語句if (number_queued MAX_Q_DEPTH)begin data_queue = data ; number_queued = number_queued + 1 ;endelse $display ( Queue Full. Try again ) ;/第三類條件語句/根據(jù)不同的算術(shù)邏輯單元的控制信號 alu_control 執(zhí)行不同的算術(shù)運算操作if ( alu_

9、control = = 0 ) y = x + z ;else if ( alu_control = = 1 ) y = x - z ;else if ( alu_control = = 2 ) y = x * z ;else $ display ( Invalid ALU control signal );reg 1: 0 alu_control ;.case (alu_control) 2 d 0 : y = x + z ; 2 d 1 : y = x - z ; 2 d 2 : y = x * z ;default : $display ( Invalid ALU control sig

10、nal ) ;endcase 例6:使用case語句實現(xiàn)四選一多路選擇器module mux4_to_1 (out, i0, i1, i2, i3, s1, s0);/ 根據(jù)輸入/輸出圖的端口聲明output out;input i0, i1, i2, i3;input s1, s0;/把輸出變量聲明為寄存器類型 reg out;/任何輸入信號改變,都會引起輸出信號的重新計算/使輸出out 重新計算的所有輸入信號必須寫入 always (.)的變量列表中 always (s1 or s0 or i0 or i1 or i2 or i3)begincase (s1, s0) 2b00: out

11、= i0; 2b01: out = i1; 2b10: out = i2; 2b11: out = i3; default: out = 1bx;endcaseendendmoduleparameter size=8,longsize=16;reg size:1 opa, opb;reg longsize:1 result;begin: multreg longsize:1 shift_opa, shift_opb;shift_opa = opa;shift_opb = opb;result = 0;repeat(size)beginif(shift_opb1)result = result

12、+ shift_opa;shift_opa = shift_opa 1;endend begin:count1sreg7:0 tempreg;count=0;tempreg = rega;while(tempreg)beginif(tempreg0) count = count + 1;tempreg = tempreg1;endend 例7:begin:init_memreg7:0 tempi;for(tempi=0;tempimemsize;tempi=tempi+1)memorytempi=0;end例8:parameter size = 8, longsize = 16;regsize

13、:1 opa, opb;reglongsize:1 result;begin:multinteger bindex;result=0;for( bindex=1; bindex=size; bindex=bindex+1 )if(opbbindex)result = result + (opa1 )if(tempreg0) count=count+1;end例9順序塊/說明1reg x, y;reg 1:0 z, w; initialbegin x = 1b0; y = 1b1; z = x, y; w = y, x; end/說明 2: 帶延遲的順序塊 reg x, y;reg 1:0 z,

14、 w;initialbegin x = 1b0; /在仿真時刻0 完成 #5 y = 1b1; /在仿真時刻5 完成 #10 z = x, y; / 在仿真時刻15 完成 #20 w = y, x; / 在仿真時刻35 完成 end例10 并行塊 /舉例 1: 帶延遲的并行塊 reg x, y;reg 1:0 z, w; initialfork x = 1b0; / 在仿真時刻0 完成 #5 y = 1b1; / 在仿真時刻5 完成 #10 z = x, y; / 在仿真時刻10 完成 #20 w = y, x; / 在仿真時刻20 完成join/故意引入競爭條件的并行塊 reg x, y;r

15、eg 1:0 z, w; initialfork x = 1b0; y = 1b1; z = x, y; w = y, x; join我們可以將并行塊的關(guān)鍵字fork看成是將一個執(zhí)行流分成多個獨立的執(zhí)行流;而關(guān)鍵字join則是將多個獨立的執(zhí)行流合并為一個執(zhí)行流。每個獨立的執(zhí)行流之間是并發(fā)執(zhí)行的。例11 嵌套塊/嵌套塊initialbegin x = 1b0; fork #5 y = 1b1; #10 z = x, y; join #20 w = y, x;endendmodule例12 命名塊/命名塊module top ;initialbegin : block1 /名字為block1的順序

16、命名塊integer i ; /整型變量 i 是block1命名塊的靜態(tài)本地變量.endinitialfork : block2 /名字為block2的并行命名塊reg i ; /寄存器變量 i 是block2命名塊的靜態(tài)本地變量.join例13 命名塊的禁用/在(矢量)標(biāo)志寄存器的各個位中從低有效位開始找尋第一個值為1的位 /從矢量標(biāo)志寄存器的低有效位開始查找第一個值為1的位reg 15:0 flag;integer i; /用于計數(shù)的整數(shù) initialbegin flag = 16b 0010_0000_0000_0000; i = 0; begin: block1 /while循環(huán)聲明

17、中的主模塊是命名塊block1 while(i 16) begin if (flagi) begin $display(Encountered a TRUE bit at element number %d, i); disable block1; / 在標(biāo)志寄存器中找到了值為真(1)的位,禁用block1 end i = i + 1;end endend 例14 對兩個N位總線變量進(jìn)行按位異或/本模塊生成兩條N位總線變量的按位異或module bitwise_xor ( out , i0 , i1 ) ;/參數(shù)聲明語句。參數(shù)可以重新定義parameter N = 32 ; / 缺省的總線位寬

18、為32位/端口聲明語句output N-1 : 0 out ;input N-1 : 0 i0 , i1 ;/聲明一個臨時循環(huán)變量。/該變量只用于生成塊的循環(huán)計算。/Verilog仿真時該變量在設(shè)計中并不存在genvar j ;/用一個單循環(huán)生成按位異或的異或門(xor)generate for ( j = 0 ; j N ; j = j + 1 ) begin : xor_loopxor g1 (out j , i0 j , i1 j ) ; end / 在生成塊內(nèi)部結(jié)束循環(huán)endgenerate /結(jié)束生成塊/另外一種編寫形式/異或門可以用always塊來替代/ reg N-1 : 0 o

19、ut ;/ generate / for ( j = 0 ; j N ; j = j + 1 ) / begin : bit/ always ( i0 j or i1 j ) out j = i0 j i0 j ; / end / endgenerate endmodule例15 用循環(huán)生成語句描述的脈動加法器/本模塊生成一個門級脈動加法器module ripple_adder ( co , sum , a0 , a1 , ci ) ;/參數(shù)聲明語句,參數(shù)可以重新定義。parameter N = 4 ; / 缺省的總線位寬為4/端口聲明語句output N-1 : 0 sum ;output

20、co ;input N-1 : 0 a0 , a1 ;input ci ;/本地線網(wǎng)聲明語句wire N-1 : 0 carry ;/指定進(jìn)位變量的第0位等于進(jìn)位的輸入assign carry 0 = ci ;/聲明臨時循環(huán)變量。該變量只用于生成塊的計算。/由于在仿真前,循環(huán)生成已經(jīng)展平,所以用Verilog對/設(shè)計進(jìn)行仿真時,該變量已經(jīng)不再存在。genvar i ;/用一個單循環(huán)生成按位異或門等邏輯generate for ( i = 0 ; i N ; i = i + 1 ) begin : r_loopwire t1 , t2 , t3 ;xor g1 ( t1 , a0 i , a1

21、i ) ;xor g2 ( sum i , t1 , carry i ) ;and g3 ( t2 , a0 i , a1 i ) ;and g4 ( t3 , t1 , carry i ) ;or g5 (carry i + 1 , t2 , t3 ) ;end / 生成塊內(nèi)部循環(huán)的結(jié)束 endgenerate /生成塊的結(jié)束/ 根據(jù)上面的循環(huán)生成,Verilog編譯器會自動生成以下相對層次實例名/ xor : r_loop0.g1 , r_loop1.g1 , r_loop2.g1 , r_loop3.g1 ,/ r_loop0.g2 , r_loop1.g2 , r_loop2.g2 ,

22、 r_loop3.g2 ,/ and : r_loop0.g3 , r_loop1.g3 , r_loop2.g3 , r_loop3.g3 ,/ r_loop0.g4 , r_loop1.g4 , r_loop2.g4 , r_loop3.g4 ,/ or : r_loop0.g5 , r_loop1.g5 , r_loop2.g5 , r_loop3.g5 / 上面生成的實例用下面這些生成的線網(wǎng)連接起來/ Nets : r_loop0.t1 , r_loop0.t2 , r_loop0.t3 / r_loop1.t1 , r_loop1.t2 , r_loop1.t3 / r_loop2.

23、t1 , r_loop2.t2 , r_loop2.t3 / r_loop3.t1 , r_loop3.t2 , r_loop3.t3 assign co = carry N ;endmodule 例16 使用條件生成語句實現(xiàn)參數(shù)化乘法器/ 本模塊實現(xiàn)一個參數(shù)化乘法器module multiplier ( product , a0 , a1 ) ;/參數(shù)聲明,該參數(shù)可以重新定義parameter a0_width = 8 ; parameter a1_width = 8 ; /本地參數(shù)聲明/本地參數(shù)不能用參數(shù)重新定義(defparam)修改 , /也不能在實例引用時通過傳遞參數(shù)語句,即 #(參

24、數(shù)1,參數(shù)2,.)的方法修改localparam product_width = a0_width + a1_width ;/端口聲明語句output product_width - 1 : 0 product ;input a0_width - 1 : 0 a0 ;input a1_width - 1 : 0 a1 ;/有條件地調(diào)用(實例引用)不同類型的乘法器/根據(jù)參數(shù)a0_width 和 a1_width的值,在調(diào)用時/引用相對應(yīng)的乘法器實例。generate if ( a0_width 8 ) | | ( a1_width 8 ) cal_multiplier # ( a0_width

25、, a1_width ) m0 ( product , a0 , a1 ) ;else tree_multiplier # ( a0_width , a1_width ) m0 ( product , a0 , a1 ) ;endgenerate /生成塊的結(jié)束endmodule例17 CASE生成語句舉例/本模塊生成N位的加法器module adder ( co , sum , a0 , a1 , ci );/參數(shù)聲明,本參數(shù)可以重新定義parameter N = 4 ; / 缺省的總線位寬為4/端口聲明output N-1 : 0 sum ;output co ;input N-1 : 0

26、 a0 , a1 ;input ci ;/ 根據(jù)總線的位寬,調(diào)用(實例引用)相應(yīng)的加法器/ 參數(shù)N在調(diào)用(實例引用)時可以重新定義,調(diào)用(實例引用)/ 不同位寬的加法器是根據(jù)不同的N來決定的。generate case ( N )/ 當(dāng)N=1, 或2 時分別選用位寬為1位或2位的加法器1 : adder_1bit adder1 ( co , sum , a0 , a1 , ci ) ; / 1位的加法器2 : adder_2bit adder2 ( co , sum , a0 , a1 , ci ) ; / 2位的加法器/ 缺省的情況下選用位寬為N位的超前進(jìn)位加法器default : adder_cla # ( N ) adder3 ( co , sum , a0 , a1 , ci ) ; endcaseendgenerate /生成塊的結(jié)束endmodule例18 行為級描述的四選一多路選擇器/ 四選一多路器,其端口列表完全根據(jù)輸入/輸出圖編寫 module mux4_to_1 (out, i0, i1, i2, i3, s1, s0);/ 根據(jù)輸入/輸出圖的端口聲明output out

溫馨提示

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

評論

0/150

提交評論