FPGA — BRAM学习笔记—读写操作

这篇具有很好参考价值的文章主要介绍了FPGA — BRAM学习笔记—读写操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用软件: Vivado
开发板: EGO1采用Xilinx Artix-7系列XC7A35T-1CSG324C FPGA

BRAM介绍

BRAM 即块 RAM, 是 FPGA 的固有硬件资源。 另一种形式的 RAM 是分布RAM(Distribution RAM), 是由 FPGA 逻辑资源查找表 LUT 拼起来的 。这两种 RAM 最本质的区别是块RAM 默认输入有寄存器,所以它在读、写使能信号后的下个时钟边沿返回数据,而分布式RAM就没有,就是个组合逻辑,读、写使能的同一时刻返回数据。从时序的角度上来说,块RAM更好,唯一不足的是,它是珍贵的硬件资源。一般来说,芯片越高级,块RAM资源越多。

Artix- - 7 FPGA 的最高型号具有可分配的 13Mbit双端口BRAM, 而实验电路板选型的XC7A35T具备 18Kbit 的BRAM100 个 ,36Kbit 的BRAM 50 个,共1800Kbit 。 Xilinx 7系列 FPGA 可将 BRAM 配置为同步双端口 RAM或单端口 RAM。

同步双端口BRAM

方便通过一个端口写的同时可以从另一个端口进行读取
每个真正的双端口的36Kbit BRAM 包含 36Kbit 个存储单元以及2个完全独立的访问接口A 和B 。每个 18Kbit BRAM 双端口内存包含18Kbit 个存储单元以及2个完全独立的访问接口A和B 。内存的结构完全对称, 双端口可互换。
vivado对bram进行连续读操作,FPGA,fpga开发,学习
vivado对bram进行连续读操作,FPGA,fpga开发,学习

BRAM读写操作

(1)读操作

读操作是在一个时钟边沿完成读取RAM指定单元(读地址)内容的操作。首先将读取地址寄存在读端口,并在RAM读取时间之后将存储的数据加载到输出锁存器中。当使用输出寄存器时,读操作需要一个额外的等待周期

(2)写操作

写操作是一个时钟边沿写入RAM的操作。写地址寄存在写入端口,数据输入存储在内存中。

(3)写模式

写模式有三种,决定了写入时钟边沿后,有效数据出现在输出锁存器的时间。
三种模式是: 写优先模式WRITE_FIRST读优先模式READ_FIRST不变模式。每个端口的写模式可以通过配置过程单独配置。
默认模式是写优先模式,在这种模式总是将最新写入的数据送到输出总线上。
在读优先模式,当新的数据被写入时,仍然输出先前存储的数据。
在不变模式,输出总线上保持先前的输出。

写优先模式

在第一个时钟的上升沿,将地址aa的数据MEM(aa)读出放在数据总线DO上。在第二个时钟的上升沿,写有效,因此将DI上的1111写入地址bb。因为写优先,所以出现在数据总线上的是新写入的1111。
vivado对bram进行连续读操作,FPGA,fpga开发,学习

读优先模式

在第一个时钟的上升沿,将地址aa的数据MEM(aa)读出放在数据总线DO上。在第二
个时钟的上升沿,写有效,因此将DI上的1111写入地址bb。因为读优先,所以出现在数据总线上的不是新写入的1111,而是原来地址bb的内存的值old MEM(bb)。
vivado对bram进行连续读操作,FPGA,fpga开发,学习

不变模式

在第一个时钟的上升沿,将地址aa的数据MEM(aa)读出放在数据总线DO上。在第二个时钟的上升沿,写有效,因此将DI上的1111写入地址bb。因为不变模式,所以在写有效的时候出现在数据总线上的数据是不变的,仍然是MEM(aa),直到写无效后的第一个时钟上升沿才变为MEM(dd)。
vivado对bram进行连续读操作,FPGA,fpga开发,学习

双端口块内存接口

vivado对bram进行连续读操作,FPGA,fpga开发,学习

BRAM IP的使用及仿真验证

IP核使用

coe文件

使用matlab生成.coe文件:
vivado对bram进行连续读操作,FPGA,fpga开发,学习
l.coe文件内容如下,注意前两行要添加~
vivado对bram进行连续读操作,FPGA,fpga开发,学习

将IP核添加到工程
  1. 在工程管理栏下点击[IP Catalog],然后搜索RAM,找到块RAM生成器[Block Memory Generator],如下图所示:
    vivado对bram进行连续读操作,FPGA,fpga开发,学习
  2. 将组件名称改为“ram”,其他设置如下图所示:
    读写模式改为读优先“Read First”
    vivado对bram进行连续读操作,FPGA,fpga开发,学习

取消勾选Primitives Output Register,不然输出会滞后一个时钟周期
vivado对bram进行连续读操作,FPGA,fpga开发,学习

  1. 在[Other Options]选项中勾选Load Init File,点击Browse添加前面用matlab生成的要存入RAM的初始数据。
    vivado对bram进行连续读操作,FPGA,fpga开发,学习

代码

verilog代码
`timescale 1ns / 1ps
//
// Module Name: BRAM_test
// Revision 0.01 - File Created
// Additional Comments:
// 
//
module BRAM_test(clk,ena,wea,addra,dina,douta);
input clk,ena,wea;
input[9:0] addra;
input[14:0] dina;
output[14:0] douta;

ram ram(clk,ena,wea,addra,dina,douta);

endmodule
仿真代码
`timescale 1ns / 1ps
//
// Create Date: 2022/10/20 10:59:14
// Design Name: 
// Module Name: sim_bram
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module sim_bram();
reg clk;//时钟输入
reg wea;//写使能
reg[9:0] addra;//地址输入
reg[14:0] dina;//数据输入
wire[14:0] douta;//数据输出
reg[9:0] cnt1,cnt2;
initial begin
    clk=0;
    wea=0;
    cnt1=0;
    cnt2=0;
end
BRAM_test uut(//调用被仿真的模块完成内存读写
.clk(clk),
.ena(1),
.wea(wea),
.addra(addra),
.dina(dina),
.douta(douta)
);
always #10 clk=~clk;//周期20ns,模拟50M时钟
always@(posedge clk)
begin
    if(cnt1==8)
    begin
        cnt1=0;
        cnt2=cnt2+1;//cnt2低位每9个周期翻转一次
    end
    else
        cnt1=cnt1+1;
end
//负边沿写地址,写数据输入,写使能信号,保证时钟上升沿时这些值是稳定的
always@(negedge clk)
begin
    dina=cnt1;//数据输入总线是哪个的值是计数值cnt1
    addra=cnt1;
    if(cnt2[0]==0) wea=0;//每9个周期写使能翻转
    else wea=1;
end
endmodule

仿真结果

仿真结果如下图所示:
vivado对bram进行连续读操作,FPGA,fpga开发,学习
初始时,在时钟上升沿读取RAM中addra地址(000 ~ 008)下存储的值(100 ~ 108)。
在写使能wea=1之后,因为是读优先,所以先读出该地址的值,再将dina内容写入,所以看到douta的值还是(100 ~ 108)。
写使能结束之后,再读取ram对应地址中的内容,可以看出douta结果为写入的数值(0 ~ 8)。文章来源地址https://www.toymoban.com/news/detail-790899.html

到了这里,关于FPGA — BRAM学习笔记—读写操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA设计中BRAM(Block RAMs)资源的使用(综合为BRAM)

      RAM分为BRAM(Block RAMs)和DRAM(Distributed RAM),即块RAM与分布式RAM,这两个差别在于BRAM是FPGA上固有的一些存储资源(针对不同型号的FPGA,其存储资源大小会有差别),而DRAM则是由LUT组合而成的。所以在数据量较大的情况下,一般使用BRAM,尽量避免使用DRAM,导致LUT资源的

    2024年01月17日
    浏览(37)
  • FPGA | BRAM和DRAM

    Block ram 由一定数量固定大小的存储块构成的,使用 BLOCK RAM 资源不占用额外的逻辑资源,并且速度快。 但是 使用的时候消耗的 BLOCK RAM 资源是其块大小的整数倍 。如 Xilinx公司的结构中每个 BRAM 有 36Kbit 的容量,既可以作为一个 36Kbit 的存储器使用,也可以拆分为两个独立的

    2024年02月12日
    浏览(44)
  • 【FPGA/数字IC】Multiport RAM,多读多写寄存器-——基于FPGA BRAM的多端口地址查找表与FPGA BRAM的资源分析

    目录 背景 手写Multiport Ram Multiport RAM 代码方案 资源评估 Multiport RAM 资源利用的优化 资源评估 防止读写冲突的组合逻辑设计(写优先) 仿真和时序 单口写数据 单端口读数据 多口读相同数据 多口同时读不同数据 背景         在多端口交换机的设计中,交换机的每个端口

    2024年04月26日
    浏览(44)
  • [FPGA IP系列] 2分钟了解FPGA中的BRAM

    FPGA设计中,BRAM是一项非常关键的内置存储资源,FPGA开发需要熟练使用BRAM,今天再复习一下BRAM的知识,包括BRAM的定义、组成、应用等等。 RAM是Random Access Memory,也就是随机访问数据存储器,RAM的内部是一个一个小内存单元(可以看成是一个小格子)组成。 每个内存单元都对应

    2024年02月12日
    浏览(49)
  • [FPGA IP系列] BRAM IP参数配置与使用示例

    FPGA开发中使用频率非常高的两个IP就是FIFO和BRAM,上一篇文章中已经详细介绍了Vivado FIFO IP,今天我们来聊一聊BRAM IP。 本文将详细介绍Vivado中BRAM IP的配置方式和使用技巧。 1、打开BRAM IP核 在Vivado的IP Catalog中找到Block Memory Generator IP核,双击打开参数配置界面。 2、配置BRAM I

    2024年02月04日
    浏览(46)
  • vivado报错 Validation Failed:User configuration exceeds BRAM count in the selected device!

    最近课设,使用vivado调用一个rom的IP,但是报错如上,从网上查阅说是FPGA的资源不够,但是我的资源量肯定是足够的,为此,不得其解,经猜测试验,最终问题是由于给的深度(下图中的Port A Depth)大于存储的数据量太多;将深度减少部分即可;  

    2024年02月14日
    浏览(46)
  • PS和PL使用BRAM进行数据交互

    BRAM(Block RAM)是 PL 部分的存储器阵列,PS 和 PL 通过对 BRAM 进行读写操作,来实现数据的交互。在 PL 中,通过输出时钟、地址、读写控制等信号来对 BRAM 进行读写操作。而在 PS 中,处理器并不需要直接驱动 BRAM 的端口,而是通过 AXI BRAM 控制器来对 BRAM 进行读写操作。AXI BR

    2024年02月02日
    浏览(38)
  • FPGA原理与结构(8)——块RAM(Block RAM,BRAM)

    系列文章目录:FPGA原理与结构(0)——目录与传送门         大家对于RAM应该并不陌生,RAM就是一张可读可写的存储表,它经常被拿来与ROM进行对比,相比之下,ROM只可读。而在FPGA中,RAM一般可以分成两种,一种是使用LUT资源组成的分布式RAM(DRAM),另一种就是块RAM(B

    2024年02月08日
    浏览(37)
  • 如何创建 Xilinx BRAM 或 ROM 初始化文件(.COE)并实现初始化数据在 FPGA 上的载入

    如何创建 Xilinx BRAM 或 ROM 初始化文件(.COE)并实现初始化数据在 FPGA 上的载入 在 FPGA 开发中,初始化数据是一个非常重要的内容,它决定了电路从上电开始的初始状态,对于保证正确性和可靠性有着至关重要的作用。其中,BRAM(Block RAM)和 ROM(Read-Only Memory)是两种常见的

    2024年02月09日
    浏览(49)
  • VIM 编辑器: Bram Moolenaar

        VIM 用了很长时间, 个人的 VIM 配置文件差不多10年没有更新了。以前写程序的时候, 编辑都用这个。 linux kernel, boost规模的代码都不在话下。现在虽然代码写的少了,依然是我打开文件的首选。     现在用手机了,配个蓝牙键盘就可以随时随地撸代码。     纪念下

    2024年02月13日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包