[HDL語言與ASIC原理][王金明verilog源碼]_第1頁
[HDL語言與ASIC原理][王金明verilog源碼]_第2頁
[HDL語言與ASIC原理][王金明verilog源碼]_第3頁
[HDL語言與ASIC原理][王金明verilog源碼]_第4頁
[HDL語言與ASIC原理][王金明verilog源碼]_第5頁
已閱讀5頁,還剩73頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、王金明:Verilog HDL程序設計教程 - 1 - 【例 3.1】4 位全加器 module adder4(cout,sum,ina,inb,cin); output3:0 sum; output cout; input3:0 ina,inb; input cin; assign cout,sum=ina+inb+cin; endmodule 【例 3.2】4 位計數(shù)器 module count4(out,reset,clk); output3:0 out; input reset,clk; reg3:0 out; always (posedge clk) begin if (reset)

2、 out=0; /同步復位 else out=out+1; /計數(shù) end endmodule 【例 3.3】4 位全加器的仿真程序 timescale 1ns/1ns include adder4.v module adder_tp; /測試模塊的名字 reg3:0 a,b; /測試輸入信號定義為reg型 reg cin; wire3:0 sum; /測試輸出信號定義為wire型 wire cout; integer i,j; adder4 adder(sum,cout,a,b,cin); /調(diào)用測試對象 always #5 cin=cin; /設定cin的取值 initial begin

3、a=0;b=0;cin=0; for(i=1;i16;i=i+1) #10 a=i; /設定a的取值 end 程序文本 - 2 - initial begin for(j=1;j16;j=j+1) #10 b=j; /設定b的取值 end initial /定義結(jié)果顯示格式 begin $monitor($time,%d + %d + %b=%b,%d,a,b,cin,cout,sum); #160 $finish; end endmodule 【例 3.4】4 位計數(shù)器的仿真程序 timescale 1ns/1ns include count4.v module coun4_tp; reg

4、clk,reset; /測試輸入信號定義為reg型 wire3:0 out; /測試輸出信號定義為wire型 parameter DELY=100; count4 mycount(out,reset,clk); /調(diào)用測試對象 always #(DELY/2) clk = clk; /產(chǎn)生時鐘波形 initial begin /激勵信號定義 clk =0; reset=0; #DELY reset=1; #DELY reset=0; #(DELY*20) $finish; end /定義結(jié)果顯示格式 initial $monitor($time,clk=%d reset=%d out=%d,

5、clk, reset,out); endmodule 【例 3.5】 “與-或-非”門電路 module AOI(A,B,C,D,F); /模塊名為AOI(端口列表A,B,C,D,F(xiàn)) input A,B,C,D; /模塊的輸入端口為A,B,C,D output F; /模塊的輸出端口為F 王金明:Verilog HDL程序設計教程 - 3 - wire A,B,C,D,F; /定義信號的數(shù)據(jù)類型 assign F= (A&B)|(C&D); /邏輯功能描述 endmodule 【例 5.1】用 case語句描述的 4 選 1 數(shù)據(jù)選擇器 module mux4_1(out,in0,in1,i

6、n2,in3,sel); output out; input in0,in1,in2,in3; input1:0 sel; reg out; always (in0 or in1 or in2 or in3 or sel) /敏感信號列表 case(sel) 2b00: out=in0; 2b01: out=in1; 2b10: out=in2; 2b11: out=in3; default: out=2bx; endcase endmodule 【例 5.2】同步置數(shù)、同步清零的計數(shù)器 module count(out,data,load,reset,clk); output7:0 out;

7、 input7:0 data; input load,clk,reset; reg7:0 out; always (posedge clk) /clk上升沿觸發(fā) begin if (!reset) out = 8h00; /同步清0,低電平有效 else if (load) out = data; /同步預置 else out = out + 1; /計數(shù) end endmodule 【例 5.3】用 always 過程語句描述的簡單算術(shù)邏輯單元 define add 3d0 define minus 3d1 define band 3d2 define bor 3d3 define bnot

8、 3d4 程序文本 - 4 - module alu(out,opcode,a,b); output7:0 out; reg7:0 out; input2:0 opcode; /操作碼 input7:0 a,b; /操作數(shù) always(opcode or a or b) /電平敏感的always塊 begin case(opcode) add: out = a+b; /加操作 minus: out = a-b; /減操作 band: out = a&b; /求與 bor: out = a|b; /求或 bnot: out=a; /求反 default: out=8hx; /未收到指令時,輸出

9、任意態(tài) endcase end endmodule 【例 5.4】用 initial過程語句對測試變量 A、B、C 賦值 timescale 1ns/1ns module test; reg A,B,C; initial begin A = 0; B = 1; C = 0; #50 A = 1; B = 0; #50 A = 0; C = 1; #50 B = 1; #50 B = 0; C = 0; #50 $finish ; end endmodule 【例 5.5】用 begin-end 串行塊產(chǎn)生信號波形 timescale 10ns/1ns module wave1; reg wav

10、e; parameter cycle=10; initial begin 王金明:Verilog HDL程序設計教程 - 5 - wave=0; #(cycle/2) wave=1; #(cycle/2) wave=0; #(cycle/2) wave=1; #(cycle/2) wave=0; #(cycle/2) wave=1; #(cycle/2) $finish ; end initial $monitor($time,wave=%b,wave); endmodule 【例 5.6】用 fork-join 并行塊產(chǎn)生信號波形 timescale 10ns/1ns module wave

11、2; reg wave; parameter cycle=5; initial fork wave=0; #(cycle) wave=1; #(2*cycle) wave=0; #(3*cycle) wave=1; #(4*cycle) wave=0; #(5*cycle) wave=1; #(6*cycle) $finish; join initial $monitor($time,wave=%b,wave); endmodule 【例 5.7】持續(xù)賦值方式定義的 2 選 1 多路選擇器 module MUX21_1(out,a,b,sel); input a,b,sel; output o

12、ut; assign out=(sel=0)?a:b; /持續(xù)賦值,如果sel為0,則out=a ;否則out=b endmodule 【例 5.8】阻塞賦值方式定義的 2 選 1 多路選擇器 module MUX21_2(out,a,b,sel); input a,b,sel; 程序文本 - 6 - output out; reg out; always(a or b or sel) begin if(sel=0) out=a; /阻塞賦值 else out=b; end endmodule 【例 5.9】非阻塞賦值 module non_block(c,b,a,clk); output c

13、,b; input clk,a; reg c,b; always (posedge clk) begin b=a; c=b; end endmodule 【例 5.10】阻塞賦值 module block(c,b,a,clk); output c,b; input clk,a; reg c,b; always (posedge clk) begin b=a; c=b; end endmodule 【例 5.11】模為 60 的 BCD碼加法計數(shù)器 module count60(qout,cout,data,load,cin,reset,clk); output7:0 qout; output

14、cout; input7:0 data; input load,cin,clk,reset; reg7:0 qout; always (posedge clk) /clk上升沿時刻計數(shù) 王金明:Verilog HDL程序設計教程 - 7 - begin if (reset) qout=0; /同步復位 else if(load) qout=data; /同步置數(shù) else if(cin) begin if(qout3:0=9) /低位是否為9,是則 begin qout3:0=0; /回0,并判斷高位是否為5 if (qout7:4=5) qout7:4=0; else qout7:4=qou

15、t7:4+1; /高位不為5,則加1 end else /低位不為9,則加1 qout3:0=qout3:0+1; end end assign cout=(qout=8h59)&cin)?1:0; /產(chǎn)生進位輸出信號 endmodule 【例 5.12】BCD碼七段數(shù)碼管顯示譯碼器 module decode4_7(decodeout,indec); output6:0 decodeout; input3:0 indec; reg6:0 decodeout; always (indec) begin case(indec) /用case語句進行譯碼 4d0:decodeout=7b11111

16、10; 4d1:decodeout=7b0110000; 4d2:decodeout=7b1101101; 4d3:decodeout=7b1111001; 4d4:decodeout=7b0110011; 4d5:decodeout=7b1011011; 4d6:decodeout=7b1011111; 4d7:decodeout=7b1110000; 4d8:decodeout=7b1111111; 4d9:decodeout=7b1111011; default: decodeout=7bx; endcase end 程序文本 - 8 - endmodule 【例 5.13】用 case

17、z 描述的數(shù)據(jù)選擇器 module mux_casez(out,a,b,c,d,select); output out; input a,b,c,d; input3:0 select; reg out; always (select or a or b or c or d) begin casez(select) 4b?1: out = a; 4b?1?: out = b; 4b?1?: out = c; 4b1?: out = d; endcase end endmodule 【例 5.14】隱含鎖存器舉例 module buried_ff(c,b,a); output c; input b

18、,a; reg c; always (a or b) begin if(b=1)&(a=1) c=a&b; end endmodule 【例 5.15】用 for 語句描述的七人投票表決器 module voter7(pass,vote); output pass; input6:0 vote; reg2:0 sum; integer i; reg pass; always (vote) begin sum=0; 王金明:Verilog HDL程序設計教程 - 9 - for(i=0;i=6;i=i+1) /for語句 if(votei) sum=sum+1; if(sum2) pass=1;

19、 /若超過4人贊成,則pass=1 else pass=0; end endmodule 【例 5.16】用 for 語句實現(xiàn) 2 個 8 位數(shù)相乘 module mult_for(outcome,a,b); parameter size=8; inputsize:1 a,b; /兩個操作數(shù) output2*size:1 outcome; /結(jié)果 reg2*size:1 outcome; integer i; always (a or b) begin outcome=0; for(i=1; i=size; i=i+1) /for語句 if(bi) outcome=outcome +(a (i

20、-1); end endmodule 【例 5.17】用 repeat 實現(xiàn) 8 位二進制數(shù)的乘法 module mult_repeat(outcome,a,b); parameter size=8; inputsize:1 a,b; output2*size:1 outcome; reg2*size:1 temp_a,outcome; regsize:1 temp_b; always (a or b) begin outcome=0; temp_a=a; temp_b=b; repeat(size) /repeat語句,size為循環(huán)次數(shù) begin if(temp_b1) /如果temp_

21、b的最低位為1,就執(zhí)行下面的加法 outcome=outcome+temp_a; temp_a=temp_a1; /操作數(shù)b右移一位 end end endmodule 【例 5.18】同一循環(huán)的不同實現(xiàn)方式 module loop1; /方式1 integer i; initial for(i=0;i4;i=i+1) /for語句 begin $display(“i=%h”,i); end endmodule module loop2; /方式2 integer i; initial begin i=0; while(i=0;i=i-1) outi=ai&bi; /按位與 end endta

22、sk always(code or a or b) begin case(code) 2b00: my_and(a,b,c); /* 調(diào)用任務my_and,需注意端口列表的順序應與任務定義中的一致,這里的 a,b,c分別對應任務定義中的a,b,out */ 2b01: c=a|b; /或 2b10: c=a-b; /相減 2b11: c=a+b; /相加 endcase end endmodule 王金明:Verilog HDL程序設計教程 - 13 - 【例 6.3】測試程序 include alutask.v module alu_tp; reg3:0 a,b; reg1:0 code;

23、wire4:0 c; parameter DELY = 100; alutask ADD(code,a,b,c); /調(diào)用被測試模塊 initial begin code=4d0; a= 4b0000; b= 4b1111; #DELY code=4d0; a= 4b0111; b= 4b1101; #DELY code=4d1; a= 4b0001; b= 4b0011; #DELY code=4d2; a= 4b1001; b= 4b0011; #DELY code=4d3; a= 4b0011; b= 4b0001; #DELY code=4d3; a= 4b0111; b= 4b100

24、1; #DELY $finish; end initial $monitor($time,code=%b a=%b b=%b c=%b, code,a,b,c); endmodule 【例 6.4】函數(shù) function7:0 get0; input7:0 x; reg7:0 count; integer i; begin count=0; for (i=0;i=7;i=i+1) if (xi=1b0) count=count+1; get0=count; end endfunction 【例 6.5】用函數(shù)和 case語句描述的編碼器(不含優(yōu)先順序) module code_83(din,d

25、out); input7:0 din; output2:0 dout; 程序文本 - 14 - function2:0 code; /函數(shù)定義 input7:0 din; /函數(shù)只有輸入,輸出為函數(shù)名本身 casex (din) 8b1xxx_xxxx : code = 3h7; 8b01xx_xxxx : code = 3h6; 8b001x_xxxx : code = 3h5; 8b0001_xxxx : code = 3h4; 8b0000_1xxx : code = 3h3; 8b0000_01xx : code = 3h2; 8b0000_001x : code = 3h1; 8b0

26、000_000x : code = 3h0; default: code = 3hx; endcase endfunction assign dout = code(din) ; /函數(shù)調(diào)用 endmodule 【例 6.6】階乘運算函數(shù) module funct(clk,n,result,reset); output31:0 result; input3:0 n; input reset,clk; reg31:0 result; always (posedge clk) /在clk的上升沿時執(zhí)行運算 begin if(!reset) result=0; /復位 else begin resu

27、lt = 2 * factorial(n); /調(diào)用factorial函數(shù) end end function31:0 factorial; /階乘運算函數(shù)定義(注意無端口列表) input3:0 opa; /函數(shù)只能定義輸入端, 輸出端口為函數(shù)名本身 reg3:0 i; begin factorial = opa ? 1 : 0; for(i= 2; i = opa; i = i+1) /該句若要綜合通過,opa應賦具體的數(shù)值 factorial = i* factorial; /階乘運算 end 王金明:Verilog HDL程序設計教程 - 15 - endfunction endmodu

28、le 【例 6.7】測試程序 define clk_cycle 50 include funct.v module funct_tp; reg3:0 n; reg reset,clk; wire31:0 result; initial /定義激勵向量 begin n=0; reset=1; clk=0; for(n=0;n=15;n=n+1) #100 n=n; end initial $monitor($time,n=%d result=%d,n,result); /定義輸出顯示格式 always # clk_cycle clk=clk; /產(chǎn)生時鐘信號 funct funct_try(.c

29、lk(clk),.n(n),.result(result),.reset(reset); /調(diào)用被測試模塊 endmodule 【例 6.8】順序執(zhí)行模塊 1 module serial1(q,a,clk); output q,a; input clk; reg q,a; always (posedge clk) begin q=q; a=q; end endmodule 【例 6.9】順序執(zhí)行模塊 2 module serial2(q,a,clk); output q,a; 程序文本 - 16 - input clk; reg q,a; always (posedge clk) begin

30、a=q; q=q; end endmodule 【例 6.10】并行執(zhí)行模塊 1 module paral1(q,a,clk); output q,a; input clk; reg q,a; always (posedge clk) begin q=q; end always (posedge clk) begin a=q; end endmodule 【例 6.11】并行執(zhí)行模塊 2 module paral2(q,a,clk); output q,a; input clk; reg q,a; always (posedge clk) begin a=q; end always (pose

31、dge clk) begin q=q; end endmodule 【例 7.1】調(diào)用門元件實現(xiàn)的 4 選 1 MUX 王金明:Verilog HDL程序設計教程 - 17 - module mux4_1a(out,in1,in2,in3,in4,cntrl1,cntrl2); output out; input in1,in2,in3,in4,cntrl1,cntrl2; wire notcntrl1,notcntrl2,w,x,y,z; not (notcntrl1,cntrl2), (notcntrl2,cntrl2); and (w,in1,notcntrl1,notcntrl2),

32、(x,in2,notcntrl1,cntrl2), (y,in3,cntrl1,notcntrl2), (z,in4,cntrl1,cntrl2); or (out,w,x,y,z); endmodule 【例 7.2】用 case語句描述的 4 選 1 MUX module mux4_1b(out,in1,in2,in3,in4,cntrl1,cntrl2); output out; input in1,in2,in3,in4,cntrl1,cntrl2; reg out; always(in1 or in2 or in3 or in4 or cntrl1 or cntrl2) case(c

33、ntrl1,cntrl2) 2b00:out=in1; 2b01:out=in2; 2b10:out=in3; 2b11:out=in4; default:out=2bx; endcase endmodule 【例 7.3】行為描述方式實現(xiàn)的 4 位計數(shù)器 module count4(clk,clr,out); input clk,clr; output3:0 out; reg3:0 out; always (posedge clk or posedge clr) begin if (clr) out=0; else out=out+1; end endmodule 程序文本 - 18 - 【

34、例 7.4】數(shù)據(jù)流方式描述的 4 選 1 MUX module mux4_1c(out,in1,in2,in3,in4,cntrl1,cntrl2); output out; input in1,in2,in3,in4,cntrl1,cntrl2; assign out=(in1 & cntrl1 & cntrl2)|(in2 & cntrl1 & cntrl2)| (in3 & cntrl1 & cntrl2)|(in4 & cntrl1 & cntrl2); endmodule 【例 7.5】用條件運算符描述的 4 選 1 MUX module mux4_1d(out,in1,in2,in

35、3,in4,cntrl1,cntrl2); output out; input in1,in2,in3,in4,cntrl1,cntrl2; assign out=cntrl1 ? (cntrl2 ? in4:in3):(cntrl2 ? in2:in1); endmodule 【例 7.6】門級結(jié)構(gòu)描述的 2 選 1MUX module mux2_1a(out,a,b,sel); output out; input a,b,sel; not (sel_,sel); and (a1,a,sel_), (a2,b,sel); or (out,a1,a2); endmodule 【例 7.7】行為

36、描述的 2 選 1MUX module mux2_1b(out,a,b,sel); output out; input a,b,sel; reg out; always (a or b or sel) begin if(sel) out = b; else out = a; end endmodule 【例 7.8】數(shù)據(jù)流描述的 2 選 1MUX module MUX2_1c(out,a,b,sel); output out; 王金明:Verilog HDL程序設計教程 - 19 - input a,b,sel; assign out = sel ? b : a; endmodule 【例 7

37、.9】調(diào)用門元件實現(xiàn)的 1 位半加器 module half_add1(a,b,sum,cout); input a,b; output sum,cout; and (cout,a,b); xor (sum,a,b); endmodule 【例 7.10】數(shù)據(jù)流方式描述的 1 位半加器 module half_add2(a,b,sum,cout); input a,b; output sum,cout; assign sum=ab; assign cout=a&b; endmodule 【例 7.11】采用行為描述的 1 位半加器 module half_add3(a,b,sum,cout);

38、 input a,b; output sum,cout; reg sum,cout; always (a or b) begin case (a,b) /真值表描述 2b00: begin sum=0; cout=0; end 2b01: begin sum=1; cout=0; end 2b10: begin sum=1; cout=0; end 2b11: begin sum=0; cout=1; end endcase end endmodule 【例 7.12】采用行為描述的 1 位半加器 module half_add4(a,b,sum,cout); input a,b; outpu

39、t sum,cout; 程序文本 - 20 - reg sum,cout; always (a or b) begin sum= ab; cout=a&b; end endmodule 【例 7.13】調(diào)用門元件實現(xiàn)的 1 位全加器 module full_add1(a,b,cin,sum,cout); input a,b,cin; output sum,cout; wire s1,m1,m2,m3; and (m1,a,b), (m2,b,cin), (m3,a,cin); xor (s1,a,b), (sum,s1,cin); or (cout,m1,m2,m3); endmodule 【

40、例 7.14】數(shù)據(jù)流描述的 1 位全加器 module full_add2(a,b,cin,sum,cout); input a,b,cin; output sum,cout; assign sum = a b cin; assign cout = (a & b)|(b & cin)|(cin & a); endmodule 【例 7.15】1 位全加器 module full_add3(a,b,cin,sum,cout); input a,b,cin; output sum,cout; assign cout,sum=a+b+cin; endmodule 【例 7.16】行為描述的 1 位全

41、加器 module full_add4(a,b,cin,sum,cout); input a,b,cin; output sum,cout; 王金明:Verilog HDL程序設計教程 - 21 - reg sum,cout; /在always塊中被賦值的變量應定義為reg型 reg m1,m2,m3; always (a or b or cin) begin sum = (a b) cin; m1 = a & b; m2 = b & cin; m3 = a & cin; cout = (m1|m2)|m3; end endmodule 【例 7.17】混合描述的 1 位全加器 module

42、full_add5(a,b,cin,sum,cout); input a,b,cin; output sum,cout; reg cout,m1,m2,m3; /在always塊中被賦值的變量應定義為reg型 wire s1; xor x1(s1,a,b); /調(diào)用門元件 always (a or b or cin) /always塊語句 begin m1 = a & b; m2 = b & cin; m3 = a & cin; cout = (m1| m2) | m3; end assign sum = s1 cin; /assign持續(xù)賦值語句 endmodule 【例 7.18】結(jié)構(gòu)描述的 4 位級連全加器 include full_add1.v module add4_1(sum,cout,a,b,cin); output3:0 sum; output cout; input3:0 a,b; input cin; full_add1 f0(a0,b0,cin,sum0,cin1); /級連描述 full_add1 f1(a1,b1,cin1,sum1,cin2); full_add1 f2(a2,b2,cin2,sum2,cin3); 程序文本 - 22 - full_add1 f3(a3,b3,cin3,sum3,cout);

溫馨提示

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

評論

0/150

提交評論