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