Verilog HDL数字设计与综合(第二版)习题答案.docx
1 .互旌开关is由以下元件Ia成,一个共享存传善(MEM),一个系跳控制暑(SC)和一个数得妙开关(Xbar).a.使用关键字module和endmodule定义模块MEM.SC和Xbar不需要定义模块的内容,并且假设模块没行端I列表,b.使用关健字module和endmodule定义横块is.在IS中网用(实例引用)mem.SC和Xbar模块,井杷它们分别命名为meml,Sd和*barl.不辐要定义模块的内容,并且假设模块没有端口列表。C.使用关健字module和endmodule定义激励块(Top).ToP根块中调用IS模块,将其命名(或称实例化、具体化)Risl.誉tmoduleMEM;endxxlulemoduleSC;CndmodulemoduleXbar;cnd11xiulc11xxiuleIS;MEMmemI;SCscl:XbarxbarkendmodulemoduleTOP:ISisl:endmodule2 .一个四位Ik动进位加法由4个一位全加IMa成a.定义模块FA,不需要定义模块内容和端口列农.b.定义模块RippljAdd,不霜要定义模块内容和缆口列表,在模块中调用4个FA类型的全加器.把它们分别命名为fa,thl白2和仿3。密moduleFA:CndmodulemoduleRippIeSdchFAfa:FAfakFAfa2:ft3:c. ,个名为c。Um的整数:d. 一个名为MK4h3的时间变峡;e. 一个名为dcla的数姐.该数祖中包含20个ir11cgcr类型的元素:f.含有256个字的存储器MEM.每个字的字长为64位:g.,个(ft为512的参数cache.size告I定义如下:a. wire|7:0a_in;b. reg(31address=,d3;c. integercount:d. timesnap_shoi;¢.integer<fc)ays(0J9);f. reg|63:0|MEM10:255;g. parameterCaChC_sizc=512:5,下面各条语句的出结果是什么?a. Iaich=4'd12;Sdisplay('Thecurrentvalueoflatch=%b'n.latch);b. in_rcg=3'd2;Smonitor(Slime,*I11registervalue=%bn",in-eg2);c. defineMEM_SIZE1024SdisplayC,Thcmaximummemorysizeis%h',MEN1.SlZE);警:仿真输出结果如卜a#Thecurrentvalueoflatch三1100ffb#Olnregistervalue=OlO*c#Thenuixiinuinmemorysizeis.00000400注就1 .本邂中的变51默认为长度正好相符.比如IatCh=4'dl2就相当于rcg(3:0latch.2 .b中的Siime代送时间,根据给in,reg这个寄存器以值时间而变化,比如在第5秒对ineg进行赋值,就会显示;W5lnregistervalue=0101 .模块的茶本tfl成部分,鼻较?鼻几个部分必须出现?答,模块的基本组成部分包括:关键字module.模块名、墙口列发、娴口声明和可选的参数声明.模块内部还有5个基本组成部分是:变量声明、数据流语句、低层模块实例、行为语句块以及任务和函数,在根块的所有姐成部分中.只有module、根块幺和end11odule必须出现,其他部分都是可选的.用户可以根据设计的需要随意选用.2 .一个不与外部环境交互的模块是否有口?模块定义中是否有列表?答,产格意义上讲,一个模块如果号外界次行任何IZ1.那么自然是不IK要有而且是不Ul能行M口的.在没有端口的情况下.端口列农力然也是不存在的.3 .一个4位并行移位寄存的1/。引脚加下图所示.写出模软、hlfCreli的定义,只需写出口列赛和"口定义,不必耳出接块的内部结构.yJn(5>移也型以bAm"3hmrc£CioATUft>答,模块代码如下:moduleshift_rcg(c)uckfcrcgJn.rcg_ouO;inputclock:input(3:0regjn;output(3r_out;CndnlOdUIC4 .定义一个JI层模块stimulus,在其中声明regURECJN(4ft)和C1.KQ位)以及wireUREGX)UT(4位)在其中B用(实例引用)模块shW1.eg,实例名为srl,使用期口连接.答t模块代码如下moduleStimUhIs0;regC1.OCK;reg3:0)REGJN;wire(3:0REG.OUT;/*000wcin(Xder*mn.Shifkrcgsrl(C1.OCK.REGJN.REG.T);eulmodule5 .轿上Ji的口旌按方法改为命名连接.>1模块代码如下modulestimulus();regCl,OCK;reg(3:0|REG.1N;wire(3X)REG_OUT:/*4conncctbynamc""""Shif1.regsrl(.clock(CI.OCK),.reg_in(REGJN),.reg_(MH(REG_Oirr);endnoduk6 .写出REGJN,C1.K和REG.OUT的层次名答3分别是:$limulu$,REGNsiimulus.C1.Kslimulus.REG_0UT7 .写出模块实例旖1及其*cock和仙的层次名答.分别是SSlinWIUSSiistimulusfl.clockStimuIus.Sr1.rcgJnstimulus.rcg.out1.利用双入的nand门,用VBilog一耳自己的双入*的与门、Je门和非门.把它们分别命名为myrmy_and和my_not,并显过激Jft模块IME这些门的功能等,'timescale)nsns*>:*拳瓢*m,andj*modulemy_and(in1.in2.out):inputinljn2:OUIPIHout;wireOUlI;*5t*拿嘉f!*!*ny*拿嘉f!*>!*5t*:/京分*拿京*拿/modulemy.not(in.out);inputin:outputOU1;nandnl(oul.in,in);nandal(out.outl.outl);nania2(oul,inl,i112);euim(Mulecndmcxiulctex/*»*:*»:*:*会*3*4my_(>r净%4冬冬号4*24*C号*XC才号*modulemyor(inljn2.out);翻*宾*熊北#*:*:*/module此si;rcga,b;inputinljn2;outputul;WirCOUllQUt2:wirea(xi_c.or_c.iMK_c;initialbeginnandolout,utl,ou2);a<三0b<=0;nando2(outl.inljnl);nando3(out2.in2.in2):#10a<=0;b<=l;#10a<=l:b<=0:#10a<=l:b<=l:endmoduleWIOSs<op;#10<=hy<=0;#10<=lzy<=l;#10Sstop:endmy_xormyxor(x.y.z):endnuxiule其中“h和CJn为入,sum和JcHIt为tth只使用与门、11.非门实现一个一位全加辑写出其VSik>g描述,是每个门多只能有四个入写激励模块对其功旗行检查.并对全部的入融合进行试等,在前面的课程中己钱学习过位全加黑的相关知识,位全加密的电路如卜所示:按此电路图,采用门级描述代码如下,IimcscalcJns1InsInodIlICfu)1.add(a.bx_in,um.c_oul);inputa.b.c_in:outputsum,c-out;wire$1,«2.*3M,7,*6,s7;nand(s1.a.b);nand(s2,a.sl);nand(s3,b.sl);nand(s4.s2.s3);nand(s5.s4.cjn);上IB两个习题中书作杼用“"表示反播他用"J表示与黑体。评杼注nand(s6.s4.s5);nand(s7.s5.cjn);nand(sum,s6.s7);nand(c_ou(,s5,sl);CndinodulcInOdUletes(53:rcgi1.bx-,in;wiresum,c-out;ini(i<lbegina<=0zb<=0x-in<=0;#10a<=O;b<=O;c_in<=1;#10a<=0it=I;c_in<=0;#10a<=(hb<=lxjn<=l:#10a<=1:b<=0;c_in<=0;*IOa<=I;b<=O;c_in<=I;H10a<=Ix=1;cJn<=O;H10a<=Ix=1;c_in<=1;#1()Ss<op:endinitialSmonitor(Stimc.,'a='ob.b=%b.cJn=%b.sum=%b.c-out=%b”.a.b.jin«sum.JoUU:FuI1.addfiidd<a,b.c_in,sum.c_oul);cndinodulc输出的数据和波形:# Qa=0.b=O.c-in=0.sum=O.c-out=O# IQa=0.b=O,c_tn=1.sum=Isqut=O# 20a=0,b三l,cjn三O,sum=l,c-out=OM3Q*=0.b=1.cJn=1.sum=O.c-out=1# 40a=l.b=O.cjn=0.sum=1.c-ou(=O# 5Qa=l.b=O.c-,in=l.sum=O,c-out=I# 6Qa=1.b=1,cjn三0,sum=O,c-out=I答:代码如下'UnwscdeInsHnsrnudukrny-rs(ree<,MM.qbar);inputrcscijct;OlHPIIlq.qtxr;norW(I)nandI(qgel.qbar);norff1)nal2(qbar.sct.q);Cndmodulcmoduletcst54;regset,reset;wireq.qkr;initialbeginSeK=OirescK=I;#10sci<=0;rcsct<=0:Aloyy=1:ZJieK=0;#)0sct<=krcsct<=l:endmy_n»rsl(rcscl.sct.q.qbar);niliulSmonitor(Stin>e,',se=%b,nese-%b,q=%b,qbar-%b,.se(jeset,q,qhar);UlMlmodUIe测试输出文件Osel=Ojcsel=lq=x.qb<r=NIsci=().rcsc=l.q=0,qbar=x氐I=OJH=1.q=O.qbar=1IQsct=O,rcsct=O,q=O.qbar=I20Sel=1.reset=0,q-O,qba-I21set=I.reset=O.q=O.qbar=O22Sey!.reset=O,q-1,qbar=O30SCl=I.reset=l.q=1.qbar=O31yI=1.resel=I.q=O.qbar=O门b】和b2的廷迟说明如下所示,最小便典出值最大值上升延迟123下降延迟345美断延迟567在设计完成后,写出激励模块对其迸行仿典.答,代码如下*ti11cscalcln!nsmodulemux2l(ou(,in0.in1.$);inpulin.inl;inputs:outputout:bull(O1:2:3.3:4:5.5:6:7)bl(oul.inO,s):bufifl#(1:2:3,3:4:5,5:6:7)b2(ou1.inl.s):endmodukmoduletcst55:reginOJnl;regs;wireout;initialbegininO<=OJnl<=ks<=l;# 100inO<=OJnl<=ks<=O;# 100in<=hinl<=0s<三l;# 1OOin<=l;inl<=0;s<=0;# 100Sstop:endmux2lmy-nux(ul.in.in1.s);initialSmonior(S(ine.,inO>%bjnl=%b,s三%b,out=%bajnjnl.s1ou;cndmcxiulefi出波形和数据# OifU)=OJnl三hs三1.out=x# 6i110=0tinl=1.s=1.out=I# 100inO=O.inl=1.s=O.out=1# 1(MinO=O.inl=IS=O.out=x# IO6i>O=OJnI三IS=O,oUl=O# 30x=0,y=I=I1B=1.D=O# 40x=l.y=0j-=0.B=0.D=1# 50x=l.y=0,z=I.B=0.D=0# 60x=i.y=Iji=0.B=0.D=0# 70x=l.y=Ijj=I1B=1.D=I2.大小比较器的功能是比较两个数之间的关系:大于、小于或等于,一个四位大小比较零的输入是两个四位数A和B我In可以将它的写成下面的形式,用左边的位为及高有效位:A=(3)(2>A(I)-A(O)B=B(3)B(2)B(I)-B(O)两个数的比较可以从始高有效依开始.逐位进行。如果两个位不相等,则该位值为0的数为较小的数-为了用逻辑等式实现这个功能.我们需要定义个中间变Iftx.注意下面实现的是同或(xnor)的功能.(i)=A(i)B(i)+A(i)'B(t),大小比较岩的三个输出为:AY1.B.A1.B和A_cq_B.其计算公式为:A_gt_B=A(3>B(3),+x(3)A(2)B(2),+x(3)x(2)A(I)B(l)+x(3)x(2)x(l)A(O)B(O)'A_h_B=A(3),-B(3)*x(3)A(2),B(2)+x(3)x(2)-A(l),B(l)+x(3)x(2)-x(l)-A(0),B(O)A_cq_B=x(3)x(2)x(l)x(O)写出模块magnitude->mparaor的VerilOg猫迷.写出激励模块并在模块中实例引IlJmagnitude.Compamor桢块.选择A和B的儿种俎令,对模块的功能进行测试,答,代码以及测试激励:(imcscalcInSylnSIwdulcIparator(.X,B.AgtB.AltB.Acq.B):input|3:0A.B;ou(plAY1.BwirexO.xl.x2.x3:assignx0=(A(0)&(B(0D)K(!A|01)&(?B(0|);assignxl=(A(i)A(B(ID)KCAlI)(B(I);assignx2=«A(2J)&(B(2)K(!A(2)&(!B(2J»assignx3=(A(3|>&(B(3|)K(!A|3J)&(!BP|):assign=(Al3J&(!B(3|)|(x3&A2J&(!B|2J)|(x3&x2&A(lJ&(!B(IJ)|(x3&x2&xl&A(0|&(!B0).=(!A3)B3DKx3(!A>&B2DH(x3&x2&(!AU)&BUDKx3&x2&xl&<!A0)&B0D.A_cq_B=x3&x2&x1&xO;fuIladdmyfa(sum,cout,a»b,cin);initialbegin$Retinports(*topl31.myfa*);endCndrnodule2 .编写一个用户自定义系统任务SCOUn1.andnaics该任务计算模块实例中的的数目模块实例的层次名称是该任务的输入C调用这个任务来计算例5.5中的四选,多路选样器中的与“数目。答:VCrilOg代码如下:(IedUICnux4to1(out.i.il,i2.i3.si,s);outputout;inputi.il,i2,i3;inputS1.S0;wiresin.sn:wirey,yl,y2,y3;not(sin.si);not(sn.s);and(yai*slnsn);and(yllii>sln,sn);and(y2.i2.sl.s):and(y3,i3,sl,s);or(out,y,ylly2,y3);endmodulenoduletop!3_2;ireout;regi.il.i2,i3:regsi,s;tuxllo_lny_«ux(out,i,il,i2,i3.si,s>:initialbegin$count_andgates(*top13_2,ny-ux*);endendmodule3 .创隹一个用户白定义系统任务SnionilormodHHPUl,该任务使找出模块实例的所有输IH信号,并把它们渗加到一个监视列表中。当模块的任何输出信号值改变时都应该出现文字“。1ItpmsignalhasChangCd”(提示,使用VC1.子程序).使用例13.1中的二选多路选择落.通过SmOnik>jmod_ompui把输出信号添加到监视列衣中,施加激附,检进结果.答:VerilOg代码如下.nodulemux2_to1(out.i,il.s):outputout:inputi.il;inputs:*ireSbor,yl,y2;notnl(sbar,s);andal(y1.i.sbar):anda2(y2,il,s);orol(outvyl.y2);endmodu1et×iuletop!3_3;Wireout;regi.il;regs;rwx2to1nymux21(out,i,i1»s);initialbeginSnonitornodoutput(*topl33,nymux21*);endCndmOdUIe仿真输出如下# OOutputsignaltop133.nymux21.ihaschangedO# OOutpulsignaltopi33.ny11ux21.i1haschangedIMOOutpu(signaltopl33.ny11ux21.sh<wchangedOH100utputsignaltopl33,nymux21,Shaschanged1# 20Outputsignaltop133.nymux21.ihaschanged1# 20Outtsignaltop133.nxmux21.i1haschangedOM200UIPUlsignaltop133.nynux21.shaschangedOH300UtPIHsignaltopl33,nymux21,shaschanged1I.例6.5中使用RT1.描述定义了个超而进位的四位全加器.使用身边现有的工艺博综合谈全t11l8,优化电路,使我达到破快速度。把同样的激励施加到RT1.和门缎图表上,比较它们的输出。答,测试模块,mlukwire(3:0|sum;wirec-out;reg|3:0|a,b;rcgc_in;integeri;initialbeginfor(i=0i<16ui+!)begin#10a=i;b=i;c_in=0;#10a=i:b=ixJn=l;end#IOSs(op;endfulladd4(JMd(SIIm,joui,强,b,jin);end11)duk原有仿真输出(前仿真卜综合之后的输出(后仿式):从图中可见,后仿式多加入了一些延迟。附带一个说明,下面两个图分别是面积域小和速度用快的时候两个输出结果.速度M快:面积址小:2.一位全城器有3个输入xy和z(前面的借位)以及两个输出D(差)和B(借位),D和B的逻辑等式如下:D三XyZ÷x*yz'÷x>,z,XyZB=y+x,z÷yz为全器编写VCrik>gRT1.描述,使用身边现有的任何工艺库综合该全液器,优化电路,使其达到鼓快速度把同样的激励应用到RT1.和门级网衣上.比较它们的输出答:代码:modulefull_sub(x,y,z.D,B);inputx.y.z;outputD.B;assignD=«!x)&(!y)&(z)l|«!x)&y&(!z)e(x&(!y)&(!z)IKx&y&z);assignBNeX成y)K(!、成,cndmodulc测试输入:modulel4_2;regN.*;wireD.B;initialbeginx<=0:y<=0:z<=0;#10x<=0zy<=0zz<=k# 10x<=0;y<=|;z<=0;# 10x<=0;y<=1;z<=l;# 10<=hy<=0zz<=0;# 10x<=ly<=0z<=k# 10<三hy<三z<=O;# 10x<=l;y<=l;z<=k# 10Ssop;endfull.subfsblra<(ertx.ykz,D.B);initialSmonitortSlinwJtX=%b,y=%b,z=%b.B=%b.D=%b*x,yfcz,B,D);Cndmodulc前仿真波形:场仿典波形:3.使用VeribgRT1.描述设计个3-8详码溜给译码瑞梭供3位输入刮2:0.译码器的输出是UW7:0,由42:0|家中到的输出位的值是1,其他位是0。使用身边现有的任何工艺库媒合该年码涔优化电路,使其面枳及小把河样的激励应用到RT1.和门级网表比较它的的输出.答,代码和测试激励如下Smodulede-COd(OUIH:OUIpUi(7:0ou;input(2:0|a;rcg(7:OJout;always(八)beginCaSC(八)3,MX)0:OUt=81)0000JMKM:3,MX)I:our8,M)0,00l0;3,bOIO:oul=8W)000J)100;3,bOII:(HH=Sb(X)OOJOOO:3,bl()0:out=8bOOO1.OOO():3,blOI:M=8H)010_0000;3,bl10:Qgrbolo(1.ooOO;3,b)11:out=8bl0-0(X)0:default:OiH=8bO(KX)OO(X);exicaseendCndmodUkmoduleU4一3;wire7mil;reg|2:0|a;dca>ddl(out.a):initialbegina=3,M)00:#10a=3,M)01;#10a=3,b010;# 10a=3t>01l;# 10a=3ZOO:# 10a=3,bll;# 10a=3*NI0;# 10a=3,blll:# 10a三3T>72z;endcndmodulc前仿ft后伪典:4,为四位:进制i数器编写VBik>gRT1.描述,该H数器带个高电平外效的同步复位端(提示X(史用带(以PosCdgCCIOek)语句的always循环)使用身边现有的任何1.艺库综合该计数器.优化电路,使其面枳最小.把同样的激励应用到RT1.门级网衣上,比较它们的输出.答:代码和激励:modulecounter(Mit,ckxk,reset)inilpul3ul;inputClOCk.reset:reg(3:0|out:always(ptwedgeclock)ift!rcscout=(hRKeUUl=IHl1+1;Cndmodulcmduk114_4;wire3#out:regclocktrese;countcr4c4(out.ckkjese<):initialMinclock=Ojee(=l;# 2031=0:# 20reset=1;# 200Ssop;endalways#5CloCk二YlOCk;end11xiuk前仿典:后伪W:工使用同步有限状态自动机方法设计一个电路,它在引脚M按殳,位的输入S1.衽当检测到模式Iolol时,输出引脚match被赋假为高电平,NWl用脚以同步方式初始化电路,输入引脚Clk用于给电路提供时怦信号.使用身边现有的任何工艺库粽合该电路,优化电路,使其达到取快速度.把同样的激励应用到RT1.和门级网衣上.比较它们的输出.后仿典输出:可见,后个match的1值由于延迟,在图中己羟看不到了.