《Verilog HDL数字集成电路设计原理与应用》课件第6章.ppt

上传人(卖家):momomo 文档编号:7882812 上传时间:2024-08-30 格式:PPT 页数:249 大小:1.77MB
下载 相关 举报
《Verilog HDL数字集成电路设计原理与应用》课件第6章.ppt_第1页
第1页 / 共249页
《Verilog HDL数字集成电路设计原理与应用》课件第6章.ppt_第2页
第2页 / 共249页
《Verilog HDL数字集成电路设计原理与应用》课件第6章.ppt_第3页
第3页 / 共249页
《Verilog HDL数字集成电路设计原理与应用》课件第6章.ppt_第4页
第4页 / 共249页
《Verilog HDL数字集成电路设计原理与应用》课件第6章.ppt_第5页
第5页 / 共249页
点击查看更多>>
资源描述

1、1第6章 Verilog HDL高级程序设计举例 6.1 数字电路系统设计的层次化描述方法 6.2 典型电路设计 6.3 总线控制器设计 本章小结2集成电路设计中大量采用的是结构性的描述方法,归纳起来主要有两种:自下而上(Bottom-Up)的设计方法与自上而下(Top-Down)的设计方法。在实际运用中,可以根据实际设计的情况选择这两种方法相结合的设计方法,即混合设计方法。6.1 数字电路系统设计的层次数字电路系统设计的层次化描述方法化描述方法3Top-Down方法主要是从系统设计的角度进行,系统工程师往往会在项目的规划阶段将数字电路系统进行划分,明确主要单元模块的功能、时序和接口参数等系统

2、方案,这种方法可以有效协调ULSI和VLSI芯片设计中众多开发人员的工作。Bottom-Up方法主要是在实际系统执行过程中,底层设计人员提出底层功能模块的优化方案,系统设计人员分析这些优化对系统的影响,通过调整系统结构,提高芯片整体性能。41.Bottom-Up设计方法设计方法Bottom-Up设计方法是一种传统的设计方法,它要求电路设计者将系统进行模块划分,从底层模块设计开始,运用各底层模块搭建一个完整的系统。在这种设计方法中,首先根据系统设计的要求,定义并建立所需要的叶子模块,通过模块连接方式建成较大的模块,然后把这些比较大的模块组合成具有一定功能的模块,最后将这些功能模块组合,直到完成整

3、个系统。这就如同搭积木,用小的模块不断组合,最后完成系统的设计。其设计方法示意图如图6.1-1所示。5图6.1-1 Bottom-Up设计方法示意图6一个典型的Bottom-Up设计例子是在第4章中提到的串行加法器的设计。一个4位串行加法器由4个全加器构成,如图6.1-2所示。全加器是串行加法器的子模块,而全加器是由基本的逻辑门构成的,如图6.1-3所示,这些基本的逻辑门就是所说的叶子模块。这个设计中运用叶子模块(基本逻辑门)搭建成子模块(全加器),再用子模块搭建成所需要的电路(串行加法器)。7图6.1-2 4位串行加法器8图6.1-3 全加器逻辑电路9显然,Bottom-Up设计方法没有明显

4、的规律可循,主要依靠设计者的实践经验和熟练的设计技巧,用逐步试探的方法最后设计出一个完整的数字系统。系统的各项性能指标只有在系统构成后才能分析测试。Bottom-Up设计方法常用于原理图的设计中,相比于其它方法,该方法对于实现各个子模块电路所需的时间较短。但是该方法仍存在着许多不足之处,例如采用该设计方法容易对系统的整体功能把握不足,整个系统的设计周期比较长、效率低、设计质量难以保证等。因此,这种方法只适用于小规模电路的设计。102.Top-Down设计方法设计方法随着电子技术的快速发展,传统的设计方法已经不能满足日益增长的系统要求,Top-Down设计方法成为数字系统设计的主流设计方法。在这

5、种设计方法中,首先从系统级入手,把系统划分为若干个子功能单元,并编制出相应的行为或结构模型;再将这些子功能单元进一步进行拆分,就这样不断地拆分直到整个系统中各个模块的逻辑关系合理,便于逻辑电路级的设计和实现,这种最底层的功能模块被称为叶子模块。其设计方法示意图如图6.1-4所示。11图6.1-4 Top-Down设计方法示意图12例如,使用Top-Down设计方法对一个典型CPU进行设计,如图6.1-5所示。根据CPU的功能将CPU分为控制单元、逻辑运算单元、存储单元。控制单元主要控制整个CPU的工作,用于调控整个CPU按照指令执行相应的规定动作,控制单元又由指令控制器、时序控制器、总线控制器

6、和中断控制器构成。逻辑运算单元可以分为算术逻辑运算单元ALU和浮点运算单元FPU。存储单元可以分为通用寄存器和专用寄存器。这样通过功能的不断细化,将大模块划分成了更小的模块,当划分到指令控制器这一级时,就可以通过各种逻辑电路来实现了。13图6.1-5 Top-Down设计CPU流程14Top-Down设计方法的优点是显而易见的,在整个设计过程中主要的仿真和调试过程是在高层次完成的,所以能够在设计的早期发现结构设计上的错误,及时进行调整,最大限度地不将错误带入到后续的设计环节中。同时方便了从系统进行划分和管理整个项目,使得大规模的复杂的数字电路实现成为可能,避免了不必要的重复设计,提高了设计效率

7、。然而这种设计方法仍然存在着不足,在设计的开始并不能准确地确定最终功能单元的设计,需要根据具体的设计情况,不断进行系统设计的修正。15现在的数字电路设计越来越复杂,单一的设计方法往往很难满足设计要求,因此通常将这两种设计方法结合起来,即采用混合的设计方法来进行设计。这样可以综合每种方法的优点,在高层系统设计时采用Top-Down设计方法,便于系统的划分;而在底层的设计时采用Top-Down设计方法,这样可以缩短各个模块的设计时间。16例6.1-1 采用模块层次化设计方法,设计4维向量点积乘法器,其中向量a=(a1,a2,a3,a44),b=(b1,b2,b3,b4)。点积乘法的规则为 (6.1

8、-1)44332211bababababa向量点积乘法是将向量的对应位置的值相乘,然后相加。其对应电路结构如图6.1-6所示。17图6.1-6 向量点积乘法器电路结构18可以看出,4位点积向量乘法器由4个乘法器和3个加法器构成,而加法器和乘法器又由半加器和全加器构成,其中半加器和全加器又由基本的逻辑门组成,其构成关系如图6.1-7所示。19图6.1-7 向量点积乘法器层次化功能模块20具体的Verilog HDL设计包括顶层模块vector、加法器模块add和乘法器模块mul_addtree。Verilog HDL程序代码如下:module vector(a1,a2,a3,a4,b1,b2,b

9、3,b4,out);input 3:0 a1,a2,a3,a4,b1,b2,b3,b4;output 9:0 out;wire 7:0 out1,out2,out3,out4;wire 8:0 out5,out6;wire 9:0 out;21mul_addtree U1(.x(a1),.y(b1),.out(out1);mul_addtree U2(.x(a2),.y(b2),.out(out2);mul_addtree U3(.x(a3),.y(b3),.out(out3);mul_addtree U4(.x(a4),.y(b4),.out(out4);add#(8)U5(.a(out1)

10、,.b(out2),.out(out5);add#(8)U6(.a(out3),.b(out4),.out(out6);add#(9)U7(.a(out5),.b(out6),.out(out);endmodule/加法器module add(a,b,out);22 parameter size=8;input size-1:0 a,b;output size:0 out;assign out=a+b;endmodule/乘法器module mul_addtree(mul_a,mul_b,mul_out);input 3:0 mul_a,mul_b;/IO端口声明 output 7:0 mul

11、_out;23 wire 3:0 mul_out;/连线类型声明 wire 3:0 stored0,stored1,stored2,stored3;wire 3:0 add01,add23;assign stored3=mul_b3?1b0,mul_a,3b0:8b0;/逻辑设计 assign stored2=mul_b2?2b0,mul_a,2b0:8b0;assign stored1=mul_b1?3b0,mul_a,1b0:8b0;24 assign stored0=mul_b0?4b0,mul_a:8b0;assign add01=stored1+stored0;assign add2

12、3=stored3+stored2;assign mul_out=add01+add23;endmodule可以看到,在这个电路设计中,vector、add和mul_addtree三个模块共同构成了向量点积乘法器。顶层模块vector采用结构描述方式分别使用了4个mul_addtree和3个add模块,分两层实现了电路功能。256.2.1 加法器树乘法器加法器树乘法器加法器树乘法器的设计思想是“移位后加”,并且加法运算采用加法器树的形式。乘法运算的过程是,被乘数与乘数的每一位相乘并且乘以相应的权值,最后将所得的结果相加,便得到了最终的乘法结果。6.2 典型电路设计典型电路设计26加法器树乘法器

13、在计算被乘数与乘数及与其权值相乘时采用“判断移位”的形式,即通过判断乘数位是否为1来决定结果为0或者进行移位。当乘数位为1时被乘数根据该位的权值将被乘数移位,权值为0不移位,权值为2左移1位,权值为4左移2位,权值为8左移3位;当乘数位为0时直接输出0。而加法器树乘法器的加法运算是通过加法器树来实现的,如图6.2-1所示。加法器树所需要的加法器的数目是操作数的位数减1。27图6.2-1 4位的加法器树乘法器结构28例6.2-1 图6.2-1是一个4位的加法器树乘法器结构,用Verilog HDL设计一个4位加法器树乘法器。module mul_addtree(mul_a,mul_b,mul_o

14、ut);input 3:0 mul_a,mul_b;/IO端口声明output 7:0 mul_out;wire 7:0 mul_out;/连线类型声明 wire 7:0 stored0,stored1,stored2,stored3;wire 7:0 add01,add23;29assign stored3=mul_b3?1b0,mul_a,3b0:8b0;/逻辑设计assign stored2=mul_b2?2b0,mul_a,2b0:8b0;assign stored1=mul_b1?3b0,mul_a,1b0:8b0;assign stored0=mul_b0?4b0,mul_a:8b

15、0;assign add01=stored1+stored0;assign add23=stored3+stored2;assign mul_out=add01+add23;endmodule30/*测试代码*module mult_addtree_tb;reg 3:0mult_a;reg 3:0mult_b;wire 7:0mult_out;/模块例化mul_addtree U1(.mul_a(mult_a),.mul_b(mult_b),.mul_out(mult_out);31initial /测试信号 begin mult_a=0;mult_b=0;repeat(9)begin#20

16、mult_a=mult_a+1;mult_b=mult_b+1;end endendmodule32图6.2-2 加法器树乘法器测试结果33图6.2-3 两级流水线4位加法器树乘法器结构34加法器树乘法器可以通过流水线提高电路速度。其基本思想是加法器树中插入寄存器,将加法器树乘法器设计成流水线型。例6.2-2 用Verilog HDL设计一个两级流水线4位加法器树乘法器。两级流水线4位加法器树乘法器结构如图6.2-3所示。通过在第一级与第二级、第二级与第三级加法器之间插入D触发器组,可以实现两级流水线设计,其Verilog HDL代码如下:35module mul_addtree_2_stag

17、e(clk,clr,mul_a,mul_b,mul_out);input clk,clr;input 3:0 mul_a,mul_b;/IO端口声明output 7:0 mul_out;reg 7:0 add_tmp_1,add_tmp_2,mul_out;wire 7:0 stored0,stored1,stored2,stored3;assign stored3=mul_b3?1b0,mul_a,3b0:8b0;/逻辑设计36assign stored2=mul_b2?2b0,mul_a,2b0:8b0;assign stored1=mul_b1?3b0,mul_a,1b0:8b0;ass

18、ign stored0=mul_b0?4b0,mul_a:8b0;always(posedge clk or negedge clr)/时序控制begin if(!clr)begin37 add_tmp_1=8b0000_0000;add_tmp_2=8b0000_0000;mul_out=8b0000_0000;end else begin add_tmp_1=stored3+stored2;add_tmp_2=stored1+stored0;mul_out=add_tmp_1+add_tmp_2;38 end endendmodule应该指出,在这个Verilog HDL代码中,使用非阻塞

19、赋值方式可以直接实现寄存器的插入,相关内容参照3.2.3节。/*测试代码*/module mult_addtree_2_stag_tb;39 reg clk,clr;reg 3:0mult_a,mult_b;wire 7:0mult_out;mul_addtree_2_stage U1(.mul_a(mult_a),.mul_b(mult_b),.mul_out(mult_out),.clk(clk),.clr(clr);initial begin40 clk=0;clr=0;mult_a=1;mult_b=1;#5 clr=1;end always#10 clk=clk;initial be

20、gin repeat(5)begin#20 mult_a=mult_a+1;mult_b=mult_b+1;41 end endendmodule测试结果如图6.2-4所示。42图6.2-4 两级流水线4位加法器树乘法器的测试结果436.2.2 Wallace 树乘法器树乘法器在乘法器的设计中,采用树形乘法器可以减少关键路径和所需的加法器单元数目。Wallace树乘法器就是其中一种。下面以一个44位的乘法器为例来介绍Wallace树乘法器。Wallace树乘法器原理图如图6.2-5所示,其中FA为全加器,HA为半加器。其基本原理是,加法从数据最密集的地方开始,不断地反复使用全加器、半加器来覆盖

21、“树”。这一级全加器是一个3输入2输出的器件,因此全加器又称为3-2压缩器。通过全加器将树的深度不断缩减,最终缩减为一个深度为2的树。最后一级则采用一个简单的2输入加法器组成。44图6.2-5 Wallace树乘法器原理图45图6.2-6 Wallace树乘法器电路结构46例6.2-3 用Verilog HDL设计如图6.2-6所示的4位Wallace树乘法器。module wallace(x,y,out);parameter size=4;/参数定义 input size-1:0 x,y;output 2*size-1:0 out;/端口声明wire size*size-1:0 a;47 w

22、ire 1:0 b0,b1,c0,c1,c2,c3;/连线类型声明 wire 5:0 add_a,add_b;wire 6:0 add_out;wire 2*size-1:0 out;assign a=x3,x3,x2,x2,x1,x3,x1,x0,x3,x2,x1,x0,x2,x1,x0,x0&48y3,y2,y3,y2,y3,y1,y2,y3,y0,y1,y1,y2,y0,y0,y1,y0;/部分积hadd U1(.x(a8),.y(a9),.out(b0);/2输入半加器 hadd U2(.x(a11),.y(a12),.out(b1);hadd U3(.x(a4),.y(a5),.ou

23、t(c0);fadd U4(.x(a6),.y(a7),.z(b00),.out(c1);/3输入全加器49 fadd U5(.x(a13),.y(a14),.z(b01),.out(c2);fadd U6(.x(b10),.y(a10),.z(b11),.out(c3);assign add_a=c31,c21,c11,c01,a3,a1;/加数 assign add_b=a15,c30,c20,c10,c00,a2;assign add_out=add_a+add_b;assign out=add_out,a0;endmodule50module fadd(x,y,z,out);outpu

24、t 1:0out;input x,y,z;assign out=x+y+z;endmodulemodule hadd(x,y,out);output 1:0out;input x,y;51assign out=x+y;endmodule/*测试代码*/module wallace_tb;reg 3:0 x,y;wire 7:0 out;wallace m(.x(x),.y(y),.out(out);/模块例化 initial /测试信号 begin52 x=3;y=4;#20 x=2;y=3;#20 x=6;y=8;endendmodule测试结果如图6.2-7所示。53图6.2-7 Wall

25、ace树乘法器的测试结果546.2.3 复数乘法器复数乘法器复数乘法的算法是:设复数,则复数乘法结果为 (6.2-1)复数乘法器的电路结构如图6.2-8所示。将复数x的实部与复数y的实部相乘,减去x的虚部与y的虚部相乘,得到输出结果的实部。将x的实部与y的虚部相乘,加上x的虚部与y的实部相乘,得到输出结果的虚部。)bci(adbd)(acdi)bi)(c(ayx55图6.2-8 复数乘法器的电路结构56例6.2-4 用Verilog HDL设计实部和虚部均为4位二进制数的复数乘法器。module complex(a,b,c,d,out_real,out_im);input 3:0a,b,c,d

26、;output 8:0 out_real,out_im;wire 7:0 sub1,sub2,add1,add2;wallaceU1(.x(a),.y(c),.out(sub1);wallace U2(.x(b),.y(d),.out(sub2);wallace U3(.x(a),.y(d),.out(add1);57 wallace U4(.x(b),.y(c),.out(add2);assign out_real=sub1-sub2;assign out_im=add1+add2;endmodule/*测试模块*/module complex_tb;reg 3:0 a,b,c,d;wire

27、 8:0 out_real;58 wire 8:0 out_im;complex U1(.a(a),.b(b),.c(c),.d(d),.out_real(out_real),.out_im(out_im);initial begin a=2;b=2;c=5;d=4;#10 a=4;b=3;c=2;d=1;#1059 a=3;b=2;c=3;d=4;end endmodule测试结果如图6.2-9所示。60图6.2-9 复数乘法器的测试结果616.2.4 FIR滤波器的设计滤波器的设计滤波器就是对特定的频率或者特定频率以外的频率进行消除的电路,被广泛用于通信系统和信号处理系统中。从功能角度而言

28、,数字滤波器对输入离散信号的数字代码进行运算处理,以达到滤除频带外信号的目的。有限冲激响应(FIR)滤波器就是一种常用的数字滤波器,采用对已输入样值的加权和来形成它的输出。其系统函数为 (6.2-2)21czbzax(z)y(z)H(z)62其中z-1表示延迟一个时钟周期,z-2表示延迟两个时钟周期。对于输入序列Xn的FIR滤波器,可用图6.2-10所示的结构示意图来表示,其中Xn是输入数据流。各级的输入连接和输出连接被称为抽头,系数(b0,b1,bn)被称为抽头系数。一个M阶的FIR滤波器将会有M+1个抽头。通过移位寄存器用每个时钟边沿n(时间下标)处的数据流采样值乘以抽头系数,并将它们加起

29、来形成输出Yn。63图6.2-10 FIR滤波器结构示意图64例6.2-5 用Verilog HDL设计一个输入信号位宽为4 bit的8阶FIR滤波器。如图6.2-10所示,FIR滤波器电路有两个主要功能模块:移位寄存器组模块shift_register用于存储串行进入滤波器的数据;乘加计算模块caculator用于进行FIR计算(见式(6.2-2)。因此,在顶层模块中采用结构性的描述方式设计。module FIR(Data_out,Data_in,clock,reset);output 9:0 Data_out;input 3:0 Data_in;input clock,reset;65 w

30、ire 9:0 Data_out;wire 3:0 samples_0,samples_1,samples_2,samples_3,samples_4,samples_5,samples_6,samples_7,samples_8;shift_register U1(.Data_in(Data_in),.clock(clock),.reset(reset),66 .samples_0(samples_0),.samples_1(samples_1),.samples_2(samples_2),.samples_3(samples_3),.samples_4(samples_4),.sample

31、s_5(samples_5),.samples_6(samples_6),.samples_7(samples_7),.samples_8(samples_8);caculator U2(.samples_0(samples_0),.samples_1(samples_1),.samples_2(samples_2),.samples_3(samples_3),.samples_4(samples_4),.samples_5(samples_5),.samples_6(samples_6),.samples_7(samples_7),.samples_8(samples_8),.Data_ou

32、t(Data_out);67endmoduleshift_register模块用于存储输入的数据流,本例中主要负责存储8个位宽为4 bit的输入数据信号,用于caculator模块的输入。module shift_register(Data_in,clock,reset,samples_0,samples_1,samples_2,samples_3,samples_4,samples_5,samples_6,samples_7,samples_8);68input 3:0 Data_in;input clock,reset;output 3:0 samples_0,samples_1,samp

33、les_2,samples_3,samples_4,samples_5,samples_6,samples_7,samples_8;reg 3:0 samples_0,samples_1,samples_2,samples_3,samples_4,samples_5,samples_6,samples_7,samples_8;69 always(posedge clock or negedge reset)begin if(reset)begin samples_0=4b0;samples_1=4b0;samples_2=4b0;samples_3=4b0;samples_4=4b0;70 s

34、amples_5=4b0;samples_6=4b0;samples_7=4b0;samples_8=4b0;end else begin samples_0=Data_in;samples_1=samples_0;samples_2=samples_1;samples_3=samples_2;71 samples_4=samples_3;samples_5=samples_4;samples_6=samples_5;samples_7=samples_6;samples_8=samples_7;end end endmodule72caculator模块用于进行8输入信号与抽头系数的乘法和累

35、加,并产生滤波之后的输出信号Data_out。应该指出的是,FIR滤波器系数具有对称性,在本例中,b0=b8,b1=b7,b2=b6,b3=b5,因此,可以采用先将输入信号相加再与抽头系数相乘的方式,减少乘法器电路的数量和芯片面积。module caculator(samples_0,samples_1,samples_2,samples_3,samples_4,samples_5,samples_6,samples_7,samples_8,Data_out);73input 3:0 samples_0,samples_1,samples_2,samples_3,samples_4,sampl

36、es_5,samples_6,samples_7,samples_8;output 9:0 Data_out;wire 9:0 Data_out;wire 3:0 out_tmp_1,out_tmp_2,out_tmp_3,out_tmp_4,out_tmp_5;wire 7:0 out1,out2,out3,out4,out5;74 parameter b0=4b0010;parameter b1=4b0011;parameter b2=4b0110;parameter b3=4b1010;parameter b4=4b1100;mul_addtree U1(.mul_a(b0),.mul_

37、b(out_tmp_1),.mul_out(out1);mul_addtree U2(.mul_a(b1),.mul_b(out_tmp_2),.mul_out(out2);75 mul_addtree U3(.mul_a(b2),.mul_b(out_tmp_3),.mul_out(out3);mul_addtree U4(.mul_a(b3),.mul_b(out_tmp_4),.mul_out(out4);mul_addtree U5(.mul_a(b4),.mul_b(samples_4),.mul_out(out5);assign out_tmp_1=samples_0+sample

38、s_8;76 assign out_tmp_2=samples_1+samples_7;assign out_tmp_3=samples_2+samples_6;assign out_tmp_4=samples_3+samples_5;assign Data_out=out1+out2+out3+out4+out5;endmodule乘法器模块mul_addtree的代码见例6.2-2。/*测试模块*/77module FIR_tb;reg clock,reset;reg 3:0 Data_in;wire 9:0 Data_out;FIRU1(.Data_out(Data_out),.Data

39、_in(Data_in),.clock(clock),.reset(reset);initial begin78 Data_in=0;clock=0;reset=1;#10 reset=0;end always begin#5 clock=clock;#5 Data_in=Data_in+1;endendmodule测试结果如图6.2-11所示。79图6.2-11 FIR滤波器的测试结果80图6.2-12 RAM的内部结构示意图816.2.5 片内存储器的设计片内存储器的设计片内存储器分为RAM和ROM两大类。本节将分别介绍RAM和ROM的Verilog HDL描述方式。1.RAM的的Veri

40、log HDL描述描述RAM是随机存储器,存储单元的内容可按需随意取出或存入。这种存储器在断电后将丢失所有数据,因此一般用来存储一些短时间内使用的程序和数据。其内部结构如图6.2-12所示。82根据地址总线、数据总线以及读写控制线的数目,可以将RAM分为单端口RAM和双端口RAM两大类。例6.2-6 用Verilog HDL设计深度为8、位宽为8 bit的单端口RAM。单端口RAM只有一套地址总线,读操作和写操作是分开的。其Verilog HDL程序如下:module ram_single(clk,addm,cs_n,we_n,din,dout);input clk;/时钟信号input 2:

41、0 addm;/地址信号83input cs_n;/片选信号input we_n;/写使能信号input 7:0 din;/输入数据output7:0 dout;/输出数据reg 7:0 dout;reg 7:0 raml 7:0;/8*8 bit寄存器always(posedge clk)beginif(cs_n)84 dout=8bzzzz_zzzz;else if(we_n)/读数据 dout=ramladdm;else /写数据 ramladdm=din;endendmodule /*测试程序*85module ram_single_tb;reg clk,we_n,cs_n;reg 2

42、:0addm;reg 7:0din;wire 7:0dout;ram_single U1(.clk(clk),.addm(addm),.cs_n(cs_n),.we_n(we_n),.din(din),.dout(dout);initial86 begin clk=0;addm=0;cs_n=1;we_n=0;din=0;#5 cs_n=0;#315 we_n=1;end always#10 clk=clk;initial begin repeat(7)begin87#40 addm=addm+1;din=din+1;end#40 repeat(7)#40 addm=addm-1;endend

43、module测试结果如图6.2-13所示。88图6.2-13 单端口RAM的测试结果89例6.2-7 用Verilog HDL设计深度为8、位宽为8 bit的双端口RAM。双端口RAM具有两套地址总线,一套用于读数据,另一套用于写数据。二者可以分别进行操作。其Verileg HDL程序如下:module ram_dual(q,addr_in,addr_out,d,we,rd,clk1,clk2);output 7:0 q;/输出数据 input 7:0 d;/输入数据90 input 2:0 addr_in;/写数据地址信号 input 2:0 addr_out;/输出数据地址信号 input

44、 we;/写数据控制信号 input rd;/读数据控制信号 input clk1;/写数据时钟信号 input clk2;/读数据时钟信号 reg 7:0 q;reg 7:0 mem7:0;/8*8 bit寄存器 always(posedge clk1)91 begin if(we)memaddr_in=d;end always(posedge clk2)begin if(rd)q=memaddr_out;endendmodule92/*测试代码*module ram_dual_tb;reg clk1,clk2,we,rd;reg 2:0addr_in;reg 2:0addr_out;reg

45、 7:0d;wire 7:0q;93 ram_dual U1(.q(q),.addr_in(addr_in),.addr_out(addr_out),.d(d),.we(we),.rd(rd),.clk1(clk1),.clk2(clk2);initial begin clk1=0;clk2=0;we=1;rd=0;addr_in=0;addr_out=0;d=0;#320 we=0;rd=1;94 end always begin#10 clk1=clk1;clk2=clk2;end initial begin repeat(7)begin95#40 addr_in=addr_in+1;d=

46、d+1;end#40 repeat(7)#40 addr_out=addr_out+1;endendmodule测试结果如图6.2-14 所示。96图6.2-14 双端口RAM的测试结果972.ROM的的Verilog HDL描述描述ROM即只读存储器,是一种只能读出事先存储的数据的存储器,其特性是存入的数据无法改变。也就是说,这种存储器只能读不能写。由于ROM在断电之后数据不会丢失,所以通常用在不需经常变更资料的电子或电脑系统中,资料并不会因为电源的关闭而消失。例6.2-8 用Verilog HDL设计深度为8、位宽为8 bit的ROM。module rom(dout,clk,addm,cs

47、_n);input clk,cs_n;98input 2:0 addm;output 7:0 dout;reg 7:0 dout;reg 7:0 rom7:0;initial begin rom0=8b0000_0000;rom1=8b0000_0001;rom2=8b0000_0010;rom3=8b0000_0011;99rom4=8b0000_0100;rom5=8b0000_0101;rom6=8b0000_0110;rom7=8b0000_0111;endalways(posedge clk)begin if(cs_n)dout=8bzzzz_zzzz;elsedout=romadd

48、m;end100endmodule/*测试代码*module rom_tb;reg clk,cs_n;reg 2:0addm;wire 7:0dout;rom U1(.dout(dout),.clk(clk),.addm(addm),.cs_n(cs_n);initial 101 begin clk=0;addm=0;cs_n=0;end always#10 clk=clk;initial begin repeat(7)#20 addm=addm+1;endendmodule测试结果如图6.2-15所示。102图6.2-15 ROM的测试结果1036.2.6 FIFO设计设计FIFO(Firs

49、t In First Out)是一种先进先出的数据缓存器,通常用于接口电路的数据缓存。与普通存储器的区别是,没有外部读写地址线,可以使用两个时钟分别进行写操作和读操作。FIFO只能顺序写入数据和顺序读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。104FIFO由存储器块和对数据进出FIFO的通道进行管理的控制器构成,每次只对一个寄存器提供存取操作,而不是对整个寄存器阵列进行。FIFO有两个地址指针,一个用于将数据写入下一个可用的存储单元,一个用于读取下一个未读存储单元的操作。读写数据必须一次进行。其读写过程如图6.2-16所示。10

50、5图6.2-16 FIFO的读写过程106当一个堆栈为空时(图6.2-16(a),读数据指针和写数据指针都指向第一个存储单元;当写入一个数据时(图6.2-16(b),写数据指针将指向下一个存储单元;经过七次写数据操作后(图6.2-16(c),写指针将指向最后一个存储单元;当经过连续八次写操作之后,写指针将回到首单元并且显示堆栈状态为满(图6.2-16(d)。数据的读操作和写操作相似,当读出一个数据时,读数据指针将移向下一个存储单元,直到读出全部的数据,此时读指针回到首单元,堆栈状态显示为空。107一个FIFO的组成一般包括两部分:地址控制部分和存储数据的RAM部分,如图6.2-17所示。地址控

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 大学
版权提示 | 免责声明

1,本文(《Verilog HDL数字集成电路设计原理与应用》课件第6章.ppt)为本站会员(momomo)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|