[HDL語言與ASIC原理][王金明verilog源碼]

上傳人:努力****83 文檔編號:55625218 上傳時間:2022-02-18 格式:DOC 頁數(shù):78 大?。?29KB
收藏 版權申訴 舉報 下載
[HDL語言與ASIC原理][王金明verilog源碼]_第1頁
第1頁 / 共78頁
[HDL語言與ASIC原理][王金明verilog源碼]_第2頁
第2頁 / 共78頁
[HDL語言與ASIC原理][王金明verilog源碼]_第3頁
第3頁 / 共78頁

下載文檔到電腦,查找使用更方便

0 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《[HDL語言與ASIC原理][王金明verilog源碼]》由會員分享,可在線閱讀,更多相關《[HDL語言與ASIC原理][王金明verilog源碼](78頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、 王金明:《Verilog HDL程序設計教程》 - 1 - 【例 3.1】4 位全加器 module adder4(cout,sum,ina,inb,cin); output[3:0] sum; output cout; input[3:0] ina,inb; input cin; assign {cout,sum}=ina+inb+cin; endmodule 【例 3.2】4 位計數(shù)器 module count4(out,reset,clk); output[3:0] out; input reset,clk; reg[

2、3:0] out; always @(posedge clk) begin if (reset) out<=0; //同步復位 else out<=out+1; //計數(shù) end endmodule 【例 3.3】4 位全加器的仿真程序 `timescale 1ns/1ns `include "adder4.v" module adder_tp; //測試模塊的名字 reg[3:0] a,b; //測試輸入信號定義為reg型 reg cin;

3、 wire[3:0] sum; //測試輸出信號定義為wire型 wire cout; integer i,j; adder4 adder(sum,cout,a,b,cin); //調(diào)用測試對象 always #5 cin=~cin; //設定cin的取值 initial begin a=0;b=0;cin=0; for(i=1;i<16;i=i+1) #10 a=i; //設定a的取值 end 程序文本 - 2 - initial begin for(

4、j=1;j<16;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 clk,res

5、et; //測試輸入信號定義為reg型 wire[3: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;

6、 #(DELY*20) $finish; end //定義結(jié)果顯示格式 initial $monitor($time,,,"clk=%d reset=%d out=%d", 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程序設

7、計教程》 - 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,in2,in3,sel); output out; input in0,in1,in2,in3; input[1:0] sel; reg out; always @(in0 or in1 or in2 or in3

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

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

10、nd 3'd2 `define bor 3'd3 `define bnot 3'd4 程序文本 - 4 - module alu(out,opcode,a,b); output[7:0] out; reg[7:0] out; input[2:0] opcode; //操作碼 input[7:0] a,b; //操作數(shù) always@(opcode or a or b) //電平敏感的always塊 begin case(opcode) `add: out = a+b; //加操作 `m

11、inus: out = a-b; //減操作 `band: out = a&b; //求與 `bor: out = a|b; //求或 `bnot: out=~a; //求反 default: out=8'hx; //未收到指令時,輸出任意態(tài) endcase end endmodule 【例 5.4】用 initial過程語句對測試變量 A、B、C 賦值 `timescale 1ns/1ns module test; reg A,B,C; initial

12、 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 wave; parameter cycle=10; initial begin 王金明

13、:《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)生信號波形 `timescal

14、e 10ns/1ns module wave2; 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

15、 【例 5.7】持續(xù)賦值方式定義的 2 選 1 多路選擇器 module MUX21_1(out,a,b,sel); input a,b,sel; output out; 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; alw

16、ays@(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,b; input clk,a; reg c,b; always @(posedge clk) begin b<=a; c<=b; end endmodule 【例 5.10】阻塞賦

17、值 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); output[7:0] qout; output cout; input[7:0] data; input loa

18、d,cin,clk,reset; reg[7: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(qout[3:0]==9) //低位是否為9,是則 begin qout[3:0]<=0;

19、 //回0,并判斷高位是否為5 if (qout[7:4]==5) qout[7:4]<=0; else qout[7:4]<=qout[7:4]+1; //高位不為5,則加1 end else //低位不為9,則加1 qout[3:0]<=qout[3:0]+1; end end assign cout=((qout==8'h59)&cin)?1:0; //產(chǎn)生進位輸出信號 endmodule 【例 5.12】BCD碼—七段數(shù)碼管顯示譯碼器 module decode4_7(decodeo

20、ut,indec); output[6:0] decodeout; input[3:0] indec; reg[6:0] decodeout; always @(indec) begin case(indec) //用case語句進行譯碼 4'd0:decodeout=7'b1111110; 4'd1:decodeout=7'b0110000; 4'd2:decodeout=7'b1101101; 4'd3:decodeout=7'b1111001; 4

21、'd4:decodeout=7'b0110011; 4'd5:decodeout=7'b1011011; 4'd6:decodeout=7'b1011111; 4'd7:decodeout=7'b1110000; 4'd8:decodeout=7'b1111111; 4'd9:decodeout=7'b1111011; default: decodeout=7'bx; endcase end 程序文本 - 8 - endmodule 【例 5.13】用 casez 描述

22、的數(shù)據(jù)選擇器 module mux_casez(out,a,b,c,d,select); output out; input a,b,c,d; input[3:0] select; reg out; always @(select or a or b or c or d) begin casez(select) 4'b???1: out = a; 4'b??1?: out = b; 4'b?1??: out = c; 4'b1???: out = d; endcase end endmodule 【例 5.1

23、4】隱含鎖存器舉例 module buried_ff(c,b,a); output c; input b,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; input[6:0] vote; reg[2:0] sum; integer i; reg pass; always @(vote)

24、 begin sum=0; 王金明:《Verilog HDL程序設計教程》 - 9 - for(i=0;i<=6;i=i+1) //for語句 if(vote[i]) sum=sum+1; if(sum[2]) pass=1; //若超過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; input[size

25、:1] a,b; //兩個操作數(shù) output[2*size:1] outcome; //結(jié)果 reg[2*size:1] outcome; integer i; always @(a or b) begin outcome=0; for(i=1; i<=size; i=i+1) //for語句 if(b[i]) outcome=outcome +(a << (i-1)); end endmodule 【例 5.17】用 repeat 實現(xiàn) 8 位二進制數(shù)的乘法 module mu

26、lt_repeat(outcome,a,b); parameter size=8; input[size:1] a,b; output[2*size:1] outcome; reg[2*size:1] temp_a,outcome; reg[size: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_b[1]) //如果temp_b的最

27、低位為1,就執(zhí)行下面的加法 outcome=outcome+temp_a; temp_a=temp_a<<1; //操作數(shù)a左移一位 程序文本 - 10 - temp_b=temp_b>>1; //操作數(shù)b右移一位 end end endmodule 【例 5.18】同一循環(huán)的不同實現(xiàn)方式 module loop1; //方式1 integer i; initial for(i=0;i<4;i=i+1) //for語句 begin $display(“i=%h”,i)

28、; end endmodule module loop2; //方式2 integer i; initial begin i=0; while(i<4) //while語句 begin $display ("i=%h",i); i=i+1; end end endmodule module loop3; //方式3 integer i; initial begin i=0; repeat(4) //repeat語句 beg

29、in $display ("i=%h",i); i=i+1; end end endmodule 【例 5.19】使用了`include 語句的 16 位加法器 王金明:《Verilog HDL程序設計教程》 - 11 - `include "adder.v" module adder16(cout,sum,a,b,cin); output cout; parameter my_size=16; output[my_size-1:0] sum; input[my_size-1:0] a,b; input cin;

30、 adder my_adder(cout,sum,a,b,cin); //調(diào)用adder模塊 endmodule //下面是adder模塊代碼 module adder(cout,sum,a,b,cin); parameter size=16; output cout; output[size-1:0] sum; input cin; input[size-1:0] a,b; assign {cout,sum}=a+b+cin; endmodule 【例 5.20】條件編譯舉例 module compile(out,A,B)

31、; output out; input A,B; `ifdef add //宏名為add assign out=A+B; `else assign out=A-B; `endif endmodule 【例 6.1】加法計數(shù)器中的進程 module count(data,clk,reset,load,cout,qout); output cout; output[3:0] qout; reg[3:0] qout; input[3:0] data; input clk,re

32、set,load; 程序文本 - 12 - always @(posedge clk) //進程1,always過程塊 begin if (!reset) qout= 4'h00; //同步清0,低電平有效 else if (load) qout= data; //同步預置 else qout=qout + 1; //加法計數(shù) end assign cout=(qout==4'hf)?1:0; //進程2,用持續(xù)賦值產(chǎn)生進位信號 endmodule

33、 【例 6.2】任務舉例 module alutask(code,a,b,c); input[1:0] code; input[3:0] a,b; output[4:0] c; reg[4:0] c; task my_and; //任務定義,注意無端口列表 input[3:0] a,b; //a,b,out名稱的作用域范圍為task任務內(nèi)部 output[4:0] out; integer i; begin for(i=3;i>=0;i=i-1) out[i]=a

34、[i]&b[i]; //按位與 end endtask always@(code or a or b) begin case(code) 2'b00: my_and(a,b,c); /* 調(diào)用任務my_and,需注意端口列表的順序應與任務定義中的一致,這里的 a,b,c 分別對應任務定義中的a,b,out */ 2'b01: c=a|b; //或 2'b10: c=a-b; //相減 2'b

35、11: c=a+b; //相加 endcase end endmodule 王金明:《Verilog HDL程序設計教程》 - 13 - 【例 6.3】測試程序 `include "alutask.v" module alu_tp; reg[3:0] a,b; reg[1:0] code; wire[4:0] c; parameter DELY = 100; alutask ADD(code,a,b,c); //調(diào)用被測試模塊 initial begin

36、 code=4'd0; a= 4'b0000; b= 4'b1111; #DELY code=4'd0; a= 4'b0111; b= 4'b1101; #DELY code=4'd1; a= 4'b0001; b= 4'b0011; #DELY code=4'd2; a= 4'b1001; b= 4'b0011; #DELY code=4'd3; a= 4'b0011; b= 4'b0001; #DELY code=4'd3; a= 4'b0111; b= 4'b1001; #DELY $finish; end init

37、ial $monitor($time,,,"code=%b a=%b b=%b c=%b", code,a,b,c); endmodule 【例 6.4】函數(shù) function[7:0] get0; input[7:0] x; reg[7:0] count; integer i; begin count=0; for (i=0;i<=7;i=i+1) if (x[i]=1'b0) count=count+1; get0=count; end endfunction 【例 6.5】用函數(shù)和 case語句描述的編

38、碼器(不含優(yōu)先順序) module code_83(din,dout); input[7:0] din; output[2:0] dout; 程序文本 - 14 - function[2:0] code; //函數(shù)定義 input[7:0] din; //函數(shù)只有輸入,輸出為函數(shù)名本身 casex (din) 8'b1xxx_xxxx : code = 3'h7; 8'b01xx_xxxx : code = 3'h6; 8'b001x_xxxx : code = 3'h5;

39、8'b0001_xxxx : code = 3'h4; 8'b0000_1xxx : code = 3'h3; 8'b0000_01xx : code = 3'h2; 8'b0000_001x : code = 3'h1; 8'b0000_000x : code = 3'h0; default: code = 3'hx; endcase endfunction assign dout = code(din) ; //函數(shù)調(diào)用 endmodule 【例 6.6】階乘運算函數(shù) module funct(clk,n,resul

40、t,reset); output[31:0] result; input[3:0] n; input reset,clk; reg[31:0] result; always @(posedge clk) //在clk的上升沿時執(zhí)行運算 begin if(!reset) result<=0; //復位 else begin result <= 2 * factorial(n); //調(diào)用factorial函數(shù) end end function[31:0] factorial; //階乘運算

41、函數(shù)定義(注意無端口列表) input[3:0] opa; //函數(shù)只能定義輸入端, 輸出端口為函數(shù)名本身 reg[3: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 endmodule 【例 6.7】測試程序

42、 `define clk_cycle 50 `include "funct.v" module funct_tp; reg[3:0] n; reg reset,clk; wire[31: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); //

43、定義輸出顯示格式 always # `clk_cycle clk=~clk; //產(chǎn)生時鐘信號 funct funct_try(.clk(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

44、 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 a=~q; q=~q; end endmodule 【例 6.10】并行執(zhí)行模塊 1 module paral1(q,a,clk); output q,a;

45、 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 @(posedg

46、e 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,cn

47、trl2); and (w,in1,notcntrl1,notcntrl2), (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,cntrl

48、2; reg out; always@(in1 or in2 or in3 or in4 or cntrl1 or cntrl2) case({cntrl1,cntrl2}) 2'b00:out=in1; 2'b01:out=in2; 2'b10:out=in3; 2'b11:out=in4; default:out=2'bx; endcase endmodule 【例 7.3】行為描述方式實現(xiàn)的 4 位計數(shù)器 module count4(clk,clr,out); input clk,clr; output[3

49、:0] out; reg[3:0] out; always @(posedge clk or posedge clr) begin if (clr) out<=0; else out<=out+1; end endmodule 程序文本 - 18 - 【例 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=(

50、in1 & ~cntrl1 & ~cntrl2)|(in2 & ~cntrl1 & cntrl2)| (in3 & cntrl1 & ~cntrl2)|(in4 & cntrl1 & cntrl2); endmodule 【例 7.5】用條件運算符描述的 4 選 1 MUX module mux4_1d(out,in1,in2,in3,in4,cntrl1,cntrl2); output out; input in1,in2,in3,in4,cntrl1,cntrl2; assign out=cntrl1 ? (cntrl2 ? in4:in3):(cntrl

51、2 ? in2:in1); endmodule 【例 7.6】門級結(jié)構描述的 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】行為描述的 2 選 1MUX module mux2_1b(out,a,b,sel); output out; input a,b,sel; reg out;

52、 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.9】調(diào)用門元件實現(xiàn)的 1 位半加器

53、 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=a^b; assign cout=a&b; endmodule 【例 7.11】采用行為描述的 1 位半加器 module h

54、alf_add3(a,b,sum,cout); input a,b; output sum,cout; reg sum,cout; always @(a or b) begin case ({a,b}) //真值表描述 2'b00: begin sum=0; cout=0; end 2'b01: begin sum=1; cout=0; end 2'b10: begin sum=1; cout=0; end 2'b11: begin sum=0; cout=1; end endcase end

55、 endmodule 【例 7.12】采用行為描述的 1 位半加器 module half_add4(a,b,sum,cout); input a,b; output sum,cout; 程序文本 - 20 - reg sum,cout; always @(a or b) begin sum= a^b; 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 su

56、m,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 【例 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 &

57、 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 位全加器 module full_add4(a,b,cin,sum,cout); input a,b,cin; output sum,cout; 王金明:《Verilog HDL程序設計教程》 - 21 -

58、 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 full_add5(a,b,cin,sum,cout); input a,b,cin; output su

59、m,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ù)賦值語句 endmo

60、dule 【例 7.18】結(jié)構描述的 4 位級連全加器 `include "full_add1.v" module add4_1(sum,cout,a,b,cin); output[3:0] sum; output cout; input[3:0] a,b; input cin; full_add1 f0(a[0],b[0],cin,sum[0],cin1); //級連描述 full_add1 f1(a[1],b[1],cin1,sum[1],cin2); full_add1 f2(a[2],b[2],cin2,sum[2],cin

61、3); 程序文本 - 22 - full_add1 f3(a[3],b[3],cin3,sum[3],cout); endmodule 【例 7.19】數(shù)據(jù)流描述的 4 位全加器 module add4_2(cout,sum,a,b,cin); output[3:0] sum; output cout; input[3:0] a,b; input cin; assign {cout,sum}=a+b+cin; endmodule 【例 7.20】行為描述的 4 位全加器 module add4_3(cout,sum,a,b,

62、cin); output[3:0] sum; output cout; input[3:0] a,b; input cin; reg[3:0] sum; reg cout; always @(a or b or cin) begin {cout,sum}=a+b+cin; end endmodule 【例 8.1】$time 與$real time 的區(qū)別 `timescale 10ns/1ns module time_dif; reg ts; parameter delay=2.6; initial beg

63、in #delay ts=1; #delay ts=0; #delay ts=1; #delay ts=0; end initial $monitor($time,,,"ts=%b",ts); //使用函數(shù)$time 王金明:《Verilog HDL程序設計教程》 - 23 - endmodule 【例 8.2】$random 函數(shù)的使用 `timescale 10ns/1ns module random_tp; integer data; integer i; par

64、ameter delay=10; initial $monitor($time,,,"data=%b",data); initial begin for(i=0; i<=100; i=i+1) #delay data=$random; //每次產(chǎn)生一個隨機數(shù) end endmodule 【例 8.3】1 位全加器進位輸出 UDP 元件 primitive carry_udp(cout,cin,a,b); input cin,a,b; output cout; table //cin

65、 a b : cout //真值表 0 0 0 : 0; 0 1 0 : 0; 0 0 1 : 0; 0 1 1 : 1; 1 0 0 : 0; 1 0 1 : 1; 1 1 0 : 1; 1 1 1 : 1; endtable endprimitive 【例 8.4】包含 x 態(tài)輸入的 1 位全加器進位輸出 UDP 元件 primitive carry_udpx1(cout,cin,a,

66、b); input cin,a,b; output cout; table // cin a b : cout //真值表 0 0 0 : 0; 程序文本 - 24 - 0 1 0 : 0; 0 0 1 : 0; 0 1 1 : 1; 1 0 0 : 0; 1 0 1 : 1; 1 1 0 : 1; 1 1 1 : 1; 0 0 x : 0; //只要有兩個輸入為0,則進位輸出肯定為0 0 x 0 : 0; x 0 0 : 0; 1 1 x : 1; //只要有兩個輸入為1,則進位輸出肯定為1 1 x 1 : 1; x 1 1 : 1; endtable endprimitive 【例 8.5】用簡縮符“?”表述的 1 位全加器進位輸出 UD

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

相關資源

更多
正為您匹配相似的精品文檔
關于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!