Xinlinx FPGA内的存储器BRAM全解

news/2024/5/18 16:55:14

目录

    • 一、总体概述
      • 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 技术信息门户


http://www.mrgr.cn/p/15523627

相关文章

贪吃蛇的简单实现(c语言)

前言:学完了C语言的基础语法,和一点数据结构的知识,拿贪吃蛇来练练手,并熟悉以前的知识。写完之后,有一种成就感,为以后的学习饱满激情。 注意这里的讲解是由部分到整体的思路。 目录 控制台不能是终端&am…

UE4网络图片加载库(带内存缓存和磁盘缓存)

UE4网络图片加载库,带内存缓存和磁盘缓存,支持自定义缓存大小,支持蓝图和C++代码调用 1、调用示例 2、对外暴露函数 3、源代码-网络模块 KeImageNet.h // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreM…

BERT-CRF 微调中文 NER 模型

文章目录 数据集模型定义数据集预处理BIO 标签转换自定义Dataset拆分训练、测试集 训练验证、测试指标计算推理其它相关参数CRF 模块 数据集 CLUE-NER数据集:https://github.com/CLUEbenchmark/CLUENER2020/blob/master/pytorch_version/README.md 模型定义 imp…

vulfocus靶场couchdb 权限绕过 (CVE-2017-12635)

Apache CouchDB是一个开源数据库,专注于易用性和成为"完全拥抱web的数据库"。它是一个使用JSON作为存储格式,JavaScript作为查询语言,MapReduce和HTTP作为API的NoSQL数据库。应用广泛,如BBC用在其动态内容展示平台&…

WDS+MDT网络启动自动部署windows(七)添加驱动

简介: 以前的ghost,是封装万能驱动。 现在安装原版ISO,是手动安装驱动。 那么WDS+MDT,怎么装驱动更方便呢? 本来是轻接触,lite touch,通过设置rules,bootstrap,可以达到只选择一下任务序列即可。 那么也要自动安装驱动。 WDS也可以注入驱动,但是是在使用原版安装镜像…

【嵌入式AI部署神经网络】STM32CubeIDE上部署神经网络之指纹识别(Pytorch)——篇一|环境搭建与模型初步部署篇

前言:本篇主要讲解搭建所需环境,以及基于pytorch框架在stm32cubeide上部署神经网络,部署神经网络到STM32单片机,本篇实现初步部署模型,没有加入训练集与验证集,将在第二篇加入。篇二详细讲解STM32CubeIDE上…

4.19作业

1、总结二进制信号量和计数型信号量的区别,以及他们的使用场景。 二进制信号量:信号量的数值只能是0和1,用于共享资源的访问 计数型信号量:信号量的值都是大于或者等于2,实现生产者和消费者模型 2、使用技术型信号量…

手撕netty源码(一)- NioEventLoopGroup

文章目录 前言一、NIO 与 netty二、NioEventLoopGroup 对象的创建过程2.1 创建流程图 前言 本文是手撕netty源码系列的开篇文章,会先介绍一下netty对NIO关键代码的封装位置,主要介绍 NioEventLoopGroup 对象的创建过程,看看new一个对象可以做…

快速新建springboot项目

一、初始化 1.打开IDEA,在Spring initializer这里按照下图项目进行配置。注意:如果jdk是1.8建议将Server URL这里替换为图中的阿里云服务器,否则容易找不到对应的java8,然后点击next 2.在这里提前配置一些需要使用的依赖&#xf…

软考 系统架构设计师系列知识点之大数据设计理论与实践(13)

接前一篇文章:软考 系统架构设计师系列知识点之大数据设计理论与实践(12) 所属章节: 第19章. 大数据架构设计理论与实践 第4节 Kappa架构 19.4.2 Kappa架构介绍 Kappa架构由Jay Kreps提出(Lambda由Storm之父Nayhan M…

react引入iconfont的svg图标

react引入iconfont的svg图标 本文目录 react引入iconfont的svg图标普通图标通过link引入css组件内引入css使用 svg图标通过script引入js组件内引入js使用 通过封装组件自定义封装组件中调用 通过antd封装使用 普通图标 通过link引入css <link rel"stylesheet" h…

C语言 字符类型

下面 我们来说字符类型 我们来看这个 保险单 金额 和 总额 都可以用数字类型 而性别则需要字符型 字符数据的存储 – ASCI码 字符类型 char 就是专为存储字符(如字母&#xff0c;标点和数字)而设计的类型。 使用单引号包含单个字符或转义字符去表示一个 char 类型的常量。 …

【QT学习】9.绘图,三种贴图,贴图的转换,不规则贴图(透明泡泡)

一。绘图的解释 Qt 中提供了强大的 2D 绘图系统&#xff0c;可以使用相同的 API 在屏幕和绘图设备上进行绘制&#xff0c;它主要基于QPainter、QPaintDevice 和 QPaintEngine 这三个类。 QPainter 用于执行绘图操作&#xff0c;其提供的 API 在 GUI 或 QImage、QOpenGLPaintDev…

ZYNQ--PL读写PS端DDR数据

PL 和PS的高效交互是zynq 7000 soc开发的重中之重&#xff0c;我们常常需要将PL端的大量数 据实时送到PS端处理&#xff0c;或者将PS端处理结果实时送到PL端处理&#xff0c;常规我们会想到使用DMA 的方式来进行&#xff0c;但是各种协议非常麻烦&#xff0c;灵活性也比较差&am…

CDN、边缘计算与云计算:构建现代网络的核心技术

在数字化时代&#xff0c;数据的快速传输和处理是保持竞争力的关键。内容分发网络&#xff08;CDN&#xff09;、边缘计算和云计算共同构成了现代互联网基础架构的核心&#xff0c;使内容快速、安全地到达用户手中。本文将探讨这三种技术的功能、相互关系以及未来的发展趋势。 …

网络 (基础概念, OSI 七层模型, TCP/IP 五层模型)

网络互连 网络互连: 将多台计算机连接在一起, 完成数据共享 数据共享的本质是网络数据传输, 即计算机之间通过网络来传输数, 也叫做网络通信 根据网络互连的规模不同, 将网络划分为局域网和广域网 注意: 局域网和广域网是相对的概念 局域网LAN 又称内网, 局域网和局域网之间在没…

【快速入门 LVGL】-- 5、Gui Guider界面移植到STM32工程

上篇&#xff0c;我们已学习&#xff1a;【快速入门 LVGL】-- 4、显示中文 工程中添加了两个按钮作示范。运行效果如图&#xff1a; 本篇&#xff1a;把Gui Guider设计好的界面&#xff0c;移植到STM32工程。 特别地&#xff1a; 在使用Gui Guider进行界面设计时&#xff0c;应…

读天才与算法:人脑与AI的数学思维笔记08_生物的创造力

读天才与算法:人脑与AI的数学思维笔记08_生物的创造力1. 生物的创造力 1.1. 在进化树中是否有其他的物种已经具有与我们人类相当的创造力水平 1.2. 20世纪50年代中期,动物学家德斯蒙德莫里斯(Desmond Morris)在伦敦动物园做了这样一个试验 1.2.1. …

[转帖]18--k8s之Nginx ingress

https://www.cnblogs.com/caodan01/p/15142709.html 目录一、介绍 二、安装nginx ingress 三、http部署1.编写一个service准备实验 2.编写http的ingress 3.部署四、https部署 五、常用配置 一、介绍 ingress为kubernetes集群中的服务提供了入口,可以提供负载均衡,ssl终止和基…

基于Vue+ElementPlus自定义带历史记录的搜索框组件

前言 基于Vue2.5ElementPlus实现的一个自定义带历史记录的搜索框组件 效果如图&#xff1a; 基本样式&#xff1a; 获取焦点后&#xff1a; 这里的历史记录默认最大存储10条&#xff0c;同时右侧的清空按钮可以清空所有历史记录。 同时搜索记录也支持点击搜索&#xff0c;按…