注意: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。ramp=0.65ns0.3pfTr=0.02图1-65电路操作情形举例第2章习题1.描述一个模块通常会包含哪些部分?其中有哪些是必要的?模块名称、输出入管脚、管脚声明、参数定义、include声明、变量声明、程序主体、endmodule。只有模块名称、endmodule、变量声明、程序主体是必要的。2.利用我们在数字逻辑里学到的知识,将四输入的多任务器以其他逻辑器件(如NORGate)实现。sel0sel1in1in2in3in43.定义一输入及四输出,输入输出都为8位,两个选项的多任务器,其输出输入可以以表格描述如下。sel1sel0321000110101000in00in00in00in000试以Verilog语句描述其输出输入,并写出完整的测试平台测试。moduleex2_2;//testbenchregclk=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);//Circuitwire[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;endmodule4.定义3位输入和6位输出,输出是此3位数平方的Verilog语句及测试平台。moduleex2_3;//testbenchregclk=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;endmodule5.绘出下列VerilogHDL语句的电路,并估计时钟周期由哪一条路径(Path)所控制。reg[3:0]da,db,xor_reg,and_reg,or_reg,add_reg;always@(posedgeclkornegedgenrst)if(~nrst)beginda=0;db=0;endelsebeginda=din_a;db=din_b;endwire[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)beginxor_reg=0;and_reg=0;or_reg=0;add_reg=0;endelsebeginxor_reg=xor_op;and_reg=and_op;or_reg=or_op;add_reg=add_op;endreg[3:0]da,db,xor_reg,and_reg,or_reg,add_reg;always@(posedgeclkornegedgenrst)if(~nrst)beginda=0;db=0;endelsebeginda=din_a;db=din_b;endwire[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)beginxor_reg=0;and_reg=0;or_reg=0;add_reg=0;endelsebeginxor_reg=xor_op;and_reg=and_op;or_reg=or_op;add_reg=add_op;end由add_op=da+db这一条语句所控制,因为加法的时间延迟最长。6.编写下列电路的Verilog代码,其电路如图2-42所示。DQSETCLRA[3]A[2]A[1]A[0]B[0]B[1]B[2]B[3]clkdout图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;//testbenchregclk=0,nrst=1,sel=0;reg[7:0]din=0,dout;always#10clk=~clk;initialbegin#50nrst=0;#70nrst=1;#80sel=1;#15sel=0;endintegerseed=4;always@(posedgeclk)din=#1$random(seed);//circuitwire[7:0]temp={dout[1:0],dout[7:2]};always@(posedgeclkornegedgenrst)if(~nrst)dout=0;elseif(sel==1)dout=din;elsedout=temp;endmodule8.在本章中我们曾设计过一个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-910-11-12-13-14-15-0。reg[3:0]cntr;wirejump2=(cntr==0)|(cntr==5)|(cntr==7);always@(posedgeclkornegedgenrst)if(~nrst)cntr=0;elseif(jump2)cntr=cntr+2;elsecntr=cntr+1;10.试对ex2_12的NRZI译码编写程序。第3章习题1.试以forever描述一个时间周期为20时间单位的时钟信号。regclk=0;initialforever#10clk=~clk;2.在本章中提到的循环语句有for、repeat、while循环。试以这三种循环编写一个计数器,计数到非常大的数字,以您熟悉的仿真器仿真,然后比较这三种语法所耗的时间。3.比较下列两种VerilogHDL的reset语句,分别对其仿真,比较它们有什么不同,并绘出它们的电路图。case1always@(posedgeclkornegedgenrst)if(~nrst)q=0;elseq=d;case2always@(posedgeclk)if(~nrst)q=0;elseq=d;二者的不同在于,cas1的reset信号是异步的,即使没有clk仍然能清除q;而case2的reset信号是同步的,如果没有clk就无法清除q。case1case2DQSETCLRclkddnrstDQSETCLRclkddnrst0104.用您所熟悉的综合器,针对下列两种情形做综合并比较其结果。case1always@(posedgeclk)beginB=A;A=C;endcase2always@(posedgeclk)beginB=A;A=C;endcase1always@(posedgeclk)beginT1=A1|B1;Y1=T1|C1;endalways@(posedgeclk)beginT2=A2|B2;Y2=T2|C2;end5.试绘出下列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]);endfunctionwireA,B,D;wire[7:0]C;regY1,Y2;always@(AorBorCorD)beginY1=A&B|xor_op(C);Y2=Y1&D;end第4章习题1.设计一个五层住户电梯的状态图,这个电梯必须满足一般的功能,每一层都可以对其做上楼或下楼的选择,如果觉得很困难,试着简化问题,编写程序及测试平台。2.试编写下列状态变化图(如图4-39所示)的VerilogHDL程序代码。0/01/10001101/00/10/0reset图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:beginif(x==0)beginy=0;nxt_state=state0;endelseif(x==1)beginy=1;nxt_state=state1;endendstate1:beginif(x==0)beginy=1;nxt_state=state1;endelseif(x==1)beginy=0;nxt_state=state2;endendstate2:beginif(x==0)beginy=1;nxt_state=state0;endenddefault:beginy=0;nxt_state=state0;endendcase3.用