《Verilog-教程(第三版)夏闻宇-第三部分练习题答案(共11页).docx》由会员分享,可在线阅读,更多相关《Verilog-教程(第三版)夏闻宇-第三部分练习题答案(共11页).docx(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上Verilog-教程(第三版)夏闻宇-第三部分练习题答案专心-专注-专业1 设计一个字节(8位)的比较器,要求:比较两个字节的大小,如a7:0大于b7:0,则输出高电平,否则输出低电平;并改写测试模型,使其能进行比较全面的测试。模块源代码: 测试模块的源代码:timescale 1ns / 1psmodule t;reg 7:0 a;reg 7:0 b; reg clock;wire out;initial begina = 0;b = 0; clock=0;endalways #50 clock=clock;always (posedge clock) begina
2、=$random%256;b=$random%256; endinitial begin #1000 $stop;end compare uut (.out(out), .a(a), .b(b); endmodulemodule compare(out,a,b);input 7:0 a,b;output out;reg out;always (a or b) beginif(ab) out=1;else out=0;endendmodule仿真结果: 由图有:当a=8,b=8(即ab时),输出out为高电平;当a=8,b=8(即ab时),输出out为低电平,故满足要求。2.依然作clk_in的
3、2分频clk_out,要求输出时钟的相位与上面的1/2分频器的输出正好相反。编写测试模块,给出仿真波形。书上1/2分频器时序波形模块源代码: 测试模块源代码:timescale 1ns / 100psmodule top;reg clk;reg reset;wire clk_out; always #50 clk=clk;initial beginclk = 0;reset = 1;#10 reset=0;#110 reset=1;# $stop;endhalf_clk uut (.clk_in(clk), .reset(reset), .clk_out(clk_out);endmodulem
4、odule half_clk(clk_in,reset,clk_out);input clk_in,reset;output clk_out;reg clk_out;always (posedge clk_in)begin if(!reset) clk_out=1;else clk_out=clk_out;endendmodule 仿真波形:由上图可知clk_out的输出波形相位与前面输出波形相反。3. 利用10 MHZ的时钟,设计一个单周期形状的周期波形。分析:时钟信号f=10MHZ,分频1/20,f1=500KHZ时,j从0计到9(10个数)跳转完成半个周期,T0/2 =0.1us;图中可
5、把T分为三段即T1=T3=20us=200*0.1us(所以在T1阶段j要计200个数),而T2=10us可用延迟10000ns翻转达到。图中T=50us之后不显示,所以测试时到达50000ns时停止。故其模块源代码和测试模块源代码如下:模块源代码: 测试模块源代码:module fdivision(reset,F10M,F500K);input reset,F10M;output F500K;reg F500K;reg 7:0 j;always (posedge F10M) begin if(!reset) begin F500K=0; j=0; end else if(j=199) beg
6、in j=0;F500K=F500K;#10000 F500K=F500K; endelsej=j+1;endendmoduletimescale 1ns / 100psdefine clk_cycle 50module fdivision_Top;reg reset;reg F10M_clk;wire F500K_clk;always #clk_cycle F10M_clk=F10M_clk;initial beginreset = 1;F10M_clk = 0;#100 reset=0;#100 reset=1; #49800 $stop;/因为前面已经延迟了200个单位时间,再延迟498
7、00个单位时间到达50000ns。endfdivision uut (.reset(reset), .F10M(F10M_clk), .F500K(F500K_clk); endmodule仿真波形:4.在blocking模块中按如下两种写法,仿真与综合的结果会有什么样的变化?作出仿真波形,分析综合结果。always (posedge clk) begin c=b; b=a; endAlways (posedge clk) b=a;Always (posedge clk) c=b; module blocking_2(clk,a,b,c);input 3:0 a;input clk;outpu
8、t 3:0 b,c;reg 3:0 b,c;always (posedge clk) b=a;always (posedge clk) c=b;endmodulemodule blocking_1(clk,a,b,c);input 3:0 a;input clk;output 3:0 b,c;reg 3:0 b,c;always (posedge clk) begin c=b;b=a; endendmodule模块源代码: 模块源代码: 综合结果 综合结果由以上图形可知,其综合结果一样。其仿真图形如下所示:分析:当时钟上升沿来临,b1、b2的值一样都等于时钟上升沿到来前a的值,两种写法的区别在
9、于c值的不同。第一种写法c1的值等于前一个b1的值;第二种写法c2的值等于b2的值即c1比c2慢一个时钟信号周期。5.运用always块设计一个8路数据选择器。要求:每路输入数据与输出数据均为4位2进制数,当选择开关(至少3位)或输入数据发生变化时,输出数据也相应变化。模块源代码: 测试模块源代码:timescale 1ns / 1psmodule m;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;initial beg
10、ins=0;repeat(20)begin#100 i0=$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_1 uut (i0,i1,i2,i3,i4,i5,i6,i7,s,out);endmodulemodule select8_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)begin case(s)3b000: out=i0;3b001: out=i1;3b010: out=i2;3b011: out=i3;3b100: out=i4;3b101: out=i5;3b110: out=i6;3b111: out=i7;endcaseendendmodule仿真波形如下: