Verilog的135個(gè)經(jīng)典設(shè)計(jì)實(shí)例_第1頁(yè)
Verilog的135個(gè)經(jīng)典設(shè)計(jì)實(shí)例_第2頁(yè)
Verilog的135個(gè)經(jīng)典設(shè)計(jì)實(shí)例_第3頁(yè)
Verilog的135個(gè)經(jīng)典設(shè)計(jì)實(shí)例_第4頁(yè)
Verilog的135個(gè)經(jīng)典設(shè)計(jì)實(shí)例_第5頁(yè)
已閱讀5頁(yè),還剩147頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論