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

article/2025/10/9 12:29:52

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

BRAM笔记

  • BRAM介绍
    • 同步双端口BRAM
    • BRAM读写操作
          • (1)读操作
          • (2)写操作
          • (3)写模式
          • 写优先模式
          • 读优先模式
          • 不变模式
    • 双端口块内存接口
    • BRAM IP的使用及仿真验证
      • IP核使用
        • coe文件
        • 将IP核添加到工程
      • 代码
        • verilog代码
        • 仿真代码
      • 仿真结果

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 。内存的结构完全对称, 双端口可互换。
在这里插入图片描述
双端口接口

BRAM读写操作

(1)读操作

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

(2)写操作

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

(3)写模式

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

写优先模式

在第一个时钟的上升沿,将地址aa的数据MEM(aa)读出放在数据总线DO上。在第二个时钟的上升沿,写有效,因此将DI上的1111写入地址bb。因为写优先,所以出现在数据总线上的是新写入的1111。
写优先

读优先模式

在第一个时钟的上升沿,将地址aa的数据MEM(aa)读出放在数据总线DO上。在第二
个时钟的上升沿,写有效,因此将DI上的1111写入地址bb。因为读优先,所以出现在数据总线上的不是新写入的1111,而是原来地址bb的内存的值old MEM(bb)。
读优先

不变模式

在第一个时钟的上升沿,将地址aa的数据MEM(aa)读出放在数据总线DO上。在第二个时钟的上升沿,写有效,因此将DI上的1111写入地址bb。因为不变模式,所以在写有效的时候出现在数据总线上的数据是不变的,仍然是MEM(aa),直到写无效后的第一个时钟上升沿才变为MEM(dd)。
不变模式

双端口块内存接口

在这里插入图片描述

BRAM IP的使用及仿真验证

IP核使用

coe文件

使用matlab生成.coe文件:
.coe文件
l.coe文件内容如下,注意前两行要添加~
在这里插入图片描述

将IP核添加到工程

  1. 在工程管理栏下点击[IP Catalog],然后搜索RAM,找到块RAM生成器[Block Memory Generator],如下图所示:
    在这里插入图片描述
  2. 将组件名称改为“ram”,其他设置如下图所示:
    读写模式改为读优先“Read First”
    在这里插入图片描述

取消勾选Primitives Output Register,不然输出会滞后一个时钟周期
在这里插入图片描述

  1. 在[Other Options]选项中勾选Load Init File,点击Browse添加前面用matlab生成的要存入RAM的初始数据。
    添加初始数据

代码

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 beginclk=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)
beginif(cnt1==8)begincnt1=0;cnt2=cnt2+1;//cnt2低位每9个周期翻转一次endelsecnt1=cnt1+1;
end
//负边沿写地址,写数据输入,写使能信号,保证时钟上升沿时这些值是稳定的
always@(negedge clk)
begindina=cnt1;//数据输入总线是哪个的值是计数值cnt1addra=cnt1;if(cnt2[0]==0) wea=0;//每9个周期写使能翻转else wea=1;
end
endmodule

仿真结果

仿真结果如下图所示:
仿真结果
初始时,在时钟上升沿读取RAM中addra地址(000 ~ 008)下存储的值(100 ~ 108)。
在写使能wea=1之后,因为是读优先,所以先读出该地址的值,再将dina内容写入,所以看到douta的值还是(100 ~ 108)。
写使能结束之后,再读取ram对应地址中的内容,可以看出douta结果为写入的数值(0 ~ 8)。


http://chatgpt.dhexx.cn/article/8lQvnd8D.shtml

相关文章

FPGA从入门到精通(8)-BRAM

所使用EDA软件:VIVADO2018.3 FPGA型号:xc7a35tcsg325-2 很久没写了,随便写一篇BRAM的吧。说到BRAM ,很多人都喜欢拿它来DRAM比较 ,两者都有啥优缺点,其实我也拿不准。不过一般来说,存储较大的数…

Xilinx系列学习(一) BRAM的使用,并用PL读取BRAM数据

Xilinx系列学习(一) BRAM的使用,并用PL读取BRAM数据 一,Xilinx BRAM介绍二,BRAM对应的IP核调用和使用1,BRAM对应的IP核介绍2,BMG例化IP核的调用一,Xilinx BRAM介绍 BRAM 就是Block Memory,是Zynq的PL端的存储RAM单元。可以利用BRAM,在PS和PL之间进行数据的交换。Zyn…

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

FPGA设计中BRAM(Block RAMs)资源的使用 RAM分为BRAM(Block RAMs)和DRAM(Distributed RAM),即块RAM与分布式RAM,这两个差别在于BRAM是FPGA上固有的一些存储资源(针对不同型…

web测试与app测试的区别

目录 前言 首先从系统架构来看 专项测试 安装、卸载、更新: 界面操作: 前言 仅仅从功能测试的层面上来讲的话,在流程和功能测试上是没有区别的。那么区别在哪里呢? 我个人觉得就是由于载体不一样,所以系统测试和…

APP测试与WEB测试

APP测试与WEB测试的区别(异同) 相同点: 功能测试层面而言:APP测试和web测试都是使用相同的测试用例测试方法(都用到等价类划分、边界值分析、正常和异常情况去考虑测试点) UI界面测试:都需要按照原型图和设计图检查UI…

web测试,App测试,小程序测试区别

最近项目真的太忙了,不过,今天无论如何我都要更文章了,谢谢大家的支持,不断努力进步 这篇文章,我就是要梳理一下,web测试,app测试,和小程序的区别 话不多说,上主题 web…

WEB端与移动端测试区别和总结

WEB端与移动端测试区别总结如下: 1、系统架构 WEB端 B/S结构,WEB端的前端一般不做端的区分 WEB端的上线不管是预发布还是N环上线,server上线后,前端同步更新,一般是不存在多个版本的问题; 移动端 C/S结构,移…

Apifox简单了解——WEB端测试的集大成者

文章目录 0 引入1、Postman2、Swagger (丝袜哥)3、Mock4、JMeter5、Apifox6、引用 0 引入 Apifox Postman Swagger Mock JMeter 1、Postman 1 作用 Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件,简单易用的接口测试…

web测试的基本流程

1、web测试流程: (1)web测试 1)参与一个web新项目的测试前,先搜集测试相关的资料,包括原型图、各种需求文档、业务相关等需求相关材料 2)结合第一步搜集到的需求相关资料,自行熟悉系统,同时列出不明白的点,…

Web端测试常用方法

介绍下工作中,Web端测试所涉及到的方法: 前言:Web测试常用的方法,兼容性测试、安全性测试、可用性测试 & 逻辑功能测试 1 > 兼容性测试 先说下兼容性测试,工作中在测试时,一般涉及操作系统测试、浏…

web端测试经验(项目实战经验)

软件测试相信大家已经有一定的了解了,无非就是找bug 找缺陷 找问题 找这个程序(前端、后端)的不足点 以及不人性化的地方 ,由我们监测并提出有效的建议给项目进行缺陷修复以及优化点。软件测试大体分为Web、App两个,当…

这可能是最全的Web测试各个测试点,有这一篇就够了

前言 什么是Web测试? Web测试测试Web或Web应用程序的潜在错误。它是在上线前对基于网络的应用程序进行完整的测试。 Web测试检查 功能测试 易用性测试 接口测试 性能测试 安全测试 兼容性测试 1、功能测试 测试网页中的所有链接、数据库连接、网页中用于提交或从…

【转载】 web项目测试

前言 之前说了APP项目的测试,今天来总结一下web项目的测试,其实大多数过程是差不多类似的。对比平常移动端手机的高频率使用来说,对于部分人使用pc端浏览器的概率就不会这么高,讲APP项目测试的时候没怎么涉及到网络协议部分的介绍…

Web端测试方法

web端通用测试点请移步 1. Web 测试的总体策略 2. Web 测试的范围 √ 功能 √ 性能 √ 界面 √ 兼容性 √ 安全性 √ DB √ 文档 2.1 功能测试 ☆ 功能测试主要从链接、表单、Cookies、设计语言、数据库、文件上传等方面进行。 2.1.1 链接 ☆ 链接也称超链接,…

Redis集群 关闭和重启

1、创建好的redis集群,一下是正常运行的3主3从服务器 2、正常关闭集群服务器 [rootca01 redis-cluster]# cat stopall.sh cd 7001 ./redis-cli -p 7001 shutdown cd .. cd 7002 ./redis-cli -p 7002 shutdown cd .. cd 7003 ./redis-cli -p 7003 shutdown cd .. c…

叫你别随便重启Redis!!!怎么样,数据全丢了吧~~~

目录 事情是这样的... Redis持久化数据的两种模式 一、RDB模式 二、AOF模式 三、RDB和AOF之间的关系 四、问题回顾分析 那么该如何开启AOF增量备份模式呢? 解决方法: 1、登录到redis 2、在线修改AOF开关 3、查看数据 事情是这样的... 今天,跑…

redis集群 服务器重启测试

redis集群 服务器重启测试 1、集群规划:2台服务器 每台服务器运行3个redis实例2、重启2台服务器后redis实例没有自动重启最后一对主从节点比较 重启实例后和之前的主从分配 3、再次重启2台服务器4、主从同步测试 1、集群规划:2台服务器 每台服务器运行3个…

启动redis

目录 could not connect to Redis at 127.0.0.1:6379:由于目标计算机积极拒绝,无法连接 解决办法 启动效果 今天下载了若依框架,本来想运行一下看看效果,结果出现下列问题 org.springframework.beans.factory.UnsatisfiedDependencyExcept…

Redis集群的关闭、启动、重启等相关指令

目录 关闭 启动 重启 (保留原有集群的)重启 (删除原有集群的)重启 集群相关指令 查看集群相关指令 查看集群状态信息 查看集群节点信息 关闭: 方式一:进入redis后,使用SHUTDOWN指令或SHUTDOWN SAVE指令或SHUTDOWN NOSAVE指令。 方式二(不…

docker-redis一直重启

现象 查看该容器的日志 docker logs f3be1896ecd8结论 当前mongo-redis/log下面没有redis.log 文件导致读取失败 解决方案 在mongo-redis/log目录下新建redis.log文件 遗留问题 测试发现在使用docker-compose up -d后会生成redis.log 删除当前redis.log,重启容…