您好,欢迎来到六九路网。
搜索
您的当前位置:首页《精通VerilogHDL:IC设计核心技术实例详解》书后习题以及答案

《精通VerilogHDL:IC设计核心技术实例详解》书后习题以及答案

来源:六九路网
注意:9.3 程序代码

由于本章所涉及的实例程序太长,并因篇幅所限我们把它放到了http://www.fecit.com.cn的“下载专区”。请到该书源代码文件的根目录寻找:JPEG实例程序.doc,这个文件就是本章所用的代码。

第1章 习题

1.解释目前市面上的MP3 Player为什么多采用DSP based的设计,而在液晶屏幕里的图像缩放控制器(Scaler)为什么都采用硬件(Hardwire based)的设计。

mp3的动作时钟低,若采用硬件设计,则许多电路大部分时间皆在闲置状况,以DSP设计,调整程序即能解码WMA的编码格式,这是硬件设计难以办到的。 Scaler的动作频率在SVGA时高达135MHz,且功能性单纯,并不需要太大的弹性,故适宜采用硬件架构设计。若采用DSP设计,频宽和时钟将难以满足。

2.叙述为什么需要做形式验证(Formal Verification)。

最初是因为后端(AP&R)为了满足时序上的要求而加入Buffer,这使得电路存在功能被改变的风险,因此需要做形式验证。不过近年来形式验证已发展到 RTL-RTL、RTL-Gate、Gate-Gate的互相比较,且在测试电路的加入后,形式验证显得更加重要。

3.试简述IC开发的流程。 参考本章1.2节部分

4.解释需降低系统功率消耗的原因。

5.假设电路操作情形如图1-65所示,试估计电路消耗的Internal power及Switching power。

0.3pframp=0.65nsTr=0.02

图1-65 电路操作情形举例 第2章 习题

1.描述一个模块通常会包含哪些部分?其中有哪些是必要的?

模块名称、输出入管脚、管脚声明、参数定义、include声明、变量声明、程序主体、endmodule。

只有模块名称、endmodule、变量声明、程序主体是必要的。

2.利用我们在数字逻辑里学到的知识,将四输入的多任务器以其他逻辑器件(如NOR Gate)实现。

in1in2in3in4sel1

sel0

3.定义一输入及四输出,输入输出都为8 位,两个选项的多任务器,其输出输入可以以表格描述如下。

sel1 0 0 1 1 sel0 0 1 0 1 3 0 0 0 in 2 0 0 in 0 1 0 in 0 0 0 in 0 0 0 试以Verilog语句描述其输出输入,并写出完整的测试平台测试。

module ex2_2;

//test bench reg clk=0; reg [7:0]in=0; always #10 clk=~clk; reg [1:0] sel=0; always@(posedge clk) sel<=sel+1;

integer seed=4; always@(posedge clk) 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语句及测试平台。

module ex2_3; //test bench reg clk=0; reg [2:0]in=0; always #10 clk=~clk; integer seed=4; always@(posedge clk) 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.绘出下列Verilog HDL语句的电路,并估计时钟周期由哪一条路径(Path)所控制。

reg [3:0] da,db,xor_reg,and_reg,or_reg,add_reg;

always@(posedge clk or negedge nrst) if (~nrst) begin da<=0; db<=0;

end else begin 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@(posedge clk or negedge nrst) if (~nrst) begin xor_reg<=0; and_reg<=0; or_reg<=0; add_reg<=0; end else begin

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@(posedge clk or negedge nrst) if (~nrst) begin

da<=0; db<=0;

end else begin 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@(posedge clk or negedge nrst) if (~nrst) begin

xor_reg<=0; and_reg<=0; or_reg<=0; add_reg<=0; end else begin

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所示。 A[3]B[3]A[2]B[2]SETA[1]B[1]A[0]B[0]DCLRQdoutclk图2-42 电路示例 wire [3:0] A,B; wire temp3=~(A[3]^B[3]); wire temp2=~( A[2]&B[2]); wire temp1=( A[1]&B[1]);

wire temp0=( A[0]|B[0]);

wire tmp=temp3 | temp2 | temp1 | temp0; always@(posedge clk) dout<= tmp;

7.在ex2_7中,我们曾经编写过一个向左旋转(Rotate)一个位的Verilog程序,请试编写一个每一次时钟信号上升沿时向右旋转(Rotate)两个位的逻辑电路及测试平台。

module ex2_6; //test bench

reg clk=0,nrst=1,sel=0; reg [7:0] din=0,dout; always #10 clk=~clk; initial begin #50 nrst=0; #70 nrst=1; #80 sel=1; #15 sel=0; end

integer seed=4; always@(posedge clk) din<=#1 $random(seed); //circuit

wire [7:0] temp={dout[1:0],dout[7:2]}; always @(posedge clk or negedge nrst) if (~nrst) dout<=0; else if (sel==1) dout<=din; else dout<=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] cntr;

wire jump2=(cntr==0) | (cntr==5) | (cntr==7) ; always@(posedge clk or negedge nrst) if (~nrst) cntr<=0; else if (jump2) cntr<=cntr+2; else cntr<=cntr+1;

10.试对ex2_12的NRZI译码编写程序。

第3章 习题

1.试以forever描述一个时间周期为20时间单位的时钟信号。

reg clk=0;

initial forever #10 clk=~clk;

2.在本章中提到的循环语句有for、repeat、while循环。试以这三种循环编写一个计数器,计数到非常大的数字,以您熟悉的仿真器仿真,然后比较这三种语法所耗的时间。 3.比较下列两种Verilog HDL的reset语句,分别对其仿真,比较它们有什么不同,并绘出它们的电路图。

case1

always@(posedge clk or negedge nrst) if (~nrst) q<=0; else q<=d;

case2

always@(posedge clk) if (~nrst) q<=0; else q<=d;

二者的不同在于,cas1的reset信号是异步的,即使没有clk仍然能清除q;而case2的reset信号是同步的,如果没有clk 就无法清除q。 case1 case2

dclknrstSETDCLRQd0dnrstclk01SETDCLRQd

4.用您所熟悉的综合器,针对下列两种情形做综合并比较其结果。

case1

always@(posedge clk) begin

B=A; A=C; end

case2

always@(posedge clk) begin B<=A; A<=C; end

case1

always@(posedge clk) begin

T1=A1 | B1; Y1=T1 | C1; end

always@(posedge clk) begin

T2<=A2 | B2; Y2<=T2 | C2; end

5.试绘出下列Verilog HDL语句的电路。

function xor_op; input [7:0] A;

xor_op=(A[7]^A[6])| (A[5]^A[4])| (A[3]^A[2])| (A[1]^A[0]); endfunction wire A,B,D; wire [7:0] C; reg Y1,Y2;

always@(A or B or C or D) begin

Y1=A & B | xor_op(C); Y2=Y1 & D; end

第4章 习题

1.设计一个五层住户电梯的状态图,这个电梯必须满足一般的功能,每一层都可以对其做上楼或下楼的选择,如果觉得很困难,试着简化问题,编写程序及测试平台。

2.试编写下列状态变化图(如图4-39所示)的Verilog HDL程序代码。 reset0/01/1000/00/101101/0

图4-39 状态变化图 parameter state0=2'b00, state1=2'b01, state2=2'b10;

reg [1:0] nxt_state,current_state; reg y;

always@(posedge clk or negedge nrst) if (~nrst) current_state<=state0; else current_state<=nxt_state;

always@(current_state or x) case(current_state) state0: begin

if (x==0) begin y=0;

nxt_state=state0; end else if (x==1) begin y=1;

nxt_state=state1; end end state1: begin

if (x==0) begin y=1;

nxt_state=state1; end else if (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位的格雷码(Gray Code)计数器。

module graycntr (gray, clk, inc, rst_n); parameter SIZE = 4; output [SIZE-1:0] gray; input clk, inc, rst_n;

reg [SIZE-1:0] gnext, gray, bnext, bin; integer i;

always @(posedge clk or negedge rst_n) if (!rst_n) gray <= 0; else gray <= gnext;

always @(gray or inc) begin for (i=0; i>i); bnext = bin + inc;

gnext = (bnext>>1) ^ bnext; end endmodule

第5章 习题

1.试阐述同步设计与异步设计的优缺点。 ①同步设计

 优点:易于分析,可靠、稳定,易于加入测试电路。

 缺点:功率消耗大,占据较大的面积,系统整体效能难以提升。

②异步设计

 优点:占据面积小,节省功率消耗。

 缺点:不易分析,可靠度稳定度差,且不易加入测试电路。

2.解释什么是亚稳态(Metastable)。

信号在跨越不同的clk domain时, 有时候稳定,而有时候却不稳定的情形如本章中关于Metastable的节所述。

3.试编写一个异步内存的行为模型,这个内存的一边接口是CS(Chip Select)、WR(Write)、RD(Read)、DIN[15:0]、ROW[6:0]、COL[6:0]、DO[15:0],其地址由ROW,COL来替代,输出输入皆为Level trigger。Row为Page的概念。这个内存总共有96个Row(每个Row有96个Column)。每个存储元件为16位。另外一边则为OEN(Output enable)、RROW[6:0](Read Row address)、DO[96X16-1:0]。这一边能由输入Row直接读取96个Column的数据。所有的信号皆为High active。其时序图如图5-29所示。

write cycle

read cycle

图5-29 时序图

第6章 习题

1.从设计一个二输入的4 位比较器起,设计一个四输入四输出的比较器。这个比较器的输出能将四输出依四输入的大小排列,然后输出。编写其Verilog HDL程序及测试平台。

见ex6_1

2.将例ex6_3的乘法器扩展为8 位乘以8 位的乘法器。 见ex6_2

3.理解Ripple加法器与Ripple减法器的电路,试着设计能由一个控制信号选项来执行加法或减法的4位Ripple加减法器电路。

for addition the operation is for subtraction

C00

for (i=0;i<=3;i++) {

C01

for (i=0;i<=3;i++) {

giai&bi

giai&(~bi)

piai^biSiPi^CiCi1gi|(Pi&Ci)pi~(ai^bi)SiPi^CiCi1gi|(Pi&Ci)

} }

4.参考本章所介绍的CSA加法器,设计一个八输入的CSA加法器,每一个数据的输入为4位,并编写测试平台验证。

见ex6_4

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 69lv.com 版权所有 湘ICP备2023021910号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务