VerilogHDL数字设计与综合第二版第七章课后习题答案最新整理.docx
《VerilogHDL数字设计与综合第二版第七章课后习题答案最新整理.docx》由会员分享,可在线阅读,更多相关《VerilogHDL数字设计与综合第二版第七章课后习题答案最新整理.docx(10页珍藏版)》请在冰豆网上搜索。
VerilogHDL数字设计与综合第二版第七章课后习题答案最新整理
1.声明一个名为oscillate的寄存器变量并将它初始化为0。
使其每30个时间单位进行一次取反操作。
不要使用always语句。
提示:
使用forever循环。
答:
代码如下:
regoscillate;
initialbegin
oscillate<=0;
forever#30oscillate<=~oscillate;end
2.设计一个周期为40个时间单位的时钟信号,其占空比为25%。
使用always和initial块进行
设计。
将其在仿真0时刻的值初始化为0。
答:
代码如下:
regclock;initialclock<=0;
alwaysbegin
#30clock<=1;
#10clock<=0;end
3.给定下面含有阻塞过程赋值语句的initial块。
每条语句在什么仿真时刻开始执行?
a,b,c
4.
和d在仿真过程中的中间值和仿真结束时的值是什么?
答:
仿真输出结果:
5.在第3题中,如果initial块中包括的是非阻塞过程赋值语句,那么各个问题的答案是什么?
答:
最终d没有输出,因为d<=#20{a,b,c};语句执行的是先将a,b,c取值存储,在20个时间单位后将存储的值赋给d,因为b,c在初始时刻没有值,所以d值也是不确定的。
6.指出在下面的Verilog代码中各条语句的执行顺序。
其中是否含有不确定的执行顺序?
a,b,c
7.
和d的最终值是什么?
答:
先执行a=1’b0,b=1’b1,然后执行#0c=b,#0d=a,执行顺序不确定,最终输出结果a=0,b=1,c=1,d=0.
8.
在下面的例子中,d的最终值是什么?
答:
仿真输出波形如下,最终输出结果d=1。
0时刻b|c的值是1,在25个时间刻度后赋给d。
9.使用带有同步清零端的D触发器(清零端高电平有效,在时钟下降沿执行清零操作)设计一个下降沿触发的D触发器,只能使用行为语句。
提示:
D触发器的输出q应当声明为寄存器变量。
使用设计出的D触发器输出一个周期为10个时间单位的时钟信号。
答:
第七题和第八题参见chapter7.v
10.使用带有异步清零端的D触发器设计第7题中要求的D触发器(在清零端变为高电平后立即执行清零操作,无需等待下一个时钟下降沿),并对这个D触发器进行测试。
答:
第七题和第八题参见chapter7.v
11.使用wait语句设计一个电平敏感的锁存器,该锁存器的输入信号为d和clock,输出为q。
其功能是当clock=1时q=d。
答:
代码及输出波形如下:
modulemy_latch(d,clock,q);inputd,clock;
outputq;regq;always
wait(clock)begin
#1q<=d;//注意,这里的赋值语句前必须要加上#延迟,否则无法仿真。
endendmodule
moduletest79;
regd,clock;wireq;
initial
clock<=0;always
#10clock<=~clock;initial
begind<=1'b0;
#15d<=1'b1;
#50d<=1'b0;
#20$stop;end
my_latchmy_latch1(d,clock,q);endmodule
12.使用条件语句设计例7.19中的四选一多路选择器。
外部端口必须保持不变。
答:
代码如下(标注行可以去掉)
modulemux_41(out,i0,i1,i2,i3,s1,s0);inputi0,i1,i2,i3;
inputs0,s1;outputout;regout;
always@(*)if(s1==0&&s0==0)
out<=i0;
elseif(s1==0&&s0==1)
out<=i1;
elseif(s1==1&&s0==0)
out<=i2;
elseif(s1==1&&s0==1)
out<=i3;else
$display("Invalidcontrolsignals");//可去
endmodule11.使用条件语句对本章中的交通信号灯控制器进行重新设计。
答:
部分代码如下,其余代码与书中相同。
always@(state)begin
hwy=GREEN;cntry=RED;if(state==S1)
hwy=YELLOW;
elseif(state==S2)
hwy=RED;
elseif(state==S3)begin
hwy=RED;cntry=GREEN;
end
elseif(state==S4)begin
hwy=RED;cntry=YELLOW;
end
elsebegin
hwy=GREEN;cntry=RED;
end
end
always@(stateorX)begin
if(state==S0)begin
if(X)
next_state=S1;else
next_state=S0;
end
elseif(state==S1)begin
repeat(`Y2RDELAY)@(posedgeclock);next_state=S2;
end
elseif(state==S2)begin
repeat(`R2GDELAY)@(posedgeclock);next_state=S3;
end
elseif(state==S3)begin
if(X)
end
else
next_state=S3;next_state=S4;
elseif(state==S4)begin
repeat(`Y2RDELAY)@(posedgeclock);next_state=S0;
endelse
next_state=S0;
end
12.
使用case语句设计八功能的算术运算单元(ALU),其输入信号a和b均为4位,功能选择信号select为3位,输出信号out为5位。
算术运算单元ALU所执行的操作与select信号有关,具体关系见下表。
忽略输出结果中的上溢和下溢的位。
select信号功能
3'b000out=a
3'b001out=a+b
3'b010out=a-b
3'b011out=a/b
3'b100out=a%b(余数)
3'b101out=a<<1
3'b110out=a>>1
out=a>b(大小幅值比
答:
代码如下
3'b111较)
modulemy_ALU(a,b,select,out);input[3:
0]a,b;
input[2:
0]select;
output[4:
0]out;
reg[4:
0]out;
always@(*)case(select)
3'b000:
out=a;
3'b001:
out=a+b;
3'b010:
out=a-b;
3'b011:
out=a/b;
3'b100:
out=a%b;
3'b101:
out=a<<1;
3'b110:
out=a>>1;
3'b111:
out=a>b;
default:
out=5'b00000;endcase
endmodule
输出波形
13.使用while循环设计一个时钟信号发生器。
时钟信号的初值为0,周期为10个时间单位。
答:
代码如下
modules13;regclock;initial
begin
clock<=0;while
(1)
#5clock<=~clock;
#1000$stop;endendmodule
14.使用for循环对一个长度为1024(地址从0到1023)、位宽为4的寄存器类型数组cache_var
进行初始化,把所有单元都设置为0。
答:
简单的for语句
modules14;
reg[3:
0]cache_var[0:
1023];integercount;
initialfor(count=0;count<1024;count=count+1)
cache_var[count]=0;
endmodule
15.使用forever循环设计一个时钟信号,周期为10,占空比为40%,初值为0。
答:
modules15;regclock;initial
begin
clock<=0;foreverbegin
#6clock<=1;
#4clock<=0;end
endendmodule
16.使用repeat将语句a=a+1延迟20个时钟上升沿之后再执行。
答:
initialbegin
repeat(delay)@(posedgeclock)i<=i+1;a<=a+1;
end
17.下面是一个内嵌顺序块和并行块的块语句。
该块的执行结束时间是多少?
事件的执行顺序是怎样的?
每条语句的仿真结束时间是多少?
答:
仿真器输出如下,作为参考
#
0x=0,y=x,a=x,b=x,p=x,m=x
//x=1’b0
#
5x=0,y=1,a=x,b=x,p=x,m=x
//y=1’b1
#
20x=0,y=1,a=x,b=1,p=x,m=x
//b=y
#
25x=0,y=1,a=0,b=1,p=x,m=x
//a=x
#
65x=1,y=1,a=0,b=1,p=x,m=x
//x=1’b1
#
70x=1,y=1,a=0,b=1,p=x,m=1
//m=y
#
75x=1,y=1,a=1,b=1,p=1,m=1
//p=x
在时间75之后,还有#10a=y;#30b=x;语句,由于ab原有值是11,没有变化,故仿真器没有记录。
在#85执行a=y,在#105执行b=x。
全部结束的时间为#105
18.用forever循环语句、命名块和禁用命名块来设计一个八位计数器。
这个计数器从count=5
开始计数,到count=67结束计数。
每个时钟正跳变沿计数器加1。
时钟的周期为10。
计数
器的计数只用了一次循环,然后就被禁用了(提示:
使用disable语句)。
答:
参考代码如下。
modules18;regclock;
reg[7:
0]count;regflag;
initialbegin
count<=5;clock<=0;flag<=0;forever#5clock<=~clock;
end
always@(posedgeclock)begin
begin:
s18
count<=count+1;
end
if(count==8'b1000010)begin
flag<=1;disables18;
$display("Theend");#10$stop;
end
endendmodule
Attheend,XiaoBiangivesyouapassage.Minandoncesaid,"peoplewholearntolearnareveryhappypeople.".Ineverywonderfullife,learningisaneternaltheme.Asaprofessionalclericalandteachingposition,Iunderstandtheimportanceofcontinuouslearning,"lifeisdiligent,nothingcanbegained",onlycontinuouslearningcanachievebetterself.Onlybyconstantlylearningandmasteringthelatestrelevantknowledge,canemployeesfromallwalksoflifekeepupwiththepaceofenterprisedevelopmentandinnovatetomeettheneedsofthemarket.Thisdocumentisalsoeditedbymystudioprofessionals,theremaybeerrorsinthedocument,ifthereareerrors,pleasecorrect,thankyou!