精通VerilogHDLIC设计核心技术实例详解书后习题以与答案.docx
《精通VerilogHDLIC设计核心技术实例详解书后习题以与答案.docx》由会员分享,可在线阅读,更多相关《精通VerilogHDLIC设计核心技术实例详解书后习题以与答案.docx(16页珍藏版)》请在冰豆网上搜索。
精通VerilogHDLIC设计核心技术实例详解书后习题以与答案
注意:
9.3程序代码
由于本章所涉及的实例程序太长,并因篇幅所限我们把它放到了的“下载专区”。
请到该书源代码文件的根目录寻找:
JPEG实例程序.doc,这个文件就是本章所用的代码。
第1章习题
1.解释目前市面上的MP3Player为什么多采用DSPbased的设计,而在液晶屏幕里的图像缩放控制器(Scaler)为什么都采用硬件(Hardwirebased)的设计。
mp3的动作时钟低,若采用硬件设计,则许多电路大部分时间皆在闲置状况,以DSP设计,调整程序即能解码WMA的编码格式,这是硬件设计难以办到的。
Scaler的动作频率在SVGA时高达135MHz,且功能性单纯,并不需要太大的弹性,故适宜采用硬件架构设计。
若采用DSP设计,频宽和时钟将难以满足。
2.叙述为什么需要做形式验证(FormalVerification)。
最初是因为后端(AP&R)为了满足时序上的要求而加入Buffer,这使得电路存在功能被改变的风险,因此需要做形式验证。
不过近年来形式验证已发展到RTL-RTL、RTL-Gate、Gate-Gate的互相比较,且在测试电路的加入后,形式验证显得更加重要。
3.试简述IC开发的流程。
参考本章1.2节部分
4.解释需降低系统功率消耗的原因。
5.假设电路操作情形如图1-65所示,试估计电路消耗的Internalpower及Switchingpower。
图1-65电路操作情形举例
第2章习题
1.描述一个模块通常会包含哪些部分?
其中有哪些是必要的?
模块名称、输出入管脚、管脚声明、参数定义、include声明、变量声明、程序主体、endmodule。
只有模块名称、endmodule、变量声明、程序主体是必要的。
2.利用我们在数字逻辑里学到的知识,将四输入的多任务器以其他逻辑器件(如NORGate)实现。
3.定义一输入及四输出,输入输出都为8位,两个选项的多任务器,其输出输入可以以表格描述如下。
sel1
sel0
3
2
1
0
0
0
1
1
0
1
0
1
0
0
0
in
0
0
in
0
0
in
0
0
in
0
0
0
试以Verilog语句描述其输出输入,并写出完整的测试平台测试。
moduleex2_2;
//testbench
regclk=0;
reg[7:
0]in=0;
always#10clk=~clk;
reg[1:
0]sel=0;
always(posedgeclk)
sel<=sel+1;
integerseed=4;
always(posedgeclk)
in<=$random(seed);
//Circuit
wire[7:
0]out0=(sel==0)?
in:
0;
wire[7:
0]out1=(sel==1)?
in:
0;
wire[7:
0]out2=(sel==2)?
in:
0;
wire[7:
0]out3=(sel==3)?
in:
0;
endmodule
4.定义3位输入和6位输出,输出是此3位数平方的Verilog语句及测试平台。
moduleex2_3;
//testbench
regclk=0;
reg[2:
0]in=0;
always#10clk=~clk;
integerseed=4;
always(posedgeclk)
in<=$random(seed);
wire[5:
0]out=(in==0)?
0:
(in==1)?
1:
(in==2)?
4:
(in==3)?
9:
(in==4)?
16:
(in==5)?
25:
(in==6)?
36:
(in==7)?
49:
0;
endmodule
5.绘出下列VerilogHDL语句的电路,并估计时钟周期由哪一条路径(Path)所控制。
reg[3:
0]da,db,xor_reg,and_reg,or_reg,add_reg;
always(posedgeclkornegedgenrst)
if(~nrst)begin
da<=0;
db<=0;
endelsebegin
da<=din_a;
db<=din_b;
end
wire[3:
0]xor_op=da^db;
wire[3:
0]and_op=da&db;
wire[3:
0]or_op=da|db;
wire[3:
0]add_op=da+db;
always(posedgeclkornegedgenrst)
if(~nrst)begin
xor_reg<=0;and_reg<=0;
or_reg<=0;add_reg<=0;
endelsebegin
xor_reg<=xor_op;and_reg<=and_op;
or_reg<=or_op;add_reg<=add_op;
end
reg[3:
0]da,db,xor_reg,and_reg,or_reg,add_reg;
always(posedgeclkornegedgenrst)
if(~nrst)begin
da<=0;
db<=0;
endelsebegin
da<=din_a;
db<=din_b;
end
wire[3:
0]xor_op=da^db;
wire[3:
0]and_op=da&db;
wire[3:
0]or_op=da|db;
wire[3:
0]add_op=da+db;
always(posedgeclkornegedgenrst)
if(~nrst)begin
xor_reg<=0;and_reg<=0;
or_reg<=0;add_reg<=0;
endelsebegin
xor_reg<=xor_op;and_reg<=and_op;
or_reg<=or_op;add_reg<=add_op;
end
由add_op=da+db这一条语句所控制,因为加法的时间延迟最长。
6.编写下列电路的Verilog代码,其电路如图2-42所示。
图2-42电路示例
wire[3:
0]A,B;
wiretemp3=~(A[3]^B[3]);
wiretemp2=~(A[2]&B[2]);
wiretemp1=(A[1]&B[1]);
wiretemp0=(A[0]|B[0]);
wiretmp=temp3|temp2|temp1|temp0;
always(posedgeclk)dout<=tmp;
7.在ex2_7中,我们曾经编写过一个向左旋转(Rotate)一个位的Verilog程序,请试编写一个每一次时钟信号上升沿时向右旋转(Rotate)两个位的逻辑电路及测试平台。
moduleex2_6;
//testbench
regclk=0,nrst=1,sel=0;
reg[7:
0]din=0,dout;
always#10clk=~clk;
initialbegin
#50nrst=0;
#70nrst=1;
#80sel=1;
#15sel=0;
end
integerseed=4;
always(posedgeclk)
din<=#1$random(seed);
//circuit
wire[7:
0]temp={dout[1:
0],dout[7:
2]};
always(posedgeclkornegedgenrst)
if(~nrst)dout<=0;
elseif(sel==1)dout<=din;
elsedout<=temp;
endmodule
8.在本章中我们曾设计过一个3-8译码器,试着设计一个8-3编码器。
这个编码器当输入为0时具有最高的编码优先权,当输入为8时编码优先权最低。
wire[7:
0]in;
wire[2:
0]out=(in==0)?
3’b000:
(in==1)?
3’b001:
(in==2)?
3’b010:
(in==3)?
3’b011:
(in==4)?
3’b100:
(in==5)?
3’b101:
(in==5)?
3’b101:
(in==6)?
3’b110:
(in==7)?
3’b111:
0;
9.试编写一个4位计数器,系统重置后计数器的值为零,计数顺序为:
0->2->3->4->7->9>10->11->12->13->14->15->0。
reg[3:
0]tr;
wirejump2=(cntr==0)|(cntr==5)|(cntr==7);
always(posedgeclkornegedgenrst)
if(~nrst)tr<=0;
elseif(jump2)tr<=cntr+2;
elsetr<=cntr+1;
10.试对ex2_12的NRZI译码编写程序。
第3章习题
1.试以forever描述一个时间周期为20时间单位的时钟信号。
regclk=0;
initialforever#10clk=~clk;
2.在本章中提到的循环语句有for、repeat、while循环。
试以这三种循环编写一个计数器,计数到非常大的数字,以您熟悉的仿真器仿真,然后比较这三种语法所耗的时间。
3.比较下列两种VerilogHDL的reset语句,分别对其仿真,比较它们有什么不同,并绘出它们的电路图。
case1
always(posedgeclkornegedgenrst)
if(~nrst)q<=0;
elseq<=d;
case2
always(posedgeclk)
if(~nrst)q<=0;
elseq<=d;
二者的不同在于,cas1的reset信号是异步的,即使没有clk仍然能清除q;而case2的reset信号是同步的,如果没有clk就无法清除q。
case1case2
4.用您所熟悉的综合器,针对下列两种情形做综合并比较其结果。
case1
always(posedgeclk)
begin
B=A;
A=C;
end
case2
always(posedgeclk)
begin
B<=A;
A<=C;
end
case1
always(posedgeclk)
begin
T1=A1|B1;
Y1=T1|C1;
end
always(posedgeclk)
begin
T2<=A2|B2;
Y2<=T2|C2;
end
5.试绘出下列VerilogHDL语句的电路。
functionxor_op;
input[7:
0]A;
xor_op=(A[7]^A[6])|(A[5]^A[4])|(A[3]^A[2])|(A[1]^A[0]);
endfunction
wireA,B,D;
wire[7:
0]C;
regY1,Y2;
always(AorBorCorD)
begin
Y1=A&B|xor_op(C);
Y2=Y1&D;
end
第4章习题
1.设计一个五层住户电梯的状态图,这个电梯必须满足一般的功能,每一层都可以对其做上楼或下楼的选择,如果觉得很困难,试着简化问题,编写程序及测试平台。
2.试编写下列状态变化图(如图4-39所示)的VerilogHDL程序代码。
图4-39状态变化图
parameterstate0=2'b00,
state1=2'b01,
state2=2'b10;
reg[1:
0]nxt_state,current_state;
regy;
always(posedgeclkornegedgenrst)
if(~nrst)current_state<=state0;
elsecurrent_state<=nxt_state;
always(current_stateorx)
case(current_state)
state0:
begin
if(x==0)begin
y=0;
nxt_state=state0;
endelseif(x==1)begin
y=1;
nxt_state=state1;
end
end
state1:
begin
if(x==0)begin
y=1;
nxt_state=state1;
endelseif(x==1)begin
y=0;
nxt_state=state2;
end
end
state2:
begin
if(x==0)begin
y=1;
nxt_state=state0;
end
end
default:
begin
y=0;
nxt_state=state0;
end
endcase
3.用设计程序状态机的方式,设计一个8位的格雷码(GrayCode)计数器。
modulegraycntr(gray,clk,inc,rst_n);
parameterSIZE=4;
output[SIZE-1:
0]gray;
inputclk,inc,rst_n;
reg[SIZE-1:
0]gnext,gray,bnext,bin;
integeri;
always(posedgeclkornegedgerst_n)
if(!
rst_n)gray<=0;
elsegray<=gnext;
always(grayorinc)begin
for(i=0;ibin[i]=^(gray>>i);
bnext=bin+inc;
gnext=(bnext>>1)^bnext;
end
endmodule
第5章习题
1.试阐述同步设计与异步设计的优缺点。
同步设计
Ø优点:
易于分析,可靠、稳定,易于加入测试电路。
Ø缺点:
功率消耗大,占据较大的面积,系统整体效能难以提升。
异步设计
Ø优点:
占据面积小,节省功率消耗。
Ø缺点:
不易分析,可靠度稳定度差,且不易加入测试电路。
2.解释什么是亚稳态(Metastable)。
信号在跨越不同的clkdomain时,有时候稳定,而有时候却不稳定的情形如本章中关于Metastable的节所述。
3.试编写一个异步存的行为模型,这个存的一边接口是CS(ChipSelect)、WR(Write)、RD(Read)、DIN[15:
0]、ROW[6:
0]、COL[6:
0]、DO[15:
0],其地址由ROW,COL来替代,输出输入皆为Leveltrigger。
Row为Page的概念。
这个存总共有96个Row(每个Row有96个Column)。
每个存储元件为16位。
另外一边则为OEN(Outputenable)、RROW[6:
0](ReadRowaddress)、DO[96X16-1:
0]。
这一边能由输入Row直接读取96个Column的数据。
所有的信号皆为Highactive。
其时序图如图5-29所示。
writecycle
readcycle
图5-29时序图
第6章习题
1.从设计一个二输入的4位比较器起,设计一个四输入四输出的比较器。
这个比较器的输出能将四输出依四输入的大小排列,然后输出。
编写其VerilogHDL程序及测试平台。
见ex6_1
2.将例ex6_3的乘法器扩展为8位乘以8位的乘法器。
见ex6_2
3.理解Ripple加法器与Ripple减法器的电路,试着设计能由一个控制信号选项来执行加法或减法的4位Ripple加减法器电路。
foradditiontheoperationis
for(i=0;i<=3;i++)
{
}
forsubtraction
for(i=0;i<=3;i++)
{
}
4.参考本章所介绍的CSA加法器,设计一个八输入的CSA加法器,每一个数据的输入为4位,并编写测试平台验证。
见ex6_4