verilog源代码第89章例题.docx
《verilog源代码第89章例题.docx》由会员分享,可在线阅读,更多相关《verilog源代码第89章例题.docx(23页珍藏版)》请在冰点文库上搜索。
verilog源代码第89章例题
第八章语法概念总复习练习
1)以下给出了一个填空练习,请将所给各个选项根据电路图,填入程序中的适当位置。
标准答案:
moduleAOI(A,B,C,D,F);
inputA,B,C,D;
outputF;
assignF=((A&B)&(C&D));
endmodule
2〕
在这一题中,我们将作有关层次电路的练习,通过这个练习,你将加深对模块间调用时,管脚间连接的理解。
假设已有全加器模块FullAdder,若有一个顶层模块调用此全加器,连接线分别为W4,W5,W3,W1和W2。
请在调用时正确地填入I/O的对应信号。
moduleFullAdder(A,B,Cin,Sum,Cout);
inputA,B,Cin;
outputSum,Cout;
endmodule
moduleTop.....
FullAdderFA(,//W1
//W2
//W3
//W4
);//W5
endmodule
标准答案:
moduleTop...
FullAdderFA(.Sum(W1),//W1
.Cout(W2),//W2
.Cin(W3),//W3
.A(W4),//W4
.B(W5));//W5
endmodule
3)下面这道题是一个测试模块,因此没有输入输出端口,请将相应项填入合适的位置。
moduleTestFixture;
initial
begin
end
initial
endmodule
标准答案:
moduleTestFixture
regA,B,SEL;
wireF;
MUX2M(SEL,A,B,F);
initial
begin
SEL=0;A=0;B=0;
#10A=1;
#10SEL=1;#10B=1;
end
initial
$monitor(SEL,A,B,,F);
endmodule
4)指出下面几个信号的最高位和最低位。
reg[1:
0]SEL;input[0:
2]IP;wire[16:
23]A;
标准答案:
MSB:
SEL[1]MSB:
IP[0]MSB:
A[16]
LSB:
SEL[0]LSB:
IP[2]LSB:
A[23]
5)P,Q,R都是4bit的输入矢量,下面哪一种表达形式是正确的。
1)inputP[3:
0],Q,R;
2)inputP,Q,R[3:
0];
3)inputP[3:
0],Q[3:
0],R[3:
0];
4)input[3:
0]P,[3:
0]Q,[0:
3]R;
5)input[3:
0]P,Q,R;
标准答案:
5)
6)请将下面选项中的正确答案填人空的方括号中。
1.(0:
2)2.(P:
0)3.(Op1:
Op2)4.(7:
7)5.(2:
0)6.(7:
0)
reg[7:
0]A;
reg[2:
0]Sum,Op1,Op2;
regP,OneBit;
initial
begin
Sum=Op1+Op2;
P=1;
A[]=Sum;
.....
end
标准答案:
5
7)请根据以下两条语句,从选项中找出正确答案。
7.1)reg[7:
0]A;
A=2'hFF;
1)8'b0000_00112)8'h033)8'b1111_11114)8'b11111111
标准答案:
1)、2)
7.2)reg[7:
0]B;
B=8'bZ0;
1)8'0000_00Z02)8'bZZZZ_0000
3)8'b0000_ZZZ04)8'bZZZZ_ZZZ0
标准答案:
4)
8)请指出下面几条语句中变量的类型。
8.1)assignA=B;
8.2)always#1
Count=C+1;
标准答案:
A(wire)B(wire/reg)Count(reg)C(wire/reg)
9)指出下面模块中Cin,Cout,C3,C5,的类型。
moduleFADD(A,B,Cin,Sum,Cout);
inputA,B,Cin;
outputSum,Cout;
....
endmodule
moduleTest;
...
FADDM(C1,C2,C3,C4,C5);
...
endmodule
标准答案:
Cin(wire)Cout(wire/reg)C3(wire/reg)C5(wire)
10〕在下一个程序段中,当ADDRESS的值等于5'b0X000时,问casex执行完后A和B的值是多少。
A=0;
B=0;
casex(ADDRESS)
5'b00?
?
?
:
A=1;
5'b01?
?
?
:
B=1;
5'b10?
00,5'b11?
00:
begin
A=1;
B=1;
end
endcase
标准答案:
A=1andB=0;
11)在下题中,事件A分别在10,20,30发生,而B一直保持X状态,问在50时Count的值是多少。
reg[7:
0]Count;
initial
Count=0;
always
begin
@(A)Count=Count+1;
@(B)Count=Count+1;
end
标准答案:
Count=1;
(这是因为当A第一次发生时,Count的值由0变为1,然后事件控制@(B)阻挡了进程。
)
12)在下题中initial块执行完后I,J,A,B的值会是多少。
reg[2:
0]A;
reg[3:
0]B;
integerI,J;
initial
begin
I=0;
A=0;
I=I-1;
J=I;
A=A-1;
B=A;
J=J+1;
B=B+1;
end
标准答案:
I=-1(整数可为负数)
J=0
A=7(A为reg型为非负数,又因为A为3位即为111)
B=8(在B=A时,B=0111,然后B=B+1,所以B=4’b1000)
13)在下题中,当V的值发生变化且为-1时,执行完always块后
Count的值应是多少?
reg[7:
0]V;
reg[2:
0]Count;
always@(V)
begin
Count=0;
while(~V[Count])
Count=Count+1;
end
标准答案:
Count=0;
14)在下题中循环执行完后,V的值是多少?
reg[3:
0]A;
regV,W;
integerK;
....
A=4'b1010;
for(K=2;K>=0;K=K-1)
begin
V=V^A[k];
W=A[K]^A[K+1];
end
标准答案:
V的值是它进人循环体前值的取反。
(因为V的值与0,1,0进行了异或,与1的异或改变了V的值。
)
15)在下题中,给出了几种硬件实现,问以下的模块被综合后可能是哪一种?
always@(posedgeClock)
if(A)
C=B;
1.不能综合。
2.一个上升沿触发器和一个多路器。
3.一个输入是A,B,Clock的三输入与门。
4.一个透明锁存器。
5.一个带clock有始能引脚的上升沿触发器。
标准答案:
2,5
16)在下题中,always状态将描述一个带异步Nreset和Nset输入端的上升沿触发器,则空括号内应填入什么,可从以下五种答案中选择。
always@()
if(!
Nreset)
Q<=0;
elseif(!
Nset)
Q<=1;
else
Q<=D;
1.negedgeNsetorposedgeClock
2.posedgeClock
3.negedgeNresetorposedgeClock
4.negedgeNresetornegedgeNsetorposedgeClock
5.negedgeNresetornegedgeNset
标准答案:
4
17)在下题中,给出了几种硬件实现,问以下的模块被综合后可能是哪一种?
1.带异步复位端的触发器。
2.不能综合或与预先设想的不一致。
3.组合逻辑。
4.带逻辑的透明锁存器。
5.带同步复位端的触发器。
1.always@(posedgeClock)
begin
A<=B;
if(C)
A<=1'b0;
end
标准答案:
5
2.always@(AorB)
case(A)
1'b0:
F=B;
1'b1:
G=B;
endcase
标准答案:
2
3.always@(posedgeAorposedgeB)
if(A)
C<=1'b0;
else
C<=D;
标准答案:
1
4.always@(posedgeClkornegedgeRst)
if(Rst)
A<=1'b0;
else
A<=B;
标准答案:
2(产生了异步逻辑)
18)在下题中,模块被综合后将产生几个触发器?
always@(posedgeClk)
begin:
Blk
regB,C;
C=B;
D<=C;
B=A;
end
1.2个寄存器B和D
2.2个寄存器B和C
3.3个寄存器B,C和D
4.1个寄存器D
5.2个寄存器C和D
标准答案:
2
19)在下题中,各条语句的顺序是错误的。
请根据电路图调整好它们的次序。
标准答案:
1)2)
regFF1,FF2,FF3;
always@(posedgeClock)
begin
Output=FF3;
FF3=FF2;
FF2=FF1;
FF1=Input;
end
regFF1,FF2,FF3;
always@(posedgeClock)
begin
FF1<=Input;
FF2<=FF1;
FF3<=FF2;
Output<=FF3;
end
20)根据左表中SEL与OP的对应关系,在右边模块的空括号中填入相应的值。
SEL:
OP
000:
1
001:
3casex(SEL)
010:
13'b():
OP=3;
011:
33'b():
OP=1;
100:
03'b():
OP=0;
101:
3endcase
110:
0
111:
3
标准答案:
casex(SEL)
3'bXX1:
OP=3;
3'b0X0:
OP=1;
3'b1X0:
OP=0;
endcase
21)在以下表达式中选出正确的.
1)4'b1010&4'b1101=1'b1
2)~4'b1100=1'b1
3)!
4'b1011||!
4'b0000=1'b1
4)&4'b1101=1'b1
5)1b'0||1b'1=1'b1
6)4'b1011&&4'b0100=4'b1111
7)4'b0101<<1=5'b01011
8)!
4'b0010is1'b0
9)4'b0001||4'b0000=1'b1
标准答案:
3),5),8),9)
22)在下一个模块旁的括号中填入display的正确值。
integerI;
reg[3:
0]A;
reg[7:
0]B;
initial
begin
I=-1;A=I;B=A;
$display("%b",B);()
A=A/2;
$display("%b",A);()
B=A+14
$diaplay("%d",B);()
A=A+14;
$display("%d",A);()
A=-2;I=A/2;
$display("%d",I);()
end
标准答案:
I=-1;A=I;B=A;
$display("%b",B);(00001111)
A=A/2;
$display("%b",A);(0111)
B=A+14
$diaplay("%d",B);(21)
A=A+14;
$display("%d",A);(5)(A为4位,所以21被截为5)
A=-2;I=A/2;
$display("%d",I);(7)(A=-2,则是1110)
23)请问{1,0}与下面哪一个值相等。
1).2'b012).2'b103).2'b00
4).64'H0000000000025).64'H0000000100000000
标准答案:
5
(位拼接运算符必须指明位数,若不指明则隐含着为32位的二进制数[即整数]。
)
24)根据下题给出的程序,确定应将哪一个选项填入尖括号内。
1.defs.Reset2."defs.v".Reset
3.M.Reset4.Reset
1标准答案:
1
(模块间调用时,若引用其他模块定义的参数,要加上其他模块名,做为这个参数的前缀。
)
moduleM
'include"defs.v"
....
if(OP==)
Bus=0;
endmodule
2.标准答案:
4
parameterReset=8'b10100101;(Filedefs.v)
moduleM
'include"defs.v"
....
if(OP==)
Bus=0;
endmodule
25)如果调用Pipe时,想把Depth的值变为8,问程序中的空括号内应填入何值?
ModulePipe(IP,OP)
parameterOption=1;
parameterDepth=1;
...
endmodule
Pipe()P1(IP1,OP1);
标准答案:
#(1,8)
(其中1对应参数Option,8对应参数Depth.)
26)若想使P1中的Depth的值变为16,则应向空括号中填入哪个选项。
modulePipe(IP,OP);
parameterOption=1;
parameterDepth=1;
…………
endmodule
module
PipeP1(IP1,OP1);
();
endmodule
1.defparamP1.Depth=16;
2.parameterP1.Depth=16;
3.parameterPipe.Depth=16;
4.defparamPipe.Depth=16;
标准答案:
1
(用后缀改变引用模块的参数要用defparam及用本模块名作为引用参数的前缀,如p1.Depth。
)
27)如果我们想在Test的monitor语句中观察Count的值,则在空括号中应填入什么?
ModuleTest
TopT();
initial
$monitor()
endmodule
moduleTop;
BlockB1();
BlockB2();
endmodule
moduleBlock;
CounterC();
endmodule
moduleCounter;
reg[3:
0]Count;
....
endmodule
标准答案:
T.B1.C.CountorTest.T.B1.C.Count
28)下题中用initial块给reg[7:
0]V符值,请指明每种情况下V的8位都是什值。
这道题说明在数的表示时,已标明字宽的数若用XZ表示某些位,只有在最左边的X或Z具有扩展性。
第九章设计和验证例题
[例1]用基本逻辑单元组成触发器。
(文件名为:
flop.v)
moduleflop(data,clock,clear,q,qb);
inputdata,clock,clear;
outputq,qb;
nand#10nd1(a,data,clock,clear),//注意结束时用逗号,最后才用分号
nd2(b,ndata,clock),//表示nd1到nd8都是nand(与非门)
nd4(d,c,b,clear),
nd5(e,c,nclock),
nd6(f,d,nclock),
nd8(qb,q,f,clear);
nand#9nd3(c,a,d),
nd7(q,e,qb);
not#10iv1(ndata,data),
iv2(nclock,clock);
endmodule
图9.1.2.D型主从触发器的电路结构图
1)flopf1op_d(d1,clk,clrb,q,qn);
2)flopflop_d(.clock(clk),.q(q),.clear(clrb),.qb(qn),.data(d1));
[例2]用触发器组成带清零端的四位寄存器。
(文件名为:
hardreg.v)
`include"flop.v"
modulehardreg(d,clk,clrb,q);
inputclk,clrb;
input[3:
0]d;
output[3:
0]q;
flopf1(d[0],clk,clrb,q[0],),//注意结束时用逗号,最后才用分号
f2(d[1],clk,clrb,q[1],),//表示f1到f4都是flop
f3(d[2],clk,clrb,q[2],),
f4(d[3],clk,clrb,q[3],);
endmodule
[例3]用行为描述的方法来描述带请零端的四位寄存器。
(文件名为:
hardreg.v)
modulehardreg(d,clk,clrb,q);
inputclk,clrb;
input[3:
0]d;
output[3:
0]q;
reg[3:
0]q;
always@(posedgeclkorposedgeclrb)
begin
if(clrb)
q<=0;
else
q<=d;
end
endmodule
[例4]对四位带清零端的寄存器进行全面的测试。
(文件名为:
hardreg_top.v)
`include"flop.v"
`include"hardreg.v"//仿真时需要包含文件"hardreg.v"和"flop.v"
/***如果仿真环境可以把有关的文件安排在一个项目中,只要底层模块经过编译,并记录在编译的库中,可以不用包含文件。
**/
modulehardreg_top;//顶层模块,没有输入和输出的端口
regclock,clearb;//为产生测试用的时钟和清零信号需要寄存器
reg[3:
0]data;//为产生测试用数据需要用寄存器
wire[3:
0]qout;//为观察输出信号需要从模块实例端口中引出线
`definestim#100data=4'b//宏定义stim,可使源程序简洁
eventend_first_pass;//定义事件end_first_pass
hardregreg_4bit(.d(data),.clk(clock),.clrb(clearb),.q(qout));
/************************************************************************
把本模块中产生的测试信号data、clock、clearb输入实例reg_4bit以观察输出信号qout。
实例reg_4bit实际上是已经设计好的模块hardreg。
实例引用的hardreg模块,根据包含文件的不同,可以是表示行为的模块也可以是表示结构的模块。
***********************************************************************/
initial
begin
clock=0;
clearb=1;
end
always#50clock=~clock;
always@(end_first_pass)
clearb=~clearb;
always@(posedgeclock)
$display("attime%0dclearb=%bdata=%dqout=%d",
$time,clearb,data,qout);
/*****************************************************
类似于C语言的printf语句,可打印不同时刻的信号值
******************************************************/
initial
begin
repeat(4)//重复四次产生下面的data变化
begin
data=4'b0000;
`stim0001;
/***************************************************************
宏定义stim引用,等同于#100data=4'b0001;。
注意引用时要用`符号。
****************************************************************/
`stim0010;
`stim0011;
`stim0100;
`stim0101;
.
.
.
`stim1110;
`stim1111;
#200->end_first_pass;
end
/***********************************************
延迟200个单位时间,触发事件end_first_pass
************************************************/
$finish;//结束仿真
end
endmodule