![Verilog的135個(gè)經(jīng)典設(shè)計(jì)實(shí)例_第1頁(yè)](http://file4.renrendoc.com/view3/M03/39/22/wKhkFmZM49KAY8pTAABLbzWElo0066.jpg)
![Verilog的135個(gè)經(jīng)典設(shè)計(jì)實(shí)例_第2頁(yè)](http://file4.renrendoc.com/view3/M03/39/22/wKhkFmZM49KAY8pTAABLbzWElo00662.jpg)
![Verilog的135個(gè)經(jīng)典設(shè)計(jì)實(shí)例_第3頁(yè)](http://file4.renrendoc.com/view3/M03/39/22/wKhkFmZM49KAY8pTAABLbzWElo00663.jpg)
![Verilog的135個(gè)經(jīng)典設(shè)計(jì)實(shí)例_第4頁(yè)](http://file4.renrendoc.com/view3/M03/39/22/wKhkFmZM49KAY8pTAABLbzWElo00664.jpg)
![Verilog的135個(gè)經(jīng)典設(shè)計(jì)實(shí)例_第5頁(yè)](http://file4.renrendoc.com/view3/M03/39/22/wKhkFmZM49KAY8pTAABLbzWElo00665.jpg)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
經(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;〃測(cè)試模塊的名字
reg[3:0]a,b;〃測(cè)試輸入信號(hào)定義為reg型
regcin;
wirel3:0Jsum;〃測(cè)試輸出信號(hào)定義為wire型
wirecout;
integeri,j;
adder4adder(sum,cout,a,b,cin);〃調(diào)用測(cè)試對(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;〃測(cè)試輸入信號(hào)定義為reg型
wire[3:0]out;//測(cè)試輸出信號(hào)定義為wire型
parameterDELY=100;
count4mycounl(out,reset,elk);〃調(diào)用測(cè)試對(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]“與域?非”門(mén)電路
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ù)類(lèi)型
assignF=?((A&B)I(C&D));〃邏輯功能描述
endmodule
【例5.1】用case語(yǔ)句描述的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過(guò)程語(yǔ)句描述的簡(jiǎn)單算術(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過(guò)程語(yǔ)句對(duì)測(cè)試變量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語(yǔ)句進(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語(yǔ)句描述的七人投票表決器
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語(yǔ)句
if(vote[i])sum=sum+l;
if(sum[2])pass=l;〃若超過(guò)4人贊成,則pass=l
elsepass=O;
end
endmodule
【例5.16]用for語(yǔ)句實(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語(yǔ)句
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語(yǔ)句,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語(yǔ)句
begin
$display(tti=%h,\i);
end
endmodule
moduleloop2;〃方式2
integeri;
initialbegin
i=0;
while(i<4)//while語(yǔ)句
begin
Sdisplay("i=%h”,i);
i=i+l;
end
end
endmodule
moduleloop3;//方式3
integeri;
initialbegin
i=0;
repeat(4)//repeat語(yǔ)句
begin
Sdisplay("=%h”,i);
i=i+l;
end
end
endmodule
【例5.19]使用了、include語(yǔ)句的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過(guò)程塊
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ù)定義,注意無(wú)端口列表
input[3:0]a,b;〃a,b,out名稱(chēng)的作用域范圍為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】測(cè)試程序
'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)用被測(cè)試模塊
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ǔ)句描述的編碼器(不含優(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ù)定義(注意無(wú)端口列表)
inputl3:0]opa;〃函數(shù)只能定義輸入端,輸出端口為函數(shù)名
本身
reg[3:0]i;
begin
factorial=opa?1:0;
for(i=2;i<=opa;i=i+1)〃該句若要綜合通過(guò),。pa應(yīng)賦具體的數(shù)值
factorial=i*factorial;〃階乘運(yùn)算
end
-14-
王金明:《VerilogHDL程序設(shè)計(jì)教
程》
endfunction
endmodule
【例6.7】測(cè)試程序
'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)用被測(cè)試模塊
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)用門(mén)元件實(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語(yǔ)句描述的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】門(mén)級(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)用門(mén)元件實(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)用門(mén)元件實(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)用門(mén)元件
always@(aorborcin)//always塊語(yǔ)句
begin
ml=a&b;
m2=b&cin;
m3=a&cin;
cout=(milm2)Im3;
end
assignsum=siAcin;//assign持續(xù)賦值語(yǔ)句
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]用簡(jiǎn)縮符”?表述的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;〃上升沿到來(lái),輸出Q=D
(01)1:?:1;
(Ox)1:1:1;
(Ox)0:0:0;
(?0)?:?:〃沒(méi)有上升沿到來(lái),輸出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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年圖書(shū)館知識(shí)問(wèn)答機(jī)器人行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢(xún)報(bào)告
- 杭州市書(shū)畫(huà)院租賃合同
- 二零二五年度半年租房合同簽訂與租賃雙方信息保密協(xié)議
- 船舶吊裝作業(yè)合同范文
- 綠色建筑材料采購(gòu)與供應(yīng)鏈管理協(xié)議
- 初中生校園安全故事征文
- 經(jīng)典寓言故事烏鴉喝水觀后感
- 工業(yè)互聯(lián)網(wǎng)平臺(tái)建設(shè)與運(yùn)營(yíng)合作框架協(xié)議
- 三字經(jīng)解讀傳統(tǒng)文化與智慧啟蒙
- 土壤修復(fù)及改良項(xiàng)目合作合同
- 天津市鄉(xiāng)鎮(zhèn)衛(wèi)生院街道社區(qū)衛(wèi)生服務(wù)中心地址醫(yī)療機(jī)構(gòu)名單
- 公司機(jī)關(guān)管理類(lèi)責(zé)任矩陣
- 山東省青島市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會(huì)明細(xì)及行政區(qū)劃代碼
- 《鉆井液用磺甲基酚醛樹(shù)脂技術(shù)要求》
- 數(shù)學(xué)-九宮數(shù)獨(dú)100題(附答案)
- 中國(guó)農(nóng)業(yè)發(fā)展銀行XX支行 關(guān)于綜合評(píng)價(jià)自評(píng)情況的報(bào)告
- 2010年宣武區(qū)第六屆中小學(xué)生地理知識(shí)競(jìng)賽題庫(kù)
- QC課題提高檢查井周邊壓實(shí)
- 應(yīng)征公民體格檢查表(征兵)
- ACL磁致伸縮液位計(jì)說(shuō)明書(shū)
- 慈善祖師—太乙救苦天尊經(jīng)文選集拼音版
評(píng)論
0/150
提交評(píng)論