0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用FPGA内部的RAM以及程序对该RAM的数据读写操作

电子设计 来源:电子设计 作者:电子设计 2022-02-08 15:50 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

作者: ALINX

适用于板卡型号:

AXU2CGA/AXU2CGB/AXU3EG/AXU4EV-E/AXU4EV-P/AXU5EV-E/AXU5EV-P /AXU9EG/AXU15EG

实验Vivado工程为“ram_test”。

RAM是FPGA中常用的基础模块,可广泛用于缓存数据的情况,同样它也是ROM,FIFO的基础。本实验将为大家介绍如何使用FPGA内部的RAM以及程序对该RAM的数据读写操作。

1.实验原理

Xilinx在VIVADO里为我们已经提供了RAM的IP核, 我们只需通过IP核例化一个RAM,根据RAM的读写时序来写入和读取RAM中存储的数据。实验中会通过VIVADO集成的在线逻辑分析仪ila,我们可以观察RAM的读写时序和从RAM中读取的数据。

2.创建Vivado工程

在添加RAM IP之前先新建一个ram_test的工程, 然后在工程中添加RAM IP,方法如下:

2.1 点击下图中IP Catalog,在右侧弹出的界面中搜索ram,找到Block Memory Generator,双击打开。

pIYBAGAJnVSAeGXsAACSoVXg6Dw420.jpg

2.2 将Component Name改为ram_ip,在Basic栏目下,将Memory Type改为Simple Dual Prot RAM,也就是伪双口RAM。一般来讲“Simple Dual Port RAM”是最常用的,因为它是两个端口,输入和输出信号独立。

pIYBAGAJnZuAVsL5AABpBCf6DhU423.jpg

2.3 切换到Port A Options栏目下,将RAM位宽Port A Width改为16,也就是数据宽度。将RAM深度Port A Depth改为512,深度指的是RAM里可以存放多少个数据。使能管脚Enable Port Type改为Always Enable。

pIYBAGAJndmAXtQeAABgeo57cv8714.jpg

2.4 切换到Port B Options栏目下,将RAM位宽Port B Width改为16,使能管脚Enable Port Type改为Always Enable,当然也可以Use ENB Pin,相当于读使能信号。而Primitives Output Register取消勾选,其功能是在输出数据加上寄存器,可以有效改善时序,但读出的数据会落后地址两个周期。很多情况下,不使能这项功能,保持数据落后地址一个周期。

o4YBAGAJnhiAEL0PAABmHquA1Ig967.jpg

2.5 在Other Options栏目中,这里不像ROM那样需要初始化RAM的数据,我们可以在程序中写入,所以配置默认即可,直接点击OK。

2.6 点击“Generate”生成RAM IP。

o4YBAGAJnpqAFxmeAABUFHhi0Pg928.jpg

3. RAM的端口定义和时序

Simple Dual Port RAM 模块端口的说明如下:

o4YBAGAJntiAYfwHAAArNPYwkKo166.png

RAM的数据写入和读出都是按时钟的上升沿操作的,端口A数据写入的时候需要置高wea信号,同时提供地址和要写入的数据。下图为输入写入到RAM的时序图。

pIYBAGAJnxaAbe8SAABg5Avs_LU169.jpg

而端口B是不能写入数据的,只能从RAM中读出数据,只要提供地址就可以了,一般情况下可以在下一个周期采集到有效的数据。

pIYBAGAJn1SAGauYAABXxpG3o8s362.jpg

RAM读时序

4. 测试程序编写

下面进行RAM的测试程序的编写,由于测试RAM的功能,我们向RAM的端口A写入一串连续的数据,只写一次,并从端口B中读出,使用逻辑分析仪查看数据。代码如下

`timescale1ns/1ps ////////////////////////////////////////////////////////////////////////////////// module ram_test( input clk, //25MHz时钟 input rst_n //复位信号,低电平有效 ); //----------------------------------------------------------- reg [8:0] w_addr; //RAM PORTA写地址 reg [15:0] w_data; //RAM PORTA写数据 reg wea; //RAM PORTA使能 reg [8:0] r_addr; //RAM PORTB读地址 wire [15:0] r_data; //RAM PORTB读数据 //产生RAM PORTB读地址 always@(posedge clk ornegedge rst_n) begin if(!rst_n) r_addr 《=9‘d0; elseif(|w_addr) //w_addr位或,不等于0 r_addr 《= r_addr+1’b1; else r_addr 《=9‘d0; end //产生RAM PORTA写使能信号 always@(posedge clk ornegedge rst_n) begin if(!rst_n) wea 《=#11’b0; else begin if(&w_addr)//w_addr的bit位全为1,共写入512个数据,写入完成 wea 《=#11‘b0; else wea 《=#11’b1;//ram写使能 end end //产生RAM PORTA写入的地址及数据 always@(posedge clk ornegedge rst_n) begin if(!rst_n) begin w_addr 《=9‘d0; w_data 《=16’d1; end else begin if(wea) //ram写使能有效 begin if(&w_addr)//w_addr的bit位全为1,共写入512个数据,写入完成 begin w_addr 《= w_addr ;//将地址和数据的值保持住,只写一次RAM w_data 《= w_data ; end else begin w_addr 《= w_addr +1‘b1; w_data 《= w_data +1’b1; end end end end //----------------------------------------------------------- //实例化RAM ram_ip ram_ip_inst ( .clka (clk ),// input clka .wea (wea ),// input [0 : 0] wea .addra (w_addr ),// input [8 : 0] addra .dina (w_data ),// input [15 : 0] dina .clkb (clk ),// input clkb .addrb (r_addr ),// input [8 : 0] addrb .doutb (r_data )// output [15 : 0] doutb ); //实例化ila逻辑分析仪 ila_0 ila_0_inst ( .clk (clk ), .probe0 (r_data ), .probe1 (r_addr ) ); endmodule

为了能实时看到RAM中读取的数据值,我们这里添加了ila工具来观察RAM PORTB的数据信号和地址信号。关于如何生成ila大家请参考”PL的”Hello World”LED实验”。

o4YBAGAJn5KANr5FAAAfFZ8Eu00006.jpg

程序结构如下:

o4YBAGAJn9CAEDn5AAA8UDCQZl0058.jpg

绑定引脚

##################Compress Bitstream############################

set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]set_property PACKAGE_PIN AB11 [get_ports clk]set_property IOSTANDARD LVCMOS33 [get_ports clk]create_clock -period 40.000 -name clk -waveform {0.000 20.000} [get_ports clk]set_property PACKAGE_PIN AA13 [get_ports rst_n]set_property IOSTANDARD LVCMOS33 [get_ports rst_n]

5. 仿真

仿真方法参考”PL的”Hello World”LED实验”,仿真结果如下,从图中可以看出地址1写入的数据是0002,在下个周期,也就是时刻2,有效数据读出。

6. 板上验证

生成bitstream,并下载bit文件到FPGA。接下来我们通过ila来观察一下从RAM中读出的数据是否为我们初始化的数据。

在Waveform的窗口设置r_addr地址为0作为触发条件,我们可以看到r_addr在不断的从0累加到1ff, 随着r_addr的变化, r_data也在变化, r_data的数据正是我们写入到RAM中的512个数据,这里需要注意,r_addr出现新地址时,r_data对应的数据要延时两个时钟周期才会出现,数据比地址出现晚两个时钟周期,与仿真结果一致。

审核编辑:何安

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RAM
    RAM
    +关注

    关注

    8

    文章

    1398

    浏览量

    119826
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    单片机程序的执行

    ,还是差着几个数量级,所以拷贝到DDRRAM中。这时,一个程序的代码和数据是连续存放的,其中代码段是只读区域,数据段是可读写区域(这是由操作
    发表于 12-04 06:20

    芯源MCU的RAM存储器的操作

    用户可执行的RAM 存储器操作包括:读操作、写操作。 对RAM读写
    发表于 11-21 07:46

    双口ram的使用方法

    单口 RAM 只有一个时钟(clka)(时钟上升沿到来时对数据进行写入或者读出)、一组输入输出数据线(dina & douta)、一组地址线(addra)、一个使能端(ena
    发表于 10-29 06:28

    ram ip核的使用

    1、简介 ram 的英文全称是 Random Access Memory,即随机存取存储器, 它可以随时把数据写入任一指定地址的存储单元,也可以随时从任一指定地址中读出数据, 其读写
    发表于 10-23 07:33

    如何利用Verilog HDL在FPGA上实现SRAM的读写测试

    、建立读写操作、配置地址计数器、模拟数据流、综合与仿真以及下载到FPGA进行硬件测试。通过实践,掌握SRAM在
    的头像 发表于 10-22 17:21 3958次阅读
    如何利用Verilog HDL在<b class='flag-5'>FPGA</b>上实现SRAM的<b class='flag-5'>读写</b>测试

    USB读RAM buffer使用规范建议

    Questions:硬件和软件同时去访问 USB RAM buffer 造成数据乱掉或丢失 造成乱码流程: 软件设置 USB Valid 关总中断,USB 收数据RAM Buffe
    发表于 09-22 17:27

    嵌入式系统中,FLASH 中的程序代码必须搬到 RAM 中运行吗?

    嵌入式系统里,FLASH 中的程序代码并非必须搬到 RAM 中运行,这得由硬件配置、实际性能需求和应用场景共同决定。就像很多低端单片机,无论是依赖片内 Flash 还是外挂的 SPI NOR
    的头像 发表于 08-06 10:19 1138次阅读
    嵌入式系统中,FLASH 中的<b class='flag-5'>程序</b>代码必须搬到 <b class='flag-5'>RAM</b> 中运行吗?

    TLE9893 怎么将代码放在ram中运行?

    如题,我希望将我的中断回调函数放进ram中运行以保证他的运行速度更快。那么我怎么修改程序才能做到呢?或者有没有相关的例程给我参考一下。
    发表于 07-14 08:00

    【RK3568+PG2L50H开发板实验例程】FPGA部分 | ROM、RAM、FIFO 的使用

    和功能均一致,不会像 PLL 那样有动态配置以及内部反馈选项的选择等之间的差异,所以是 RAM、ROM、FIFO 是通用的。 2.1. RAM 介绍
    发表于 07-10 10:37

    Xilinx Shift RAM IP概述和主要功能

    Xilinx Shift RAM IP 是 AMD Xilinx 提供的一个 LogiCORE IP 核,用于在 FPGA 中实现高效的移位寄存器(Shift Register)。 IP 核利用
    的头像 发表于 05-14 09:36 838次阅读

    ADSP-21992高性能混合型信号DSP,160MHz,32K字程序存储器RAM,16K字数据存储器RAM技术手册

    ADSP-21992进一步扩展了ADSP-2199x混合信号DSP产品系列的性能,可提供32K字程序存储器RAM和16K字数据存储器RAM。此外,ADSP-21992还可提供片上CAN
    的头像 发表于 05-12 16:08 704次阅读
    ADSP-21992高性能混合型信号DSP,160MHz,32K字<b class='flag-5'>程序</b>存储器<b class='flag-5'>RAM</b>,16K字<b class='flag-5'>数据</b>存储器<b class='flag-5'>RAM</b>技术手册

    浅谈MCU片上RAM

    MCU片上RAM是微控制单元(MCU)中集成于芯片内部的随机存取存储器,主要用于程序运行时的数据存储与高速读写
    的头像 发表于 04-30 14:47 981次阅读

    将指定文件下的函数加载到指定ram问题

    问题:mcuxpresso环境,xip模式下我需要使用flexspi将norflash的一部分作为文件系统,将flex以及fatfs相关函数全部加载到ram,发现rodata仍然在flash地址
    发表于 03-12 17:02

    RAM容量不足导致的数据溢出如何预防和处理?

    在 STM32F411 中,RAM 容量是有限的,特别是在进行复杂的数据处理和存储时,可能会遇到数据溢出问题。数据溢出是指程序运行时,
    发表于 03-07 16:09

    MXD1210非易失RAM控制器技术手册

    MXD1210非易失性RAM控制器是一款超低功耗CMOS电路,可将标准(易失性)CMOS RAM转换为非易失性存储器。它还会持续监控电源,以在RAM的电源处于边际(超出容限)条件时提供RAM
    的头像 发表于 02-28 10:48 772次阅读
    MXD1210非易失<b class='flag-5'>RAM</b>控制器技术手册