最新verilog hdl答案.docx
- 文档编号:23141535
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:35
- 大小:219.23KB
最新verilog hdl答案.docx
《最新verilog hdl答案.docx》由会员分享,可在线阅读,更多相关《最新verilog hdl答案.docx(35页珍藏版)》请在冰豆网上搜索。
最新veriloghdl答案
第1章简介
1.VerilogHDL是在哪一年首次被IEEE标准化的?
VerilogHDL是在1995年首次被IEEE标准化的。
2.VerilogHDL支持哪三种基本描述方式
VerilogHDL可采用三种不同方式或混合方式对设计建模。
这些方式包括:
行为描述方式—使用过程化结构建模;数据流方式—使用连续赋值语句方式建模;结构化方式—使用门和模块实例语句描述建模
3.可以使用VerilogHDL描述一个设计的时序吗?
VerilogHDL可以清晰的建立时序模型,故可以使用VerilogHDL描述一个设计的时序。
4.语言中的什么特性能够用于描述参数化设计?
在行为级描述中,VerilogHDL不仅能够在RTL级上进行设计描述,而且能够在体系结
构级描述及其算法级行为上进行设计描述,而且能够使用门和模块实例化语句在结构级进行结构描述,这种特性可用于描述参数化设计。
5.能够使用VerilogHDL编写测试验证程序吗?
能,可以编写testbench来对编写的程序进行验证。
6.VerilogHDL是由哪个公司最先开发的?
VerilogHDL是由GatewayDesignAutomation公司最先开发的
7.VerilogHDL中的两类主要数据类型是什么?
线网数据类型和寄存器数据类型。
线网类型表示构件间的物理连线,而寄存器类型表示抽象的数据存储元件。
8.UDP代表什么?
UDP代表用户定义原语
9.写出两个开关级基本门的名称。
pmosnmos
10.写出两个基本逻辑门的名称。
andor
第2章HDL指南
1.在数据流描述方式中使用什么语句描述一个设计?
设计的数据流行为使用连续赋值语句进行描述
2.使用`timescale编译器指令的目的是什么?
举出一个实例。
使用编译指令将时间单位与物理时间相关联。
例如`timescale1ns/100ps此语句说明时延时间单位为1ns并且时间精度为100ps(时间精度是指所有的时延必须被限定在0.1ns内)
3.在过程赋值语句中可以定义哪两种时延?
请举例详细说明。
1)语句间时延:
这是时延语句执行的时延。
例:
Sum=(A^B)^Cin;
#4T1=A&Cin;
在第二条语句中的时延规定赋值延迟4个时间单位执行
2)语句内时延:
这是右边表达式数值计算与左边表达式赋值间的时延。
例:
Sum=#3(A^B)^Cin;
这个赋值中的时延意味着首先计算右边表达式的值,等待3个时间单位,然后赋值给Sum。
4.采用数据流描述方式描述图2-4中所示的1位全加器。
moduleFA_Seq(A,B,Cin,Sum,Cout);
inputA,B,Cin;
outputSum,Cout;
wireT1,T2,T3,S1;
assignT1=A&Cin;
assignT2=B&Cin;
assignT3=A&B;
assignS1=A^B;
assignSum=S1^Cin;
assignCout=(T1|T2)|T3;
endmodule
4.initial语句与always语句的关键区别是什么?
1)initial语句:
此语句只执行一次。
2)always语句:
此语句总是循环执行,或者说此语句重复执行。
6.写出产生图2-10所示波形的变量BullsEye的初始化语句。
`timescale1ns/1ns
moduleTest(BullsEye);
outputBullsEye;
regBullsEye;
initial
begin
BullsEye=0;
BullsEye=#21;
BullsEye=#10;
BullsEye=#91;
BullsEye=#100;
BullsEye=#21;
BullsEye=#30;
BullsEye=#51;
end
endmodule
7.采用结构描述方式描写图2-2中所示的2-4译码器。
moduleDecoder2x4(A,B,EN,Z);
inputA,B,EN;
output[0:
3]Z;
wireAbar,Bbar;
not
v0(Abar,A),
v1(Bbar,B);
nand
N0(Z[0],Abar,Bbar,EN),
N1(Z[1],Abar,B,EN),
N2(Z[2],A,Bbar,EN),
N3(Z[3],A,B,EN);
endmodule
8.为2.3节中描述的模块Decode2X4编写一个测试验证程序。
moduleTes;
regTA,TB,TEN;
wire[0:
3]TZ;
Decoder2x4DT2x4(TA,TB,TEN,TZ);
initial
begin
$monitor($time,"A=%b,B=%b,EN=%b,Z=%b",TA,TB,TEN,TZ);
end
initial
begin
TA=0;TB=0;TEN=0;
#5TA=1;TB=1;
#5TEN=1;
#5TA=0;TB=0;
#5TA=0;TB=1;
#5TA=1;TB=0;
end
endmodule
9.列出你在VerilogHDL模型中使用的两类赋值语句。
连续赋值语句assign,阻塞赋值语句=
10.在顺序过程中何时需要定义标记?
顺序过程内有局部声明的变量时,初始化语句中的顺序过程必须标记。
11.使用数据流描述方式编写图2-11所示的异或逻辑的VerilogHDL描述,并使用规定的时延。
moduleXORL(A,B,Z);
inputA,B;
outputZ;
wireAbar,Bbar,Z1,Z2;
assign#1Bbar=~B;
assign#1Abar=~A;
assign#5Z1=A&Bbar;
assign#5Z2=B&Abar;
assign#4Z=Z1|Z2;
endmodule
12.找出下面连续赋值语句的错误。
assignReset=#2^WriteBus;
不符合连续赋值语句的语法,应该为:
assign#2Reset=^WriteBus;
第3章Verilog语言要素
1.下列标识符哪些合法,哪些非法?
COunT,1_2Many,\**1,Real?
\wait,Initial
答:
COunT合法,1_2Many非法,\**1,Real?
非法,\wait合法,Initial合法
2.系统任务和系统函数的第一个字符标识是什么?
答:
$
3.举例说明文本替换编译指令?
答:
`define指令用于文本替换,它很像C语言中的#define指令,如:
`defineMAX_BUS_SIZE32
...
reg[`MAX_BUS_SIZE-1:
0]AddReg;
4.在VerilogHDL中是否有布尔类型?
答:
没有
5.下列表达式的位模式是什么?
7'o44位八进制数,'Bx0位二进制数,5'bx110位二进制数,'hA0位十六进制数,10'd2位十进制数,'hzF位十六进制数
6.赋值后存储在Qpr中的位模式是什么?
reg[1:
8*2]Qpr;
...
Qpr="ME";
答:
变量需要8*2位
7.如果线网类型变量说明后未赋值,其缺省值为多少?
答:
z
8.VerilogHDL允许没有显示说明的线网类型。
如果是这样,怎样决定线网类型?
答:
在VerilogHDL中,有可能不必声明某种线网类型。
在这样的情况下,缺省线网类型为1位线网。
可以使用`default_nettype编译器指令改变这一隐式线网说明方式。
使用方法如下:
`default_nettypenet_kind
例如,带有下列编译器指令:
`default_nettypewand
任何未被说明的网缺省为1位线与网。
9.下面的说明错在哪里?
integer[0:
3]Ripple;
答:
应该是integerRipple[0:
3]
10.编写一个系统任务从数据文件“memA.data”中加载32×64字存储器。
答:
reg[15:
0]RomB[0:
2047];
$readmemb("memA.data",RomB);
11.写出在编译时覆盖参数值的两种方法。
答:
以使用参数定义语句或通过在模块初始化语句中定义参数值。
第4章表达式
1.说明参数GATE_DELAY,参数值为5。
parameterGATE_DELAY=5
2.假定长度为64个字的存储器,每个字8位,编写Verilog代码,按逆序交换存储器的内容。
即将第0个字与第63个字交换,第1个字与第62个字交换,以此类推。
reg[7:
0]mem[63:
0];
integeri=0;
reg[7:
0]temp;
while(i<32)
begin
temp=mem[i];
mem[i]=mem[63-i];
mem[63-i]=temp;
i=i+1;
end
3.假定32位总线Address_Bus,编写一个表达式,计算从第11位到底20位的归约与非。
~&addressBus[20:
11]
4.假定一条总线Control_Bus[15:
0],编写赋值语句将总线分为两条总线:
Abus[0:
9]和Bbus[6:
1]。
Abus=ControlBus[9:
0];
Bbus=ControlBus[15:
10];
5.编写一个表达式,执行算术移位,将Qparity中包含的8位有符号数算术移位。
{Qparity[7-i:
0],Qparity[7:
8-i]}//左移,i表示移的位数
{Qparity[i-1:
0],Qparity[7:
i]}//右移,i表示移的位数
6.使用条件操作符,编写赋值语句选择NextState的值。
如果CurrentState的值为RESET,那么NextState的值为GO;如果CurrentState的值为GO,则NextState的值为BUSY;如果CurrentState的值为BUSY,则NextState的值为RESET。
NextState=(CurrentState==RESET)?
Go:
(CurrentState==Go?
BUSY:
RESET)
7.使用单一连续赋值语句为图2-2所示的2-4解码器电路的行为建模。
【提示:
使用移位操作符、条件操作符和连接操作符。
】
assignZ=EN?
{~(A&B),~(A&~B),~(~A&B),~(~A&~B)}:
4b'1111;
8.如何从标量变量A、B、C和D中产生总线BusQ[3:
0]?
如何从两条总线BusA[3:
0]和BusY[20:
15]形成新的总线BusR[10:
1]?
BusQ[3:
0]={D,C,B,A}
BusR[10:
1]={BusY[20:
15],BusA[3:
0]}
第5章门电平模型化
1.用基本门描述图5-11显示的电路模型。
编写一个测试验证程序用于测试电路的输出。
使用所有可能的输入值对电路进行测试。
modulecompare(A,B,Q);
input[3:
0]A;
input[3:
0]B;
outputQ;
xor(E0,A[0],B[0]),
(E1,A[1],B[1]),
(E2,A[2],B[2]),
(E3,A[3],B[3]);
or(Q,E0,E1,E2,E3);
endmodule
测试:
modulecomparetest;
parameterCLK_PERIOD=20;//20ns50MHZ
reg[7:
0]p;
reg[3:
0]A;
reg[3:
0]B;
regclock;
reg[7:
0]p1;
initial
clock=0;
always#(CLK_PERIOD/2)clock=~clock;
initial
p=8'b00000000;
always@(posedgeclock)
begin
p1=p;
p=p1+1;
A[0]=p[0];
A[1]=p[1];
A[2]=p[2];
A[3]=p[3];
B[0]=p[4];
B[1]=p[5];
B[2]=p[6];
B[3]=p[7];
end
compareinst_compare(.A(A),.B(B));
endmodule
2.使用基本门描述如图5-12所示的优先编码器电路模型。
当所有输入为0时,输出Valid为0,否则输出为1。
并且为验证优先编码器的模型行为编写测
试验证程序。
modulepriority(Data,Encode,valid);
input[3:
0]Data;
output[1:
0]Encode;
outputvalid;
not(Data2bar,Data[2]);
and(out1,Data2bar,Data[1]);
or(out2,Data[1],Data[0]),
(Encode[0],Data[3],out1),
(Encode[1],Data[3],Data[2]),
(valid,Data[3],Data[2],out2);
endmodule
测试:
modulepriority_tb;
reg[3:
0]Data;
initial
begin
#100Data[3]=0;Data[2]=0;Data[1]=0;Data[0]=0;
#100Data[3]=1;Data[2]=0;Data[1]=0;Data[0]=0;
end
priorityinst_priority(.Data(Data));
endmodule
第6章用户定义的原语
1.组合电路UDP与时序电路UDP如何区别?
在组合电路UDP中,表规定了不同的输入组合和相对应的输出值。
没有指定的任意组合输出为x。
在时序电路UDP中,使用1位寄存器描述内部状态。
该寄存器的值是时序电路UDP的输出值。
有时钟作为输入信号。
2.UDP可有一个或多个输出,是否正确?
不正确。
UDP只能有一个输出和一个或多个输入。
3.初始语句可用于初始化组合电路UDP吗?
不可以。
只有时序电路UDP的状态初始化可以使用带有一条过程赋值语句的初始化语句实现。
4.为图5-12中显示的优先编码器电路编写UDP描述。
使用测试激励验证描述的模型。
//encode.v
primitiveencode0(encode0,data3,data2,data1,data0);
outputencode0;
inputdata3,data2,data1,data0;
table
//data[3][2][1][0]encode[1][0]valid
0000:
0;
0001:
0;
001?
:
1;
01?
?
:
0;
1?
?
?
:
1;
endtable
endprimitive
primitiveencode1(encode1,data3,data2,data1,data0);
outputencode1;
inputdata3,data2,data1,data0;
table
//data[3][2][1][0]encode[1][0]valid
0000:
0;
0001:
0;
001?
:
0;
01?
?
:
1;
1?
?
?
:
1;
endtable
endprimitive
//encoder.v
moduleencoder(encode,data);
output[1:
0]encode;
input[3:
0]data;
encode0(encode[0],data[3],data[2],data[1],data[0]);
encode1(encode[1],data[3],data[2],data[1],data[0]);
endmodule
//encoder_tb.v
moduleencoder_tb;
reg[3:
0]data;
initial
begin
#100data[3]=0;data[2]=0;data[1]=0;data[0]=0;
#100data[3]=1;data[2]=0;data[1]=0;data[0]=0;
#100data[3]=0;data[2]=1;data[1]=0;data[0]=0;
#100data[3]=0;data[2]=0;data[1]=1;data[0]=0;
end
encoderinst_encoder(.data(data));
endmodule
5.为T触发器编写UDP描述。
在T触发器中,如果数据输入为0,则输出不变化。
如果数据输入是1,那么输出在每个时钟沿翻转。
假定触发时钟沿是时钟下跳沿,使用测试激励验证所描述的模型。
//Q初始化有问题?
?
//T_Edge_FF.v
primitiveT_Edge_FF(Q,Clk,Data);
outputQ;
regQ;
inputData,Clk;
initialQ=0;
table
//ClkDataQ(State)Q(next)
(10)0:
0:
-;
(10)0:
1:
-;
(10)1:
0:
1;
(10)1:
1:
0;
(1x)0:
0:
-;
(1x)0:
1:
-;
(1x)1:
0:
1;
(1x)1:
1:
0;
//忽略时钟上边沿:
(?
1)?
:
?
:
-;
//忽略在稳定时钟上的数据变化:
?
(?
?
):
?
:
-;
endtable
endprimitive
//T_FF.v
moduleT_FF(Q,Clk,Data);
outputQ;
inputData,Clk;
T_Edge_FF(Q,Clk,Data);
endmodule
//T_FF_tb.v
moduleT_FF_tb;
parameterCLK_PERIOD=100;//100ns10MHz
regData,Clk;
wireQ;
initial
Clk=0;
always#(CLK_PERIOD/2)Clk=~Clk;
initial
begin
#200Data=0;
#200Data=1;
#200Data=0;
#200Data=1;
#200Data=0;
end
T_FFinst_T_FF(.Q(Q),.Data(Data),.Clk(Clk));
endmodule
6.以UDP方式为上跳边沿触发的JK触发器建模。
如果J和K两个输入均为0,则输出不变。
如果J为0,K为1,则输出为0。
如果J是1,K是0,则输出是1。
如果J和K都是1,则输出翻转。
使用测试激励验证描述的模型。
//JK_FF.v
moduleJK_FF(Q,Clk,J,K);
outputQ;
inputJ,K,Clk;
JK_Edge_FF(Q,Clk,J,K);
endmodule
primitiveJK_Edge_FF(Q,Clk,J,K);
outputQ;
regQ;
inputJ,K,Clk;
initialQ=0;
table
//ClkJKQ(State)Q(next)
(01)00:
?
:
-;
(01)01:
?
:
0;
(01)10:
?
:
1;
(01)11:
1:
0;
(01)11:
0:
1;
(0x)00:
0:
-;
(0x)01:
0:
0;
(0x)10:
1:
1;
(0x)11:
0:
0;
//(0x)11:
0:
1;
//忽略时钟负边沿:
(?
0)?
?
:
?
:
-;
//忽略在稳定时钟上的数据变化:
//?
?
?
:
?
:
-;
endtable
endprimitive
//JK_FF_tb.v
moduleJK_FF_tb;
parameterCLK_PERIOD=100;//100ns10MHz
regJ,K,Clk;
wireQ;
initial
Clk=0;
always#(CLK_PERIOD/2)Clk=~Clk;
initial
begin
#5J=1;K=0;
#100J=0;K=0;
#100J=1;K=0;
#100J=1;K=1;
end
JK_FFinst_JK_FF(.Q(Q),.Clk(Clk),.J(J),.K(K));
endmodule
第7章数据流模型化
1.例说明截止时延在连续赋值语句中如何使用
截止时延就是由输入信号的任一状态(1、0或X)转换到高阻状态“Z”输出之间的延时时间。
例如
assign#(4,1,6)dout=din;
“()”中的三个值,4代表上升延时,1代表下降延时,6为截止延时
由图中可知
上升时延为4ns(5~9ns)
下降时延为1ns(15~16ns)
截止时延为6ns(18~24ns),即从din=1’bz开始到dout为1’bz的延时
2.当对同一目标有2个或多个赋值形式时,如何决定目标有效值?
只要在右端表达式的操作数上有事件(事件为值的变化)发生时,表达式即被计算;如果结果值有变化,新结果就赋给左边的线网。
如果右端在传输给左端之前变化,在这种情况下,应用最新的变化值。
3.写出图5-10所示的奇偶产生电路的数据流模型描述形式。
只允许使用2个赋值语句,并规定上升和下降时延。
moduleParity_9_Bit(D,Even,Odd);
input[0:
8]D;
outputEven,Odd;
assign#(20,16)Even=^D;
assign#
(2)Odd=~Even;
endmodule
整个奇偶产生电路累计的上升时间延时是4组,下降时间延时也是四组,所以,上升时间延时=5*4=20,下降时间延时为4*4=16。
4.使用连续赋值语句,描述图5-12所示的优先
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新verilog hdl答案 最新 verilog hdl 答案