双口RAM概述及Vivado RAM IP核应用_第1页
双口RAM概述及Vivado RAM IP核应用_第2页
双口RAM概述及Vivado RAM IP核应用_第3页
双口RAM概述及Vivado RAM IP核应用_第4页
双口RAM概述及Vivado RAM IP核应用_第5页
已阅读5页,还剩9页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

双口RAM概述及VivadoRAMIP核应用1.双口RAM概述双口RAM(dualportRAM)在异构系统中应用广泛,通过双口RAM,不同硬件架构的芯片可以实现数据的交互,从而实现通信。例如,一般情况下,ARM与DSP之间的通信,可以利用双口RAM实现,ARM通过EBI总线连接到双口RAM的A口,DSP通过EMIF总线(也可以是uPP总线,取决于速度需求)连接到双口RAM的B口,两者对同一块存储区域进行操作,即可实现两者的数据交互。但是,因为双口RAM的A口和B口都可以对相同的内存地址进行操作,这就引出了一个问题——假如通信双方在两个端口对同一地址同时读写,就会引发冲突。要解决这个问题,办法有二。一是通信双方在时序上保证不会同时读写同一地址,将ARM和DSP可写地址范围进行分区,无论任何一方写完数据后都通过IO发送中断通知对方,对方进行数据读取(乒乓RAM操作),这样是比较可靠的;另外一个办法就是在fpga里设置写busy信号,实现两端写同步[]。在FPGA中,构建双口RAM可以通过两种方法,一种是利用distributedRAM构建,另一种是利用BlockRAM构建,关于两者的具体区别,可以参考这两篇文章[][]。简而言之,BlockRAM是是使用FPGA中的整块双口RAM资源,而distributedRAM则是用FPGA中的逻辑资源拼凑形成的。一般的原则是,较大的存储应用,建议用bram;零星的小ram,一般就用dram。在Vivado中,RAMIP核在Memories&StrorageElements\RAM&ROMs和RAM&ROMs&BRAM文件夹下,如图所示,下面简要介绍一下Vivado的双口RAMIP核。(图1.1)2.Vivado双口RAMIP核2.1BlockMemoryGenerator概述点击图1.1的BlockMemoryGenerator项,利用BRAM来构建双口RAM。BlockMemoryGenerator窗口如图2.1所示。图中,第1部分,在IPsymbol选项卡,点击“+”号可以展开端口具体信号,如图2.2所示。第2部分,ComponentName可以设置IP核的名字。第3部分,Basic选项卡,在MemoryType下拉列表中,可以设置内存的类型,如图2.3所示。BlockMemoryGnerator一共可以产生5种不同类型的内存空间,其中blockRAM有三种:单口RAM、简化双口RAM和真双口RAM[]。单口RAM只有一个端口(A端口),可以对A端口进行读写。简化双口RAM有两个端口(A和B端口),但是A端口只能进行写入操作,不能进行读出操作,而B端口则只能进行读出操作,不能进行写入操作。真双口RAM有两个端口(A和B端口),A和B端口都能进行读写操作[]。(图2.1)(图2.2)(图2.3)2.2真双口RAM的设置2.2.1Basic设置在Basic选项卡的Memorytype选项中选择真双口RAM,IPSymbol如图2.4所示。ECCOptions为默认设置,WriteEnable中也选择默认设置,不使能字节写,AlgorithmOptions选择默认设置。(图2.4)2.2.2Port设置点击PortAOptions选项卡,对A端口进行设置,设置WriteWidth为16(即RAM单元为16位),WriteWidth为1024(即内存深度为1024,该端口可读写的RAM单元有1024个),OperatingMode(操作模式)一共有三种:WriteFirst,ReadFirst,NoChange。在WriteFirst模式中,在一个时钟周期里,写入内存单元的数据被同步输出到输出数据总线上;在ReadFirst模式中,在一个时钟周期里,写入到内存单元的数据是当前输入数据总线上的数据,而输出到输出数据总线上的数据则是上一个时钟周期存储在内存单元中的数据。细节可参考PG058的49到50页4。EnablePortType设置为AlwaysEnabled,一直使能端口A。其它设置使用默认设置。如图2.5所示。(图2.5)端口B设置为与A一致。在OtherOptions选项卡中,保留默认设置。LoadInitFile设置是否用Coe文件对内存区域初始化,这个在初始化ROM的时候会用到,这里不勾选,保持默认。最后,在Summary选项卡会显示消耗的资源。3.双口RAM例程例程1,该例程是Altera官方例程[],采用寄存器构建双口RAM,代码如下:moduletrue_dpram_sclk(input[7:0]data_a,data_b,input[5:0]addr_a,addr_b,inputwe_a,we_b,clk,outputreg[7:0]q_a,q_b);//DeclaretheRAMvariablereg[7:0]ram[63:0];//PortAalways@(posedgeclk)beginif(we_a)beginram[addr_a]《=data_a;q_a《=data_a;endelsebeginq_a《=ram[addr_a];endend//PortBalways@(posedgeclk)beginif(we_b)beginram[addr_b]《=data_b;q_b《=data_b;endelsebeginq_b《=ram[addr_b];endendendmodule例程2,该例程是Xilinx官方例程[],采用寄存器构建真双口RAM,代码如下://Dual-PortBlockRAMwithTwoWritePorts//File:rams_16.vmodulev_rams_16(clka,clkb,ena,enb,wea,web,addra,addrb,dia,dib,doa,dob);inputclka,clkb,ena,enb,wea,web;input[9:0]addra,addrb;input[15:0]dia,dib;output[15:0]doa,dob;reg[15:0]ram[1023:0];reg[15:0]doa,dob;always@(posedgeclka)beginif(ena)beginif(wea)ram[addra]《=dia;doa《=ram[addra];endendalways@(posedgeclkb)beginif(enb)beginif(web)ram[addrb]《=dib;dob《=ram[addrb];endendendmodule例程3,该例程是网友博客中的例程[],代码如下:moduleTOP(inputUSER_CLK);`defineDLY#1regFPGA_Enable=0;reg[3:0]FPGA_Write_Enable=4‘h0;reg[31:0]FPGA_Address=0;reg[31:0]FPGA_Write_Data=0;reg[31:0]FPGA_Read_Data_reg=0;wire[31:0]FPGA_Read_Data;reg[10:0]count=0;always@(posedgeUSER_CLK)begincount《=count+1;if(count《=100)beginFPGA_Enable《=0;FPGA_Write_Enable《=4’h0;endelseif((count《=105)&&(count》100))beginFPGA_Enable《=1;FPGA_Write_Enable《=4‘hf;FPGA_Address《=FPGA_Address+4;FPGA_Write_Data《=FPGA_Write_Data+1;endelseif((count《=110)&&(count》105))beginFPGA_Enable《=0;FPGA_Write_Enable《=4’h0;FPGA_Address《=0;FPGA_Write_Data《=0;endelseif((count《=117)&&(count》110))beginFPGA_Enable《=1;FPGA_Write_Enable《=4‘h0;FPGA_Read_Data_reg《=FPGA_Read_Data;FPGA_Address《=FPGA_Address+4;endelseif(count==118)beginFPGA_Enable《=0;count《=count;endendBBBByour_instance_name(.clka(USER_CLK),//inputclka.ena(FPGA_Enable),//inputena.wea(FPGA_Write_Enable),//input[3:0]wea.addra(FPGA_Address),//input[31:0]addra.dina(FPGA_Write_Data),//input[31:0]dina.douta(FPGA_Read_Data),//output[31:0]douta.clkb(clkb),//inputclkb.enb(enb),//inputenb.web(web),//input[3:0]web.addrb(addrb),//input[31:0]addrb.dinb(dinb),//input[31:0]dinb.doutb(doutb)//output[31:0]doutb);endmodule该例程中,在count为101(》100)后开始往地址4到20写入1-5,然后在count为111(》110)的时候读出写入的数据。4.仿真下面利用Modelsim和Vivado进行联合仿真,关于vivado如何与modelsim进行联合仿真可以参考这篇文章:vivado与modelsim的关联以及器件库编译有一点要注意的是,我用的是Vivado2017.1版本,这个版本只支持Modelsim10.5及以上的版本,如果是低版本的Modelsim,在用Vivado2017.1编译Modelsim的仿真库时,会出错。Modelsim10.5版本可以在这里下载:modelsim10.5适用vivado2017.1用Modelsim仿真时,会在sim_1/behav文件夹下产生3个.do文件,分别是xx_compile.do,xx_simulate.do,xx_wave.do文件。在设计的verilog文件修改之后,如果在Modelsim中直接restart,仿真的其实还是没有修改前的文件,要使修改的.v文件在Modelsim中生效,可以在Modelsim的命令窗口输入doxx_compile.do文件,对仿真的库文件以及设计文件(.v文件)重新编译,然后在输入doxx_simulate.do文件,才能仿真修改后的文件。输入doxx_compile.do命令对设计文件重新编译的时候,Modelsim会强制退出,这时由最后一句forcequit命令引起的,只要把它删掉就行了。如果要保存波形文件,可以saveformat,另存为xx_wave.do文件。参考上面双口RAM的例程3进行功能仿真,RAMIP使用WriteFirst模式,设计文件代码如下:`timescale1ns/1ps////////////////////////////////////////////////////////////////////////////////////Company://Engineer:////CreateDate:2017/12/0922:36:48//DesignName://ModuleName:dual_port_ram_demo//ProjectName://TargetDevices://ToolVersions://Description:////Dependencies:////Revision://Revision0.01-FileCreated//AdditionalComments:////////////////////////////////////////////////////////////////////////////////////moduledual_port_ram_demo(inputUSER_CLK);`defineDLY#1//PortAdeclarationregFPGA_Enable=0;regFPGA_Write_Enable=0;reg[31:0]FPGA_Address=0;reg[31:0]FPGA_Write_Data=0;reg[31:0]FPGA_Read_Data_reg=0;wire[31:0]FPGA_Read_Data;//PortBdeclarationregenb=0;reg[3:0]web=4’h0;reg[31:0]addrb=0;reg[31:0]dinb=0;reg[31:0]doutb_reg=0;wire[31:0]doutb=0;reg[10:0]count=0;always@(posedgeUSER_CLK)begincount《=count+1;if(count《=100)beginFPGA_Enable《=1;FPGA_Write_Enable《=0;endelseif((count《=105)&&(count》100))beginFPGA_Enable《=1;FPGA_Write_Enable《=1;FPGA_Address《=FPGA_Address+4;FPGA_Write_Data《=FPGA_Write_Data+1;endelseif((count《=110)&&(count》105))beginFPGA_Enable《=1;FPGA_Write_Enable《=0;FPGA_Address《=0;FPGA_Write_Data《=0;endelseif((count《=117)&&(count》110))beginFPGA_Enable《=1;FPGA_Write_Enable《=1;FPGA_Read_Data_reg《=FPGA_Read_Data;FPGA_Address《=FPGA_Address+4;endelseif(count==118)beginFPGA_Enable《=0;count《=count;endenddpRAMu1(.clka(USER_CLK),//inputclka.ena(FPGA_Enable),//inputena.wea(FPGA_Write_Enable),//input[3:0]wea.addra(FPGA_Address),//input[31:0]addra.dina(FPGA_Write_Data),//input[31:0]dina.douta(FPGA_Read_Data),//output[31:0]douta.clkb(USER_CLK),//inputclkb.enb(enb),//inputenb.web(web),//input[3:0]web.addrb(addrb),//input[31:0]addrb.dinb(dinb),//input[31:0]dinb.doutb(doutb)//output

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论