国外经典Verilog代码.docx

上传人:b****8 文档编号:9315658 上传时间:2023-02-04 格式:DOCX 页数:84 大小:33.53KB
下载 相关 举报
国外经典Verilog代码.docx_第1页
第1页 / 共84页
国外经典Verilog代码.docx_第2页
第2页 / 共84页
国外经典Verilog代码.docx_第3页
第3页 / 共84页
国外经典Verilog代码.docx_第4页
第4页 / 共84页
国外经典Verilog代码.docx_第5页
第5页 / 共84页
点击查看更多>>
下载资源
资源描述

国外经典Verilog代码.docx

《国外经典Verilog代码.docx》由会员分享,可在线阅读,更多相关《国外经典Verilog代码.docx(84页珍藏版)》请在冰豆网上搜索。

国外经典Verilog代码.docx

国外经典Verilog代码

/**

*Examplesfrom"TheVerilogHardwareDescriptionLanguage",*

*byD.E.ThomasandP.R.Moorby*

**/

 

//Example1.2.NANDLatchToBeSimulated.

moduleffNand;

wireq,qBar;

regpreset,clear;

nand#1

g1(q,qBar,preset),

g2(qBar,q,clear);

initial

begin

//twoslashesintroduceasinglelinecomment

$monitor($time,,

"Preset=%bclear=%bq=%bqBar=%b",

preset,clear,q,qBar);

//waveformforsimulatingthenandflipflop

#10preset=0;clear=1;

#10preset=1;

#10clear=0;

#10clear=1;

#10$finish;

end

endmodule

 

//Example1.4.A16-BitCounter.

modulem16(value,clock,fifteen,altFifteen);

output[3:

0]value;

outputfifteen,

altFifteen;

inputclock;

dEdgeFFa(value[0],clock,~value[0]),

b(value[1],clock,value[1]^value[0]),

c(value[2],clock,value[2]^&value[1:

0]),

d(value[3],clock,value[3]^&value[2:

0]);

assignfifteen=value[0]&value[1]&value[2]&value[3];

assignaltFifteen=&value;

endmodule

 

//Example1.5.AD-TypeEdge-TriggeredFlipFlop.

moduledEdgeFF(q,clock,data);

outputq;

regq;

inputclock,data;

initial

q=0;

always

@(negedgeclock)#10q=data;

endmodule

 

//Example1.6.AClockFortheCounter.

modulem555(clock);

outputclock;

regclock;

initial

#5clock=1;

always

#50clock=~clock;

endmodule

 

//Example1.7.TheTop-LevelModuleoftheCounter.

moduleboard;

wire[3:

0]count;

wireclock,

f,

af;

m16counter(count,clock,f,af);

m555clockGen(clock);

always@(posedgeclock)

$display($time,,,"count=%d,f=%d,af=%d",count,f,af);

endmodule

 

//Example1.8.TheCounterModuleDescribedWithBehavioralStatements.

modulem16Behav(value,clock,fifteen,altFifteen);

output[3:

0]value;

reg[3:

0]value;

outputfifteen,

altFifteen;

regfifteen,

altFifteen;

inputclock;

initial

value=0;

always

begin

@(negedgeclock)#10value=value+1;

if(value==15)

begin

altFifteen=1;

fifteen=1;

end

else

begin

altFifteen=0;

fifteen=0;

end

end

endmodule

 

//Example1.9.TopLeveloftheFibonacciNumberGenerator.

moduletop();

wireflag,numProduced,numConsumed;

wire[15:

0]number,numberOut;

nandLatchready(flag,,numConsumed,numProduced);

numberGenng(number,numProduced,flag);

fibNumberGenfng(number,flag,numConsumed,numberOut);

endmodule

 

//Example1.10.ANANDLatch.

modulenandLatch(q,qBar,set,reset);

outputq,qBar;

inputset,reset;

nand#2

(q,qBar,set),

(qBar,q,reset);

endmodule

 

//Example1.11.TheSeed-NumberGenerator.

modulenumberGen(number,numProduced,flag);

output[15:

0]number;

outputnumProduced;

inputflag;

regnumProduced;

reg[15:

0]number;

initial

begin

number=3;

numProduced=1;

end

always

begin

wait(flag==1)

#100number=number+1;

numProduced=0;

#10numProduced=1;

end

endmodule

 

//Example1.12.TheFibonacciNumberGeneratorModule.

modulefibNumberGen(startingValue,flag,numConsumed,fibNum);

input[15:

0]startingValue;

inputflag;

outputnumConsumed;

output[15:

0]fibNum;

regnumConsumed;

reg[15:

0]myValue;

reg[15:

0]fibNum;

initial

begin

numConsumed=0;

#10numConsumed=1;

$monitor($time,,

"fibNum=%d,startingValue=%d",

fibNum,startingValue);

end

always

begin

wait(flag==0)

myValue=startingValue;

numConsumed=0;

#10numConsumed=1;//signalreadyforinput

for(fibNum=0;myValue!

=0;myValue=myValue-1)

fibNum=fibNum+myValue;

$display("%d,fibNum=%d",$time,fibNum);

end

endmodule

 

//Example2.1.ADivideModule.

moduledivide(ddInput,dvInput,quotient,go,done);

parameter

DvLen=15,

DdLen=31,

QLen=15,

HiDdMin=16;

input[DdLen:

0]ddInput;

input[DvLen:

0]dvInput;

output[QLen:

0]quotient;

inputgo;

outputdone;

reg[DdLen:

0]dividend;

regdone;

reg[QLen:

0]quotient;

regnegDivisor,

negDividend;

reg[DvLen:

0]divisor;

always

begin

done=0;

wait(go);

divisor=dvInput;

dividend=ddInput;

quotient=0;

if(divisor)

begin

negDivisor=divisor[DvLen];

if(negDivisor)

divisor=-divisor;

negDividend=dividend[DdLen];

if(negDividend)

dividend=-dividend;

repeat(DvLen+1)

begin

quotient=quotient<<1;

dividend=dividend<<1;

dividend[DdLen:

HiDdMin]=

dividend[DdLen:

HiDdMin]-divisor;

if(!

dividend[DdLen])

quotient=quotient+1;

else

dividend[DdLen:

HiDdMin]=

dividend[DdLen:

HiDdMin]+divisor;

end

if(negDivisor!

=negDividend)

quotient=-quotient;

end

done=1;

wait(~go);

end

endmodule

 

//Example2.5.TheMark-1ProcessorWithIf-Else-If.

modulemark1;

reg[31:

0]m[0:

8191];//8192x32bitmemory

reg[12:

0]pc;//13bitprogramcounter

reg[31:

0]acc;//32bitaccumulator

reg[15:

0]ir;//16bitinstructionregister

always

begin

ir=m[pc];//fetchaninstruction

if(ir[15:

13]==3'b000)//begindecoding

pc=m[ir[12:

0]];//andexecuting

elseif(ir[15:

13]==3'b001)

pc=pc+m[ir[12:

0]];

elseif(ir[15:

13]==3'b010)

acc=-m[ir[12:

0]];

elseif(ir[15:

13]==3'b011)

m[ir[12:

0]]=acc;

elseif((ir[15:

13]==3'b101)||(ir[15:

13]==3'b100))

acc=acc-m[ir[12:

0]];

elseif(ir[15:

13]==3'b110)

if(acc<0)pc=pc+1;

#1pc=pc+1;//incrementprogramcounterandtime

end

endmodule

 

//Example2.6.TheMark-1WithaCaseStatement.

modulemark1Case;

reg[31:

0]m[0:

8191];//8192x32bitmemory

reg[12:

0]pc;//13bitprogramcounter

reg[31:

0]acc;//32bitaccumulator

reg[15:

0]ir;//16bitinstructionregister

always

begin

ir=m[pc];

case(ir[15:

13])

3'b000:

pc=m[ir[12:

0]];

3'b001:

pc=pc+m[ir[12:

0]];

3'b010:

acc=-m[ir[12:

0]];

3'b011:

m[ir[12:

0]]=acc;

3'b100,

3'b101:

acc=acc-m[ir[12:

0]];

3'b110:

if(acc<0)pc=pc+1;

endcase

pc=pc+1;

end

endmodule

 

//Example2.8.TheMark-1WithaMultiplyInstruction.

modulemark1Mult;

reg[31:

0]m[0:

8191];//8192x32bitmemory

reg[12:

0]pc;//13bitprogramcounter

reg[31:

0]acc;//32bitaccumulator

reg[15:

0]ir;//16bitinstructionregister

always

begin

ir=m[pc];

case(ir[15:

13])

3'b000:

pc=m[ir[12:

0]];

3'b001:

pc=pc+m[ir[12:

0]];

3'b010:

acc=-m[ir[12:

0]];

3'b011:

m[ir[12:

0]]=acc;

3'b100,

3'b101:

acc=acc-m[ir[12:

0]];

3'b110:

if(acc<0)pc=pc+1;

3'b111:

acc=acc*m[ir[12:

0]];//multiply

endcase

#1pc=pc+1;

end

endmodule

 

//Example2.9.ATaskSpecification.

modulemark1Task;

reg[31:

0]m[0:

8191];//8192x32bitmemory

reg[12:

0]pc;//13bitprogramcounter

reg[31:

0]acc;//32bitaccumulator

reg[15:

0]ir;//16bitinstructionregister

always

begin

ir=m[pc];

case(ir[15:

13])

3'b000:

pc=m[ir[12:

0]];

3'b001:

pc=pc+m[ir[12:

0]];

3'b010:

acc=-m[ir[12:

0]];

3'b011:

m[ir[12:

0]]=acc;

3'b100,

3'b101:

acc=acc-m[ir[12:

0]];

3'b110:

if(acc<0)pc=pc+1;

3'b111:

multiply(acc,m[ir[12:

0]]);

endcase

pc=pc+1;

end

taskmultiply;

inout[31:

0]a;

input[31:

0]b;

reg[15:

0]mcnd,mpy;//multiplicandandmultiplier

reg[31:

0]prod;//product

begin

mpy=b[15:

0];

mcnd=a[15:

0];

prod=0;

repeat(16)

begin

if(mpy[0])

prod=prod+{mcnd,16'h0000};

prod=prod>>1;

mpy=mpy>>1;

end

a=prod;

end

endtask

endmodule

 

//Example2.10.AFunctionSpecification.

modulemark1Fun;

reg[31:

0]m[0:

8191];//8192x32bitmemory

reg[12:

0]pc;//13bitprogramcounter

reg[31:

0]acc;//32bitaccumulator

reg[15:

0]ir;//16bitinstructionregister

always

begin

ir=m[pc];

case(ir[15:

13])

3'b000:

pc=m[ir[12:

0]];

3'b001:

pc=pc+m[ir[12:

0]];

3'b010:

acc=-m[ir[12:

0]];

3'b011:

m[ir[12:

0]]=acc;

3'b100,

3'b101:

acc=acc-m[ir[12:

0]];

3'b110:

if(acc<0)pc=pc+1;

3'b111:

acc=multiply(acc,m[ir[12:

0]]);

endcase

pc=pc+1;

end

function[31:

0]multiply;

input[31:

0]a;

input[31:

0]b;

reg[15:

0]mcnd,mpy;

begin

mpy=b[15:

0];

mcnd=a[15:

0];

multiply=0;

repeat(16)

begin

if(mpy[0])

multiply=multiply+{mcnd,16'h0000};

multiply=multiply>>1;

mpy=mpy>>1;

end

end

endfunction

endmodule

 

//Example2.11.TheMultiplyasaSeparateModule.

modulemark1Mod;

reg[31:

0]m[0:

8191];//8192x32bitmemory

reg[12:

0]pc;//13bitprogramcounter

reg[31:

0]acc;//32bitaccumulator

reg[15:

0]ir;//16bitinstructionregister

reg[31:

0]mcnd;

reggo;

wire[31:

0]prod;

wiredone;

multiplymul(prod,acc,mcnd,go,done);

always

begin

go=0;

ir=m[pc];

case(ir[15:

13])

3'b000:

pc=m[ir[12:

0]];

3'b001:

pc=pc+m[ir[12:

0]];

3'b010:

acc=-m[ir[12:

0]];

3'b011:

m[ir[12:

0]]=acc;

3'b100,

3'b101:

acc=acc-m[ir[12:

0]];

3'b110:

if(acc<0)pc=pc+1;

3'b111:

begin

mcnd=m[ir[12:

0]];

go=1;

wait(done);

acc=prod;

end

endcase

pc=pc+1;

end

endmodule

modulemultiply(prod,mpy,mcnd,go,done);

output[31:

0]prod;

input[31:

0]mpy,mcnd;

inputgo;

outputdone;

reg[31:

0]prod;

reg[15:

0]myMpy;

regdone;

always

begin

done=0;

wait(go);

myMpy=mpy[15:

0];

prod=0;

repeat(16)

begin

if(myMpy[0])

prod=prod+{mcnd,16'h0000};

prod=prod>>1;

myMpy=myMpy>>1;

end

done=1;

wait(~go);

end

endmodule

 

//Example3.4.FibonacciNumberGeneratorUsingNamedEvents.

moduletopNE();

wire[15:

0]number,numberOut;

numberGenNEng(number);

fibNumberGenNEfng(number,numberOut);

endmodule

modulenumberGenNE(number);

output[15:

0]number;

re

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1