您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > Verilog-教程(第三版)夏闻宇-第三部分练习题答案
1.设计一个字节(8位)的比较器,要求:比较两个字节的大小,如a[7:0]大于b[7:0],则输出高电平,否则输出低电平;并改写测试模型,使其能进行比较全面的测试。模块源代码:测试模块的源代码:仿真结果:由图有:当a=8'01100101,b=8'00010010(即ab时),输出out为高电平;当a=8'00000001,b=8'00001101(即ab时),输出out为低电平,故满足要求。2.依然作clk_in的2分频clk_out,要求输出时钟的相位与上面的1/2分频器的输出正好相反。编写测试模块,给出仿真波形。书上1/2分频器时序波形`timescale1ns/1psmodulet;reg[7:0]a;reg[7:0]b;regclock;wireout;initialbegina=0;b=0;clock=0;endalways#50clock=~clock;always@(posedgeclock)begina={$random}%256;b={$random}%256;endinitialbegin#1000$stop;endcompareuut(.out(out),.a(a),.b(b));endmodulemodulecompare(out,a,b);input[7:0]a,b;outputout;regout;always@(aorb)beginif(ab)out=1;elseout=0;endendmodule模块源代码:测试模块源代码:仿真波形:由上图可知clk_out的输出波形相位与前面输出波形相反。3.利用10MHZ的时钟,设计一个单周期形状的周期波形。分析:时钟信号f=10MHZ,分频1/20,f1=500KHZ时,j从0计到9(10个数)跳转完成半个周期,T0/2=0.1us;图中可把T分为三段即T1=T3=20us=200*0.1us(所以在T1阶段j要计200个数),而T2=10us可用延迟10000ns翻转达到。图中T=50us之后不显示,所以测试时到达50000ns时停止。故其模块源代码和测试模块源代码如下:modulehalf_clk(clk_in,reset,clk_out);inputclk_in,reset;outputclk_out;regclk_out;always@(posedgeclk_in)beginif(!reset)clk_out=1;elseclk_out=~clk_out;endendmodule`timescale1ns/100psmoduletop;regclk;regreset;wireclk_out;always#50clk=~clk;initialbeginclk=0;reset=1;#10reset=0;#110reset=1;#100000$stop;endhalf_clkuut(.clk_in(clk),.reset(reset),.clk_out(clk_out));endmodule模块源代码:测试模块源代码:仿真波形:4.在blocking模块中按如下两种写法,仿真与综合的结果会有什么样的变化?作出仿真波形,分析综合结果。⑴⑵⑴模块源代码:⑵模块源代码:modulefdivision(reset,F10M,F500K);inputreset,F10M;outputF500K;regF500K;reg[7:0]j;always@(posedgeF10M)beginif(!reset)beginF500K=0;j=0;endelseif(j==199)beginj=0;F500K=~F500K;#10000F500K=~F500K;endelsej=j+1;endendmodule`timescale1ns/100ps`defineclk_cycle50modulefdivision_Top;regreset;regF10M_clk;wireF500K_clk;always#`clk_cycleF10M_clk=~F10M_clk;initialbeginreset=1;F10M_clk=0;#100reset=0;#100reset=1;#49800$stop;//因为前面已经延迟了200个单位时间,再延迟49800个单位时间到达50000ns。endfdivisionuut(.reset(reset),.F10M(F10M_clk),.F500K(F500K_clk));endmodulealways@(posedgeclk)beginc=b;b=a;endAlways@(posedgeclk)b=a;Always@(posedgeclk)c=b;moduleblocking_1(clk,a,b,c);input[3:0]a;inputclk;output[3:0]b,c;reg[3:0]b,c;always@(posedgeclk)beginc=b;b=a;endendmodulemoduleblocking_2(clk,a,b,c);input[3:0]a;inputclk;output[3:0]b,c;reg[3:0]b,c;always@(posedgeclk)b=a;always@(posedgeclk)c=b;endmodule⑴综合结果⑵综合结果由以上图形可知,其综合结果一样。其仿真图形如下所示:分析:当时钟上升沿来临,b1、b2的值一样都等于时钟上升沿到来前a的值,两种写法的区别在于c值的不同。第一种写法c1的值等于前一个b1的值;第二种写法c2的值等于b2的值即c1比c2慢一个时钟信号周期。5.运用always块设计一个8路数据选择器。要求:每路输入数据与输出数据均为4位2进制数,当选择开关(至少3位)或输入数据发生变化时,输出数据也相应变化。模块源代码:测试模块源代码:仿真波形如下:moduleselect8_to_1(i0,i1,i2,i3,i4,i5,i6,i7,s,out);input[3:0]i0,i1,i2,i3,i4,i5,i6,i7;input[2:0]s;output[3:0]out;reg[3:0]out;always@(i0,i1,i2,i3,i4,i5,i6,i7,s)begincase(s)3'b000:out=i0;3'b001:out=i1;3'b010:out=i2;3'b011:out=i3;3'b100:out=i4;3'b101:out=i5;3'b110:out=i6;3'b111:out=i7;endcaseendendmodule`timescale1ns/1psmodulem;wire[3:0]out;reg[3:0]i0;reg[3:0]i1;reg[3:0]i2;reg[3:0]i3;reg[3:0]i4;reg[3:0]i5;reg[3:0]i6;reg[3:0]i7;reg[2:0]s;initialbegins=0;repeat(20)begin#100i0={$random}%15;i1={$random}%15;i2={$random}%15;i3={$random}%15;i4={$random}%15;i5={$random}%15;i6={$random}%15;i7={$random}%15;s=s+1;end#100$stop;endselect8_to_1uut(i0,i1,i2,i3,i4,i5,i6,i7,s,out);endmodule
本文标题:Verilog-教程(第三版)夏闻宇-第三部分练习题答案
链接地址:https://www.777doc.com/doc-1864809 .html