Xinlinx FPGA内的存储器BRAM全解

目录

    • 一、总体概述
      • 1.7系列FPGA的BRAM特点
      • 2.资源情况
    • 二、BRAM分类
      • 1.单端口RAM
      • 2.简单双端口RAM
      • 3.真双端口RAM
    • 三、BRAM的读写
      • 1、Primitives Output Registers读操作注意事项
      • 2.三种写数据模式
        • (1)Write_First
        • (2)Read_First
        • (3)No_change
      • 3.读写冲突
        • (1)读写时钟同步
        • (2)读写时钟异步
    • 四、三种BRAM实现算法
      • 1.最小面积
      • 2.低功耗
      • 3.固定原语

一、总体概述

Xilinx 7系列fpga中的块RAM存储高达36 Kb的数据,可以配置为两个独立的18 Kb BRAM或一个36 Kb RAM。

每个36Kb块RAM也可以配置成深度×宽度为64K × 1(当与相邻的36KB块RAM级联时)、32K × 1、16K × 2、8K × 4、4K × 9、2K × 18、1K × 36或512 × 72的简单双端口模式。
每个18Kb块RAM可以配置成深度×宽度为16K × 1、8K × 2、4K × 4、2K × 9、1K × 18或512 × 36的简单双端口模式。

为什么36Kb会配置为32K×1,少的那4Kb去哪了?

1.7系列FPGA的BRAM特点

7系列FPGA的BRAM特点如下:

  • 每块的存储能力达到36Kbits
  • 可以配置成两个独立的18Kb BRAM或一个36Kb的BRAM
  • 每个36Kb的BRAM可以设置为512×72的简单双端口模式,每个18Kb的BRAM可以配置为512×36的简单双端口模式
  • 简单双端口RAM的两个端口宽度可以不一致
  • 两个相邻的块RAM可以组合成一个更深的64K x 1的存储器,而无需任何外部逻辑
  • 每36 Kb BRAM或36 Kb FIFO提供一个64位纠错编码块,独立的编码/解码功能。在ECC模式下注入错误的能力
  • 输出的同步设置/复位为初始值可用于块RAM输出的锁存器和寄存器模式
  • 单独的同步Set/Reset引脚独立控制块RAM中可选输出寄存器和输出锁存阶段的Set/Reset
  • 将块RAM配置为同步FIFO以消除标志延迟不确定性的属性
  • 7系列FPGA中的FULL标志在没有任何延迟的情况下被断言
  • 18、36或72位宽的块RAM端口可以为每个字节启用单独的写入
  • 每个36Kb BRAM包含可选的地址和控制电路,作为内置的双时钟FIFO存储器,但是无法将36Kb的BRAM当作两个18Kb的FIFO(因为无法共享FIFO控制逻辑
  • 输出数据路径有一个可选的内部寄存器,强烈建议使用该寄存器。这允许更高的时钟速率,但是它增加了一个时钟周期延迟

2.资源情况

在7系列FPGA中,块RAM按列排列。7系列设备的块RAM资源总数如下图所示。36kb块可级联,以最小的时间损失实现更深更宽的内存。

N

在这里插入图片描述

二、BRAM分类

1.单端口RAM

只有一个端口,该端口可读可写。

在这里插入图片描述

2.简单双端口RAM

有两个端口A和B,A端口用于写数据B端口用于读数据。读写数据位宽可以是倍数关系,最大为32倍。

在这里插入图片描述

3.真双端口RAM

有两个端口A和B,A、B端口均能读写数据。读写数据位宽可以是倍数关系,最大为32倍。

在这里插入图片描述

三、BRAM的读写

1、Primitives Output Registers读操作注意事项

在使用BRAM IP核时我们会发现有一个选项位Primitives Output Registers:

在这里插入图片描述

勾选它时需要注意的事项:

在这里插入图片描述

在锁存模式下,读操作使用一个时钟边。读地址在读端口上寄存,存储的数据在RAM访问时间之后加载到输出锁存器中。当使用输出寄存器时,读取操作需要一个额外的延迟周期。可以参考下面这篇文章,是一年多以前遇到的双口RAM数据丢失问题,当时给出了自己的猜想,没想到在这时候完成了闭环。

双口RAM输出数据丢失问题_双口ram读取不到最后一个数据-CSDN博客

2.三种写数据模式

当端口向某一个地址写数据,此时这个地址下RAM的数据输出DOUT的结果会是新写的数据还是原来的数据呢?这就和端口的写模式有关系了。

(1)Write_First

写优先模式下,写入数据的将数据写入内存,并将数据传递到输出中。即读出的数据会是新写的数据,时序图如下:

在这里插入图片描述

可以发现,当向地址bb写入1111时,RAM在地址bb下的输出也会变为1111.

(2)Read_First

读优先模式下,输出会是原有的数据,时序图如下:

在这里插入图片描述

输出的内容是old mem(bb),即bb地址下的旧数据。

(3)No_change

No_change模式下,输出锁存器在写操作期间保持不变。

在这里插入图片描述

我们可以发现当检测到写使能为高时,输出一直保持MEM(aa)不变,直到检测到写使能为低,才会输出当前地址的数据,这种模式使用的功耗最低。

3.读写冲突

对于双端口RAM而言,当一个端口写另一个端口读时会存在读写冲突的可能,对于真双口RAM而言当两个端口同时写时还会出现写-写冲突的可能。

我们以读写时钟是否同步来分析:

(1)读写时钟同步
  • 对于真双口RAM规定

    两个端口不能同时写

    两个端口可以同时读

    可以一读一写

  • 对于简单双口RAM无规定

(2)读写时钟异步
  • 对于真双口RAM规定

    两个端口不能同时写

    两个端口可以同时读

    不能一写一读

  • 对于简单双口RAM

    不能一写一读,读写需要分开

四、三种BRAM实现算法

在Block Memory Generator IP中,生成RAM时有三种算法选项,分别是:

  • 最小面积(MinimumArea)
  • 低功耗(Low Power)
  • 固定原语(Fixed Primitives)

根据Xinlinx官方手册,下面以3K×16和5K×17的端口RAM为例介绍

1.最小面积

最小面积算法使所用的BRAM原语数量最少,同时减少了输出多路复用

在这里插入图片描述

在3k×16RAM的实现中,我们用到了三个18Kb的RAM。为了能够形成对比,我们将3个1K×18的BRAM放在一列构成一个3k×16,如下图。

在这里插入图片描述

我们可以发现,在水平和垂直方向上两种方法构成的Memory长度一致,那最小面积是怎么体现出来的呢?这是因为在各个BRAM构成的RAM输出时,需要进行选择。比如对于最小面积算法,在输出时需要对上面2k×19的输出和1k×18的输出进行选择,因此只需要一个2选1多路复用器。那上面两个相邻的2K×19需要进行选择吗,其实是不用的,两个9bit宽的RAM共同构成了要输出的16bit,任何时候都是拼在一起的不需要选择。

2.低功耗

低功耗算法可以最大限度地减少在读或写操作期间启用的原语数量。该算法没有针对面积进行优化,可能比最小面积算法使用更多的BRAM和多路复用器。

在这里插入图片描述

比如在上述3k×16的Memory中,3个1k×18的垂直方向排列,3个输出通过多路复用器输出到RAM外。当地址处于0-1k时只有上面一个RAM被启用,其余两个RAM不用使能,因此可以降低功耗。

3.固定原语

固定原语算法允许选择单个BRAM原语类型。内核通过在宽度和深度上连接这个单一的原语类型来构建内存。固定原语算法提供了16kx1、8kx2、4kx4、2kx9、1kx18和512x36原语的选择。

在这里插入图片描述

在这里插入图片描述
Xinlinx官方文档参考如下:
Block Memory Generator v8.4 Product Guide (PG058) • 查看器 • AMD 技术信息门户
7 Series FPGAs Memory Resources User Guide (UG473) • 查看器 • AMD 技术信息门户

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/568514.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSS 04

去掉 li 前面的 项目符号(小圆点) 语法 list-style: none;圆角边框 border-radius 属性用于设置元素的外边框圆角。 语法 border-radius:length;参数值可以为数值或百分比的形式如果是正方形,想要设置为一个圆,把数值修改为高度或者宽度的一半即可&a…

百度GL地图实现选点获取经纬度并且地址逆解析

index.html引入 <script src"https://api.map.baidu.com/api?typewebgl&v1.0&ak你的ak"></script>组件使用 <el-input:disabled"[详情].includes(title)"v-model"formData.site"placeholder""><templat…

OpenHarmony南向开发案例:【 智能家居中控】

应用场景简介 智能家居。 今天打造的这一款全新智能家庭控制系统&#xff0c;凸显应用在智能控制和用户体验的特点&#xff0c;开创国内智能家居系统体验新局面。新的系统主要应用在鸿蒙生态。 工程版本 系统版本/API版本&#xff1a;OpenHarmony SDK API 8IDE版本&#xf…

java使用Sokcet和ServerSocket类实现tcp通信

TCP通信&#xff1a; 面向连接&#xff0c;可靠通信 创建客户端程序&#xff0c;使用Socket类 Socket: public Socket(String host, int port) Creates a stream socket and connects it to the specified port number on the named host. 根据指定的服务器ip&#xff0c;…

软件测试——Postman Script脚本功能

Postman作为软件测试里一款非常流行的调试工具&#xff0c;给我们提供了一个执行JavaScript脚本的环境&#xff0c;所以我们可以使用js语言编写脚本来解决一些接口自动化的问题&#xff0c;比如接口依赖、接口断言等等。Postman有Pre-RequestScript和Tests两个编写js脚本的模块…

赛氪网参与第61届中国高等教育博览会,助力产教融合与科教融汇

为深入贯彻党的二十大精神&#xff0c;落实立德树人根本任务&#xff0c;推动高等教育装备现代化&#xff0c;第61届中国高等教育博览会&#xff08;以下简称“高博会”&#xff09;于近日在福建省福州市隆重开幕。作为高等教育领域内的综合性品牌博览会&#xff0c;此次高博会…

将MySQL数据库查询结果导出为txt文档,并建成实体类

目录 第一章、功能需求和分析1.1&#xff09;具体需求1.2&#xff09;分析需求转为小的问题1、如何获得数据库表的字段&#xff1f;2、如何将数据库查询结果导出&#xff1f;3.将获得的数据库查询结果转为驼峰式4.让AI建个实体类 友情提醒: 先看文章目录&#xff0c;大致了解文…

C语言之文件操作【万字详解】

目录 一.什么是文件&#xff1f; 二.为什么要使用文件&#xff1f; 三.文件的分类 3.1.程序文件 3.2.数据文件 四.二进制文件和文本文件 五.文件的打开和关闭 &#xff08;重点&#xff09; 5.1流和标准流 5.1.1何为流&#xff1f; 5.1.2.标准流 5.2文件指针 5.3文件的打开和关…

[Android]Jetpack Compose加载图标和图片

一、加载本地矢量图标 在 Android 开发中使用本地矢量图标是一种常见的做法&#xff0c;因为矢量图标&#xff08;通常保存为 SVG 或 Android 的 XML vector format&#xff09;具有可缩放性和较小的文件大小。 在 Jetpack Compose 中加载本地矢量图标可以使用内置的支持&…

ubuntu如何运行python程序

打开LINUX UBUNTU操作系统。 找到左边的TERMINAL&#xff0c;打开窗口。 输入python&#xff0c;如果没有安装&#xff0c;就会提示需要安装。 如果已经安装好python3&#xff0c;直接输入&#xff0c;那么就会进入。 exit()就可以退出python3的模式。 创建一个文件&#xff0c…

java多线程-悲观锁、乐观锁

简介 悲观锁&#xff1a;没有安全感&#xff0c;一上来就直接加锁&#xff0c;每次只能一个线程进入访问&#xff0c;访问完毕之后&#xff0c;再解锁。线程安全&#xff0c;但是性能差。乐观锁&#xff1a;很乐观&#xff0c;一开始不上锁&#xff0c;认为没有问题。等到要出现…

揭秘“磁盘管理未知没有初始化”背后的秘密与应对策略

在日常使用电脑的过程中&#xff0c;我们有时会遇到一个令人头疼的问题——磁盘管理显示“未知没有初始化”。这种情况意味着系统无法正确识别和管理该磁盘&#xff0c;导致我们无法访问其中的数据。那么&#xff0c;究竟什么是“磁盘管理未知没有初始化”&#xff1f;又该如何…

等保测评之主机测评详解(二级)

等保测评之主机测评详解&#xff08;二级&#xff09;服务器——Windows 身份鉴别: 测评项a&#xff09;&#xff1a; a&#xff09;应对登录的用户进行身份标识和鉴别&#xff0c;身份标识具有唯一性&#xff0c;身份鉴别信息具有复杂度要求并定期更换&#xff1b; 整改方…

案例:SpringBoot集成Sharding-JDBC实现分表分库与主从同步(详细版)

案例&#xff1a;SpringBoot集成Sharding-JDBC实现分表分库与主从同步&#xff1a;详细版 1. 案例分析2. 主从同步2.1 主从数据库准备2.2 简单插点数据 3 案例代码3.1 application.properties配置信息3.2 测试 4. 遇到的坑4.1 水平分表时的属性设置4.2 绑定表的配置 1. 案例分析…

C语言为什么没有应用层开发的库

C语言是一门“古老”的语言了&#xff0c;在中大型的应用层项目开发中&#xff0c;C,Java,Python,C# 等其他编程语言能够更好地胜任&#xff0c;为C语言开发应用层的库简直是费力不讨好&#xff0c;所以几乎没人这么做。在开始前我有一些资料&#xff0c;是我根据网友给的问题精…

退役军人档案管理系统|DW-S403是一套成熟系统

退役军人档案管理系统是一种专门用于管理退役军人档案的信息系统&#xff0c;旨在提高退役军人档案的管理效率和利用价值。该系统采用先进的信息技术手段&#xff0c;对退役军人的档案进行全面、精准、高效的管理&#xff0c;为退役军人的就业、社保、优抚安置等提供有力支持。…

FreeRTOS使用中断相关的函数导致程序卡死解决办法

1.现象 想在串口中断中实现任务通知的功能&#xff0c;所以在串口中断服务函数中使用了xTaskGenericNotifyFromISR&#xff08;&#xff09;函数来发送通知&#xff0c;发现一进入中断服务函数&#xff0c;程序就卡死了。下边是串口初始化和中断服务函数: void Usart_Init_U(…

这届年轻人,对AI对象上头

在AI技术飞速发展的今天&#xff0c;虚拟对象这一概念也流行了起来。从AI女友到AI男友&#xff0c;这些基于人工智能的AI社交应用正在改变我们对情感陪伴的认知。本文深入探讨了AI虚拟对象的兴起、用户需求、商业模式以及技术局限&#xff0c;不妨来看一下。 继2023年文生文大语…

标准版/开源版 移动端新增页面使用文档

在标准版开发的实际使用中&#xff0c;随着用户移动端的产品和信息内容不断增多&#xff0c;新增页面来展示对应的产品详情、模块等内容。针对一些概念或者步骤较多的内容&#xff0c;可以新增子页面构建多级模块结构&#xff0c;帮助用户快速定位。 下面就如何新增页面做一讲…

网际互联及OSI七层模型

1什么是OSI七层模型 2OSI每一个Layer的定义 及用途 3如何使用OSI参考模型分析网络通信过程 一、网际互联 &#xff08;一&#xff09;OSI的概念&#xff1a; open system interconnect开放系统互联参考模型&#xff0c;是有ISO&#xff08;国际标准化组织&#xff09;定义…