




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
經(jīng)典計(jì)算機(jī)培訓(xùn)教程
VerilogHDL程序設(shè)計(jì)教程
【例3.1】4位全加器
moduleadder4(cout,sum,ina,inb,cin);
output[3:0]sum;
outputcout;
input[3:0]ina,inb;
inputcin;
assign{cout,sum}=ina+inb+cin;
endmodule
【例3.2】4位計(jì)數(shù)器
modulecount4(out,reset,elk);
output[3:0]out;
inputreset,elk;
reg[3:0]out;
always@(posedgeelk)
begin
if(reset)out<=0;〃同步復(fù)位
elseout<=out+1;〃計(jì)數(shù)
end
endmodule
【例3.3】4位全加器的仿真程序
'timescaleIns/1ns
'includeMadder4.vu
moduleadder_tp;〃測試模塊的名字
reg[3:0]a,b;〃測試輸入信號(hào)定義為reg型
regcin;
wirel3:0Jsum;〃測試輸出信號(hào)定義為wire型
wirecout;
integeri,j;
adder4adder(sum,cout,a,b,cin);〃調(diào)用測試對(duì)象
always#5cin=-cin;〃設(shè)定cin的取值
initial
begin
a=0;b=0;cin=0;
fbr(i=l;i<16;i=i+l)
#10a=i;〃設(shè)定a的取值
end
-1-
程序文本
initial
begin
for(j=l;j<16;j=j+l)
#10b=j;//設(shè)定b的取值
end
initial〃定義結(jié)果顯示格式
begin
$monitor($time,?n%d+%d+%b={%b,%d}*\a,b,cin,cout,sum);
#160$finish;
end
endmodule
【例3.4]4位計(jì)數(shù)器的仿真程序
'timescaleIns/Ins
'include"count4.vH
modulecoun4_tp;
regelk,reset;〃測試輸入信號(hào)定義為reg型
wire[3:0]out;//測試輸出信號(hào)定義為wire型
parameterDELY=100;
count4mycounl(out,reset,elk);〃調(diào)用測試對(duì)象
always#(DELY/2)elk=~clk;//產(chǎn)生時(shí)鐘波形
initial
begin〃激勵(lì)信號(hào)定義
elk=0;reset=0;
#DELYreset=1;
#DELYreset=O;
#(DELY*20)$finish;
end
〃定義結(jié)果顯示格式
initial$monitor($time,?nclk=%(ireset=%dout=%d",elk,reset,out);
endmodule
【例3.5]“與域?非”門電路
moduleAOI(A,B,C,D,F);〃模塊名為AOI(端口列表A,B,C,D,F)
inputA,B,C,D;〃模塊的輸入端口為A,B,C,D
outputF;〃模塊的輸出端口為F
-2-
王金明:《VerilogHDL程序設(shè)計(jì)
教程》
wireA,B,C,D,F;〃定義信號(hào)的數(shù)據(jù)類型
assignF=?((A&B)I(C&D));〃邏輯功能描述
endmodule
【例5.1】用case語句描述的4選1數(shù)據(jù)選擇器
modulemux4_1(out,inO,inI,in2,in3,sel);
outputout;
inputin0,inl,in2,in3;
input[l:0]sei;
regout;
always@(inOorin1orin2orin3orsei)〃敏感信號(hào)列表
case(sel)
2*b00:out=inO;
2,b01:out=inl;
2*bl0:out=in2;
2*b11:out=in3;
default:out=2'bx;
endcase
endmodule
【例5.2】同步置數(shù)、同步清零的計(jì)數(shù)器
modulecount(out,data,load,reset,elk);
output[7:0]out;
input[7:0]data;
inputload,elk,reset;
reg[7:0]out;
always@(posedgeelk)//elk上升沿觸發(fā)
begin
if(!reset)out=8'h00;〃同步清0,低電平有效
elseif(load)out=data;〃同步預(yù)置
elseout=out+1;//計(jì)數(shù)
end
endmodule
【例5.3】用always過程語句描述的簡單算術(shù)邏輯單元
'defineadd3*d0
'defineminus3'dl
'defineband3'd2
'definebor3'd3
'definebnot3'd4
-3-
程序文本
modulealu(out,opcode,a,b);
output[7:0]out;
reg[7:0]out;
input[2:0]opcode;〃操作碼
input[7:0]a,b;〃操作數(shù)
always?(opcodeoraorb)〃電平敏感的always塊
begin
case(opcode)
'add:out=a+b;〃加操作
'minus:out=a-b;〃減操作
'band:out=a&b;〃求與
'bor:out=alb;〃求或
vbnot:out=~a;//求反
default:out=8'hx;〃未收到指令時(shí),輸出任意態(tài)
endcase
end
endmodule
【例5.4】用initial過程語句對(duì)測試變量A、B、C賦值
'timescaleIns/1ns
moduletest;
regA,B,C;
initial
begin
A=0;B=l;c=o;
#50A=1;B=0;
#50A=0;C=l;
#50B=1;
#50B=0;c=o;
#50$finish>
end
endmodule
【例5.5】用begin-end串行塊產(chǎn)生信號(hào)波形
'timescale10ns/Ins
modulewave1;
regwave;
parametercycle=10;
initial
begin
-4-
王金明:《VerilogHDL程序設(shè)計(jì)
教程》
wave=0;
#(cycle/2)wave=1;
#(cycle/2)wave=O;
#(cycle/2)wave=1;
#(cycle/2)wave=O;
#(cycle/2)wave=1;
#(cycle/2)Sfinish;
end
initial$monitor($time,?"wave=%b",wave);
endmodule
【例5.6】用fork-join并行塊產(chǎn)生信號(hào)波形
'timescale10ns/Ins
modulewave2;
regwave;
parametercycle=5;
initial
fork
wave=0;
#(cycle)wave=l;
#(2*cycle)wave=0;
#(3*cycle)wave=1;
#(4*cycle)wave=0;
#(5*cycle)wave=1;
#(6*cycle)$finish;
join
initial$monitor($time,?"wave=%bu,wave);
endmodule
【例5.7]持續(xù)賦值方式定義的2選1多路選擇器
moduleMUX21_1(out,a,b,sei);
inputa,b,sel;
outputout;
assignout=(sel==0)?a:b;
〃持續(xù)賦值,如果sei為0,則out=a;否則out=b
endmodule
【例5.8]阻塞賦值方式定義的2選1多路選擇器
moduleMUX21_2(out,a,b,sel);
inputa,b,sel;
-5-
程序文本
outputout;
regout;
always@(aorborsei)
begin
if(sel==0)out=a;〃阻塞賦值
elseout=b;
end
endmodule
【例5.9】非阻塞賦值
modulenon_block(c,b,a,clk);
outputc,b;
inputelk,a;
regc,b;
always@(posedgeelk)
begin
b<=a;
c<=b;
end
endmodule
【例5.10】阻塞賦值
moduleblock(c,b,a,clk);
outputc,b;
inputelk,a;
regc,b;
always@(posedgeelk)
begin
b=a;
c=b;
end
endmodule
【例5.11】模為60的BCD碼加法計(jì)數(shù)器
modulecount60(qout,cout,data,load,cin,reset,elk);
output。:0]qout;
outputcout;
input[7:0Jdata;
inputload,cin,elk,reset;
reg[7:0]qout;
always@(posedgeelk)//elk上升沿時(shí)刻計(jì)數(shù)
-6-
王金明:《VerilogHDL程序設(shè)計(jì)
教程》
begin
if(reset)qout<=0;〃同步復(fù)位
elseif(load)qout<=data;〃同步置數(shù)
elseif(cin)
begin
if(qoutl3:0J==9)//低位是否為9,是則
begin
qout[3:0J<=0;〃回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
assigncout=((qout==8'h59)&cin)?1:0;〃產(chǎn)生進(jìn)位輸出信號(hào)
endmodule
【例5.12】BCD碼一七段數(shù)碼管顯示譯碼器
moduledecode4_7(decodeout,indec);
output[6:0]decodeout;
input[3:0]indec;
reg[6:0]decodeout;
always@(indec)
begin
case(indec)〃用case語句進(jìn)行譯碼
4'dO:decodeout=7'bllllllO;
4,dl:decodeout=7'b0110000;
4'd2:decodeout=7'bll0U01;
4'd3:decodeout=7,bllll001;
4'd4:decodeout=7'b0110011;
4'd5:decodeout=7'b1011011;
4,d6:decodeout=7,bl011111;
4,d7:decodeout=7'bl110000;
4*d8:decodeout=7'bl111111;
4'd9:decodeout=7'bllll011;
default:decodeout=7*bx;
endcase
end
-7-
程序文本
endmodule
【例5.13】用casez描述的數(shù)據(jù)選擇器
modulemux_casez(out,a,b,c,d,select);
outputout;
inputa,b,c,d;
input[3:0]select;
regout;
always@(selectoraorborcord)
begin
casez(select)
4'b???1:out=a;
4'b??l?:out=b;
4'b?l??:out=c;
4161???:out=d;
endcase
end
endmodule
【例5.14】隱含鎖存器舉例
moduleburied_ff(c,b,a);
outputc;
inputb,a;
regc;
always@(aorb)
begin
if((b==1)&&(a==1))c=a&b;
end
endmodule
【例5.15】用for語句描述的七人投票表決器
modulevoter7(pass,vote);
outputpass;
input[6:0]vote;
reg[2:0]sum;
integeri;
regpass;
always@(vote)
begin
sum=0;
-8-
王金明:《VerilogHDL程序設(shè)計(jì)
教程》
for(i=0;i<=6;i=i+1)//for語句
if(vote[i])sum=sum+l;
if(sum[2])pass=l;〃若超過4人贊成,則pass=l
elsepass=O;
end
endmodule
【例5.16]用for語句實(shí)現(xiàn)2個(gè)8位數(shù)相乘
modulemult_for(outcome,a,b);
parametersize=8;
input[size:l]a,b;〃兩個(gè)操作數(shù)
output[2*size:1]outcome;〃結(jié)果
reg[2*size:l]outcome;
integeri;
always@(aorb)
begin
outcome=0;
for(i=1;i<=size;i=i+l)//for語句
if(b[i])outcome=outcome+(a?(i-1));
end
endmodule
【例5.17】用repeat實(shí)現(xiàn)8位二進(jìn)制數(shù)的乘法
modulemult_repeat(outcome,a,b);
parametersize=8;
input[size:l]a,b;
output[2*size:lloutcome;
reg[2*size:l]temp_a,outcome;
reg[size:l]temp_b;
always@(aorb)
begin
outcome=0;
temp_a=a;
temp_b=b;
repeat(size)“repeat語句,size為循環(huán)次數(shù)
begin
if(temp_bll])〃如果temp_b的最低位為1,就執(zhí)行下面的加法
outcome=outcome+temp_a;
temp_a=temp_a?1;〃操作數(shù)a左移一位
-9-
程序文本
temp_b=temp_b?1;〃操作數(shù)b右移一位
end
end
endmodule
【例5.18】同一循環(huán)的不同實(shí)現(xiàn)方式
moduleloop1;〃方式1
integeri;
initial
for(i=0;i<4;i=i+1)//for語句
begin
$display(tti=%h,\i);
end
endmodule
moduleloop2;〃方式2
integeri;
initialbegin
i=0;
while(i<4)//while語句
begin
Sdisplay("i=%h”,i);
i=i+l;
end
end
endmodule
moduleloop3;//方式3
integeri;
initialbegin
i=0;
repeat(4)//repeat語句
begin
Sdisplay("=%h”,i);
i=i+l;
end
end
endmodule
【例5.19]使用了、include語句的16位加法器
-10-
王金明:《VerilogHDL程序設(shè)計(jì)
教程》
"include"adder.v'*
moduleadder!6(cout,sum,a,b,cin);
outputcout;
parametermy_size=16;
output[my_size-1:0]sum;
input[my_size-l:O]a,b;
inputcin;
addermy_adder(cout,sum,a,b,cin);〃調(diào)用adder模塊
endmodule
〃下面是adder模塊代碼
moduleadder(cout,sum,a,b,cin);
parametersize=16;
outputcout;
output[size-l:0]sum;
inputcin;
input[size-l:O]a,b;
assign{cout,sum}=a+b+cin;
endmodule
【例5.20】條件編譯舉例
modulecompile(out,A,B);
outputout;
inputA,B;
、ifdefadd〃宏名為add
assignout=A+B;
"else
assignout=A-B;
'endif
endmodule
【例6.1】加法計(jì)數(shù)器中的進(jìn)程
modulecount(data,elk,reset,load,cout,qout);
outputcout;
output[3:0]qout;
reg[3:01qout;
input[3:0]data;
inputelk,reset,load;
-11-
程序文本
always@(posedgeelk)//進(jìn)程1.always過程塊
begin
if(!reset)qout=4'h00;〃同步清0,低電平有效
elseif(load)qout=data;〃同步預(yù)置
elseqout=qout+1;//加法計(jì)數(shù)
end
assigncout=(qout=二4'hf)?l:0;〃進(jìn)程2,用持續(xù)賦值產(chǎn)生進(jìn)位信號(hào)
endmodule
【例6.2】任務(wù)舉例
modulealutask(code,a,b,c);
inputll:0]code;
input[3:0]a,b;
output[4:0Jc;
reg[4:0]c;
taskmy_and;〃任務(wù)定義,注意無端口列表
input[3:0]a,b;〃a,b,out名稱的作用域范圍為task任務(wù)內(nèi)部
output[4:0Jout;
integeri;
begin
for(i=3;i>=0;i=i-l)
out[i]=a[i]&b[i];〃按位與
end
endtask
always?(codeoraorb)
begin
case(code)
2,b00:my_and(a,b,c);
/*調(diào)用任務(wù)my_and,需注意端口列表的順序應(yīng)與任務(wù)定義中的一致,這里的
a,b,c
分別對(duì)應(yīng)任務(wù)定義中的a,b,out*/
2b01:c=alb;〃或
2'bl0:c=a-b;//相減
2'bl1:c=a+b;〃相加
endcase
end
endmodule
-12-
王金明:《VerilogHDL程序設(shè)計(jì)
教程》
【例6.3】測試程序
'include"alutask.v"
modulealu_tp;
reg[3:O]a,b;
reg[l:O]code;
wire[4:0]c;
parameterDELY=100;
alutaskADD(code,a,b,c);〃調(diào)用被測試模塊
initialbegin
code=4*d0;a=4*b0000;b=4^1111;
#DELYcode=4'd0;a=4'b0111;b=4'bll01;
#DELYcode=4'd1;a=4'b0001;b=4fb0011;
#DELYcode=4'd2;a=4'b1001;b=4^0011;
#DELYcode=4'd3;a=4,50011;b=4*50001;
#DELYcode=4'd3;a=4'b0111;b=4*61001;
#DELY$finish;
end
initial$monitor($time,?ncode=%ba=%bb=%bc=%b",code,a,b,c);
endmodule
【例6.4】函數(shù)
function[7:0]getO;
input[7:0]x;
reg[7:0]count;
integeri;
begin
count=0;
for(i=0;i<=7;i=i+l)
if(x[i]=l'bO)count=count+1;
getO=count;
end
endfunction
【例6.5]用函數(shù)和case語句描述的編碼器(不含優(yōu)先順序)
modulecode_83(din,dout);
input[7:0]din;
output[2:0]dout;
-13-
程序文本
functionf2:0]code;〃函數(shù)定義
input[7:0]din;〃函數(shù)只有輸入,輸出為函數(shù)名本身
casex(din)
8,blxxx_xxxx:code=3'h7;
8,b01xx_xxxx:code=3'h6;
8'b001x_xxxx:code=3*h5;
8'b0001_xxxx:code=3'h4;
8'b0000_lxxx:code=3'h3;
8'b0000_01xx:code=3'h2;
8,b0000_001x:code=3'hl;
S'bOOOO.OOOx:code=3'hO;
default:code=3'hx;
endcase
endfunction
assigndout=code(din);〃函數(shù)調(diào)用
endmodule
【例6.6】階乘運(yùn)算函數(shù)
modulefunct(clk,n,result,reset);
output[31:0]result;
input[3:0]n;
inputreset,elk;
reg[31:0]result;
always@(posedgeelk)〃在elk的上升沿時(shí)執(zhí)行運(yùn)算
begin
if(!reset)result<=0;//復(fù)位
elsebegin
result<=2*factorial(n);〃調(diào)用factorial函數(shù)
end
end
functional:。]factorial;〃階乘運(yùn)算函數(shù)定義(注意無端口列表)
inputl3:0]opa;〃函數(shù)只能定義輸入端,輸出端口為函數(shù)名
本身
reg[3:0]i;
begin
factorial=opa?1:0;
for(i=2;i<=opa;i=i+1)〃該句若要綜合通過,。pa應(yīng)賦具體的數(shù)值
factorial=i*factorial;〃階乘運(yùn)算
end
-14-
王金明:《VerilogHDL程序設(shè)計(jì)教
程》
endfunction
endmodule
【例6.7】測試程序
'defineclk_cycle50
"include"funct.v”
modulefunct_tp;
reg[3:0]n;
regreset,elk;
wire[31:0]result;
initial〃定義激勵(lì)向量
begin
n=0;reset=1;clk=O;
for(n=0;n<=15;n=n+1)
#100n=n;
end
initial$monitor($time,?"n=%dresult=%d",n,result);
〃定義輸出顯示格式
always#'clk_cycleelk二?elk;〃產(chǎn)生時(shí)鐘信號(hào)
functfunct_try(.clk(clk),.n(n),.result(result),.reset(reset));
〃調(diào)用被測試模塊
endmodule
【例6.8]順序執(zhí)行模塊1
moduleseriall(q,a,elk);
outputq,a;
inputelk;
regq,a;
always@(posedgeelk)
begin
q=~q;
a=?q;
end
endmodule
【例6.9]順序執(zhí)行模塊2
moduleserial2(q,a,clk);
outputq,a;
-15-
程序文本
inputelk;
regq,a;
always@(posedgeelk)
begin
a=~q;
q=~q;
end
endmodule
【例6.10】并行執(zhí)行模塊1
moduleparall(q,a,clk);
outputq,a;
inputelk;
regq,a;
always@(posedgeelk)
begin
q=~q;
end
always@(posedgeelk)
begin
a=~q;
end
endmodule
【例6.11】并行執(zhí)行模塊2
moduleparal2(q,a,clk);
outputq,a;
inputelk;
regq,a;
always@(posedgeelk)
begin
a=~q;
end
always@(posedgeelk)
begin
q=~q;
end
endmodule
【例7.1】調(diào)用門元件實(shí)現(xiàn)的4選1MUX
-16-
王金明:《VerilogHDL程序設(shè)計(jì)
教程》
modulemux4_1a(out,in1,in2,in3,in4,cntrl1,cntrl2);
outputout;
inputin1,in2,in3,in4,cntrl1,cntr!2;
wirenotcntrl1,notcntr12,w,x,y,z;
not(notcntrll,cntrl2),
(notcntrl2,cntrl2);
and(w,in1,notcntrl1,notcntr!2),
(x,in2,notcntrl1,cntrl2),
(y,in3,cntrl1,notcntr!2),
(z,in4,cntrl1,cntrl2);
or(out,w,x,y,z);
endmodule
【例7.2]用case語句描述的4選1MUX
modulemux4_lb(out,inl,in2,in3,in4,cntrll,cntrl2);
outputout;
inputin1,in2,in3,in4,cntrll,cntrl2;
regout;
always@(iniorin2orin3orin4orcntrllorcntrl2)
case({cntrll,cntrl2))
2'b00:out=in1;
2'b01:out二in2;
2,bl0:out=in3;
2,bll:out=in4;
default:out=2*bx;
endcase
endmodule
【例7.3]行為描述方式實(shí)現(xiàn)的4位計(jì)數(shù)器
modulecount4(clk,clr,out);
inputclk,clr;
output[3:0]out;
reg[3:0]out;
always@(posedgeelkorposedgeclr)
begin
if(clr)out<=0;
elseout<=out+l;
end
endmodule
-17-
程序文本
【例7.4】數(shù)據(jù)流方式描述的4選1MUX
modulemux4_lc(out,in1,in2,in3,in4,cntrl1,cntrl2);
outputout;
inputin1,in2,in3,in4,cntrl1,cntrl2;
assignout=(inl&-cntrll&-cntrl2)l(in2&-cntrll&cntrl2)l
(in3&cntrl1&~cntrl2)l(in4&cnlrl1&cntrl2);
endmodule
【例7.5】用條件運(yùn)算符描述的4選1MUX
modulemux4_ld(out,inI,in2,in3,in4,cntrl1,cntrl2);
outputout;
inputin1,in2,in3,in4,cntrl1,cntrl2;
assignout=cntrl1?(cntr12?in4:in3):(cntrl2?in2:inl);
endmodule
【例7.6】門級(jí)結(jié)構(gòu)描述的2選1MUX
modulemux2_la(out,a,b,sel);
outputout;
inputa,b,sel;
not(sel_,sel);
and(al,a,sel_),
(a2,b,sel);
or(out,al,a2);
endmodule
【例7.7]行為描述的2選1MUX
modulemux2_1b(out,a,b,sel);
outputout;
inputa,b,sel;
regout;
always@(aorborsei)
begin
if(sel)out=b;
elseout=a;
end
endmodule
【例7.8】數(shù)據(jù)流描述的2選1MUX
moduleMUX2_lc(out,a,b,sel);
outputout;
-18-
王金明:《VerilogHDL程序設(shè)計(jì)
教程》
inputa,b,sel;
assignout=sei?b:a;
endmodule
【例7.9】調(diào)用門元件實(shí)現(xiàn)的1位半加器
modulehalf_add1(a,b,sum,cout);
inputa,b;
outputsum,cout;
and(cout,a,b);
xor(sum,a,b);
endmodule
【例7.10]數(shù)據(jù)流方式描述的1位半加器
modulehalf_add2(a,b,sum,cout);
inputa,b;
outputsum,cout;
assignsum=aAb;
assigncout=a&b;
endmodule
【例7.11]采用行為描述的1位半加器
modulehalf_add3(a,b,sum,cout);
inputa,b;
outputsum,cout;
regsum,cout;
always@(aorb)
begin
case({a,b})〃真值表描述
2'b00:beginsum=O;cout=0;end
2*b01:beginsum=1;cout=0;end
2*bl0:beginsum=1;cout=0;end
2*b11:beginsum=O;cout=1;end
endcase
end
endmodule
【例7.12]采用行為描述的1位半加器
modulehalf_add4(a,b,sum,cout);
inputa,b;
outputsum,cout;
-19-
程序文本
regsum,cout;
always@(aorb)
begin
sum=aAb;
cout=a&b;
end
endmodule
【例7.13】調(diào)用門元件實(shí)現(xiàn)的1位全加器
modulefull_add1(a,b,cin,sum,cout);
inputa,b,cin;
outputsum,cout;
wiresi,ml,m2,m3;
and(ml,a,b),
(m2,b,cin),
(m3,a,cin);
xor(slab),
(sum,sl,cin);
or(cout,m1,m2,m3);
endmodule
【例7.14]數(shù)據(jù)流描述的1位全加器
modulefull_add2(a,b,cin,sum,cout);
inputa,b,cin;
outputsum,cout;
assignsum=aAbAcin;
assigncout=(a&b)l(b&cin)l(cin&a);
endmodule
【例7.15】1位全加器
modulefull_add3(a,b,cin,sum,cout);
inputa,b,cin;
outputsum,cout;
assign{cout,sum}=a+b+cin;
endmodule
【例7.16】行為描述的1位全加器
modulefull_add4(a,b,cin,sum,cout);
inputa,b,cin;
outputsum,cout;
-20-
王金明:《VerilogHDL程序設(shè)計(jì)
教程》
regsum,cout;〃在always塊中被賦值的變量應(yīng)定義為reg型
regml,m2,m3;
always@(aorborcin)
begin
sum=(aAb)Acin;
ml=a&b;
m2=b&cin;
m3=a&cin;
cout=(mllm2)lm3;
end
endmodule
【例7.17】混合描述的1位全加器
modulefull_add5(a,b,cin,sum,cout);
inputa,b,cin;
outputsum,cout;
regcout,mI,m2,m3;〃在always塊中被賦值的變量應(yīng)定義為reg型
wiresi;
xorxl(sl,a,b);〃調(diào)用門元件
always@(aorborcin)//always塊語句
begin
ml=a&b;
m2=b&cin;
m3=a&cin;
cout=(milm2)Im3;
end
assignsum=siAcin;//assign持續(xù)賦值語句
endmodule
【例7.18]結(jié)構(gòu)描述的4位級(jí)連全加器
'include"fulLaddl.v1'
moduleadd4_l(sum,cout,a,b,cin);
output[3:0]sum;
outputcout;
input[3:0]a,b;
inputcin;
full_add1fO(a[O],b[O],cin,sum[O],cin1);〃級(jí)連描述
full_add1fl(a[l],b[l],cinl,sum[l],cin2);
full_add1f2(a[2],b[2],cin2,sum[2],cin3);
-21-
程序文本
fulLaddlf3(a[3],b[3],cin3,sum[3],cout);
endmodule
【例7.19]數(shù)據(jù)流描述的4位全加器
moduleadd4_2(cout,sum,a,b,cin);
output[3:0]sum;
outputcout;
input[3:0]a,b;
inputcin;
assign{cout,sum}=a+b+cin;
endmodule
【例7.20】行為描述的4位全加器
moduleadd4_3(cout,sum,a,b,cin);
outputl3:0Jsum;
outputcout;
inputl3:0]a,b;
inputcin;
reg[3:0]sum;
regcout;
always@(aorborcin)
begin
{cout,sum}=a+b+cin;
end
endmodule
【例8.1】$time與$代@山10已的區(qū)別
'timescale10ns/Ins
moduletime_dif;
regts;
parameterdelay=2.6;
initial
begin
#delayts=l;
#delayts=O;
#delayts=l;
#delayts=O;
end
initial$monitor($time,?,'ts=%b',,ts);〃使用函數(shù)$time
-22-
王金明:《VerilogHDL程序設(shè)計(jì)
教程》
endmodule
【例8.2】$random函數(shù)的使用
'timescale10ns/1ns
modulerandom_tp;
integerdata;
integeri;
parameterdelay=10;
initial$monitor($time,?',data=%b,',data);
initialbegin
for(i=0;i<=100;i=i+l)
#delaydata=$random;〃每次產(chǎn)生一個(gè)隨機(jī)數(shù)
end
endmodule
【例8.3】1位全加器進(jìn)位輸出UDP元件
primitivecarry_udp(cout,cin,a,b);
inputcin,a,b;
outputcout;
table
//cinab:cout〃真值表
0000;
010:0;
001:0;
Oil:1;
100:0;
101:1;
110:1;
111:1;
endtable
endprimitive
【例8.4】包含x態(tài)輸入的1位全加器進(jìn)位輸出UDP元件
primitivecarry_udpxl(cout,cin,a,b);
inputcin,a,b;
outputcout;
table
//cinab:cout〃真值表
000:0;
-23-
程序文本
010:0;
001:0;
011;
100:0;
101:1;
110:1;
111:1;
00x:0;〃只要有兩個(gè)輸入為0,則進(jìn)位輸出肯定為0
0x0:0;
x00:0;
11X:1;〃只要有兩個(gè)輸入為1,則進(jìn)位輸出肯定為1
1x1:1;
x11:1;
endtable
endprimitive
【例8.5]用簡縮符”?表述的1位全加器進(jìn)位輸出UDP元件
primitivecarry_udpx2(cout,cin,a,b);
inputcin,a,b;
outputcout;
table
//cinab:cout〃真值表
?00:0;〃只要有兩個(gè)輸入為0,則進(jìn)位輸出肯定為0
0?0:0;
00?:0;
?11:1;〃只要有兩個(gè)輸入為1.則進(jìn)位輸出肯定為1
1?
11?:1;
endtable
endprimitive
【例8.6】3選1多路選擇器UDP元件
primitivemux31(Y,inO,inI,in2,s2,sl);
inputinO,in1,in2,s2,s1;
outputY;
table
//inOiniin2s2sl:Y
0??00:0;〃當(dāng)s2sl=00時(shí),Y=in0
1??00:1;
?0?01:0;〃當(dāng)s2sl=01時(shí),Y=inl
-24-
王金明:《VerilogHDL程序設(shè)計(jì)教
程》
?1?01:1;
??01?:0;〃當(dāng)s2sl=1?時(shí),Y=in2
??111;
00?0?:0;
11?0?:1;
0?0?0:0;
1?1?0:1;
?00?1:0;
?11?1:1;
endtable
endprimitive
【例8.7】電平敏感的1位數(shù)據(jù)鎖存器UDP元件
primitivelatch(Q,elk,reset,D);
inputelk,reset,D;
outputQ;
regQ;
initialQ=rbl;〃初始化
table
//elkresetD:state:Q
?1?:?:0;//reset=l,則不管其他端口為什么值,輸出都為0
000:?:0;//clk=0,鎖存器把D端的輸入值輸出
001:?:1;
10?〃clk=l,鎖存器的輸出保持原值,用符號(hào)、”表示
endtable
endprimitive
【例8.8】上升沿觸發(fā)的D觸發(fā)器UDP元件
primitiveDFF(Q,D,clk);
outputQ;
inputD,clk;
regQ;
table
//elkD:state:Q
(01)0:?:0;〃上升沿到來,輸出Q=D
(01)1:?:1;
(Ox)1:1:1;
(Ox)0:0:0;
(?0)?:?:〃沒有上升沿到來,輸出Q保持原值
?(??):?:〃時(shí)鐘不變,輸出也不變
25-
程序文本
endtable
endprimitive
【例8.9]帶異步置1和異步清零的上升沿觸發(fā)的D觸發(fā)器UDP元件
primitiveDFF_UDP(Q,D,clk,clr,set);
outputQ;
inputD,clk,clr,set;
regQ;
table
//elkDclrset:state:Q
(01)100?9?0;
(01)10X?9?0;
9?0x:0:0;
(01)000?9?1;
(01)0X01;
9?x0:1:1;
(xl)100:0:0;
(xl)00
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣州科技職業(yè)技術(shù)大學(xué)《建筑學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 溫州肯恩大學(xué)《中學(xué)物理專題訓(xùn)練與研究》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025河北省安全員考試題庫及答案
- 德宏職業(yè)學(xué)院《新媒體概論》2023-2024學(xué)年第二學(xué)期期末試卷
- 2024-2025學(xué)年湖南省五市十校教研教改共同體高一上學(xué)期12月月考?xì)v史試卷
- 山東石油化工學(xué)院《工程結(jié)構(gòu)反分析理論》2023-2024學(xué)年第二學(xué)期期末試卷
- 德宏職業(yè)學(xué)院《國際法與當(dāng)代中國》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣東茂名農(nóng)林科技職業(yè)學(xué)院《互聯(lián)網(wǎng)+大學(xué)生創(chuàng)新創(chuàng)業(yè)設(shè)計(jì)與實(shí)踐》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025年山西省建筑安全員《A證》考試題庫
- 桂林山水職業(yè)學(xué)院《幼兒教師職業(yè)道德與專業(yè)發(fā)展》2023-2024學(xué)年第二學(xué)期期末試卷
- (課件)-幼兒園中班社會(huì)教案《新年里的開心事》
- 2025海南省交通投資控股限公司招聘30人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 宋代美學(xué)研究
- 行政管理學(xué)知識(shí)點(diǎn)全套
- 船舶安全管理培訓(xùn)課件
- 《工業(yè)機(jī)器人現(xiàn)場編程》課件-任務(wù)3.涂膠機(jī)器人工作站
- 供應(yīng)鏈管理(第2版)課件:常用的供應(yīng)鏈管理方法
- 腰椎手術(shù)的疑難討論
- 中英文對(duì)照版 ASTM B594 2019 鋁合金形變產(chǎn)品超聲波檢測標(biāo)準(zhǔn)慣例
- 五年級(jí)下冊(cè)道德與法治教學(xué)計(jì)劃
- 2025屆高考數(shù)學(xué)專項(xiàng)復(fù)習(xí):阿基米德三角形【六大題型】含答案
評(píng)論
0/150
提交評(píng)論