FPGA原理与结构——RAM IP核原理学习

news2024/10/1 19:34:22

目录

一、什么是RAM

二、RAM IP介绍

1、RAM分类简介

 2、可选的内存算法

(1)Minimum Area Algorithm(最小面积算法)

(2)Low Power Algorithm (低功耗算法)

(3)Fixed Primitive Algorithm (固定模块算法)

(4)小结

3、位宽

4、工作模式(对于每个端口来说都是独立设置的)

(1)Write First Mode(写优先模式)

(2)Read First Mode(读优先模式)

(3)No Change Mode(保持模式)

(4)小结

5、数据位宽比

6、字节写(Byte-Writes)

7、可选的输出寄存器

 8、可选的流水线(Optional Pipeline Stages)

9、关于可选寄存器的额外引脚

三、总结

一、什么是RAM

        RAM 的英文全称是 Random Access Memory,即随机存取存储器,它可以随时把数据写入任一指定地址的存储单元,也可以随时从任一指定地址中读出数据,其读写速度是由时钟频率决定的。RAM 主要用来存放程序及程序执行过程中产生的中间数据、运算结果等。

        在FPGA中我们讨论RAM时一般分成2种:由LUT资源配置的分布式RAM(DRAM),嵌入式的RAM(BRAM),这里我们考虑的是BRAM。

        xilinx为了帮助开发者更好地使用BRAM资源,为我们提供了RAM IP核,这就是我们今天的主角:Block Memory Generator v8.4

二、RAM IP介绍

        xilinx的BRAM资源可以被配置成3种形式的RAM:单端口RAM,简单双端口RAM,真双端口RAM

1、RAM分类简介

(1)Single-Port RAM(单端口RAM)

        只有一个端口,读写共用相同的地址总线,读写不能同时进行

(2)Simple Dual-port RAM(简单双端口RAM)

        两个端口A和B,一个用来写(A),另一个用来读(B),通过A端口写入的数据可以通过B端口读出

(3)True Dual-port RAM(真双端口RAM)

        两个通道都支持读写,互相独立。A端口和B端口可同时读写数据

 2、可选的内存算法

        在这里我们讨论的是BRAM的底层资源,BRAM在FPGA中是整块的形式存在,一块BRAM的大小为36Kb。它可以分成2块18Kb的RAM进行使用,这也是FPGA中BRAM的最小存在形式。针对这种情况,xilinx给出了3种内存算法:最小面积算法,低功耗算法,固定模块算法。

(1)Minimum Area Algorithm(最小面积算法)

        最小面积算法提供了一个高度优化的解决方案,可以使得我们使用到的BRAM资源最少,同时减少输出多路复用。这里有2个最小面积算法的例子:

        在第一个例子(左边)中,一个3k × 16的存储单元用到了3个RAM(每个都是18Kb), 尽管我们也可以用3个1k × 18的方式来实现,但是这样会使用更多的数据选择器,最小面积算法以这种方式最大化性能,同时保持最小块RAM的使用。

        在第二个示例(右边)中,一个5k x 17的存储器,进一步演示了该算法如何能够有效地封装BRAM,以使用最少的资源,同时通过减少输出多路复用来最大化性能。

(2)Low Power Algorithm (低功耗算法)

        低功耗算法使得在读写操作发生时使能的BRAM块最少,其实就是字面意思实现了低功耗算法,由于没有进行面积优化,这样可能会占用较多的资源。同样的我们有2个低功耗算法的例子:

(3)Fixed Primitive Algorithm (固定模块算法)

        固定模块算法允许开发者设定一个RAM的原语类型(其实就是确定了RAM的位宽和深度,例如16k x 1, 8k x 2, 4k x 4, 2k x 9, 1k x 18, 512 x 36),然后系统就只会使用这种类型的RAM。同样的我们举两个例子:

        在左图中我们限制只能用2k × 9 的RAM,在右图中我们限制只能用4k × 4的RAM。

(4)小结

        其实对于我们一般的,没有特殊需求的FPGA设计来说,这里的内存算法造成的性能差异并不是很大,这里主要是做一个了解,以免在实际使用时留下疑惑。

3、位宽

单口

一个36Kb的Block RAM支持的最大数据位宽是72,一个18Kb的Block RAM支持的最大数据位宽是36

简单双口

一个36Kb的Block RAM支持的最大数据位宽是72,一个18Kb的Block RAM支持的最大数据位宽是36

真双口

一个36Kb的Block RAM支持的最大数据位宽是36,一个18Kb的Block RAM支持的最大数据位宽是18。所以在相同的位宽和深度的情况下,真双口RAM使用的Block RAM的个数是单口/简单双口RAM的两倍

4、工作模式(对于每个端口来说都是独立设置的)

        真双口RAM或简单双口RAM的读写会有发生冲突的可能性,对于简单双口RAM而言,通过A端口写入数据同时通过B端口读出数据时,存在-写冲突的可能性;对于真双口RAM而言,通过一个端口写入同时通过另一个端口读出数据,同样也存在-写冲突的可能性,而且在通过两个端口同时写入数据时,还存在-写冲突的可能性。为了解决这样的问题,xilinx提供了3种不同的端口模式来进行规范:WRITE FIRST(写优先), READ FIRST(读优先), and NO CHANGE(保持)

(1)Write First Mode(写优先模式)

        在写优先模式下,RAM通过某个端口向写地址写入数据的同时,写入的数据也会被驱动到数据的输出端口。也就是说,在写操作期间,数据输出端口会输出写地址中的最新数据。

        我们以上图的案例来进行讲解,在第二个时钟上升沿,读写操作同时进行,就发生了我们所说的读-写冲突 ,此时我们需要将数据1111写入地址bb,同时需要从地址bb中读出数据,在写操作优先模式下,数据1111在写入地址bb的同时,也被驱动到了数据输出端,所以我们最终读出的数据就是我们写入的1111 。在第三个时钟上升沿也是同理,最终地址cc读出的数据就是此时刻写入的数据2222 。

(2)Read First Mode(读优先模式)

        在读优先模式下,当RAM通过某个端口向写地址写入数据的同时,写地址中的旧数据会被驱动到数据输出端口。也就是说,在写操作期间,数据输出端口会输出写地址中的旧数据。

        从上图的案例可以看出,在第二个时钟上升沿,读写操作同时进行,我们需要向地址bb写入数据1111,同时需要从地址bb中读出数据,在读优先模式下,我们读出的数据是地址中原来的数据,所以这里输出数据为old MEM(bb)。同理,在第三个时钟周期读出的数据是old MEM(cc) 。

(3)No Change Mode(保持模式)

        当RAM通过某个端口向写地址写入数据的同时,输出锁存器保持不变。在写操作期间,数据输出端口不会输出写地址的数据,而是保持上次读地址的数据。

        以上图为例,在第二个时钟上升沿有数据1111写入地址bb,在第三个时钟上升沿有数据2222要写入地址cc,同时我们要进行读数据操作,在保持模式下,读数据不会改变,所以我们的输出依然是上一时刻的输出,即MEM(aa)。

(4)小结

        我们可以根据定义端口的模式来规范端口的读写操作,防止无法预测的错误出现,但是在实际进行RAM设计的时候,如果两个端口的读写时钟不同(单端口不存在这样的问题),我们还是要尽可能地在设计时就避免读-写冲突和写-写冲突。

5、数据位宽比

         我们所讨论的这个IP核支持让端口之间的位宽不同也就是说端口A和端口B可以设置成不同的位宽,所有的4条数据总线都可以拥有不同的位宽:dina(A端口输入),douta(A端口输出),dinb(B端口输入),doutb(B端口输出)。

        但是数据位宽不是任意设置的,还是具有一定的限制,具体为位宽之间必须满足一定的比例:1:32, 1:16, 1:8, 1:4, 1:2, 1:1, 2:1, 4:1, 8:1, 16:1,  32:1。

6、字节写(Byte-Writes

        BRAM的IP核还支持字节写的操作,每个字节的位宽可以是8 bit或者9 bit 。当字节宽度为8 bit的时候,没有校验位(就是我们正常认知的一个字节的宽度)RAM宽度被设定为8的倍数,当字节的宽度为9 bit的时候,额外增加了一位奇偶校验位,RAM宽度被设定为9的位数。

        当字节写模式启用时,使能信号wea/web是N位宽的(N是数据din的比特数)。这样可以使得使能信号与我们的输入数据的字节是一一对应的关系,只有当使能信号有效,对应比特位的数据才会被写入。

        我们举个例子来理解字节写操作:

         这是一个单口RAM,数据位宽位32bit(也可以说是3个字节),写使能信号WEA位宽为3,在第一个时钟沿,WEA为3'b011,意思是第一个byte无效,其他两个有效,所以最终写入的数据只有后两个byte有效,即DINA = FF EE DD,但是写入的数据为00 EE DD(00即没有数据写入,这里设定所有的RAM都初始化为0了)。后面的例子都可以以此类推,这里就不做展开了。

7、可选的输出寄存器

        BRAM的IP核提供了可选择的寄存器,它也许可以提高IP核的表现。开发者可以在两个地方选择添加寄存器:在块RAM原语的输出处和在ip核的输出处。

        在BRAM原语输出处的寄存器可以减少时钟输出延迟的影响。在IP核输出处的寄存器,通过输出多路复用器隔离延迟,改善IP核的时钟输出延迟。对于端口A和端口B,可以分别选择这两个可选的寄存器。请注意,所使用的每个可选寄存器都会为Read操作添加了一个额外的时钟延迟周期。

 8、可选的流水线(Optional Pipeline Stages

        除了可选的寄存器输出,这个IP核还提供了可选的流水线输出结构,用户可以设置0~3级流水。这是因为大容量的RAM往往需要通过多个BRAM级联组成,而多个BRAM则会使用到多个MUX来进行控制,MUX作为一个组合逻辑器件,无疑会引入潜在的亚稳态问题,所以为了改善时序,额外引入了寄存器,最终构成了0~3级可选的流水线管道。

9、关于可选寄存器的额外引脚

        可选寄存器的引入之后,IP核还为我们提供了诸多例如时钟使能,复位等各种功能的引脚和设计帮助,这里不做展开,需要用到时自行查阅手册即可。

三、总结

        BRAM的IP核很常用,本文提取了部分常规使用中重点的内容进行详细展开,主要要知道BRAM可以实现单端口,简单双端口,真双端口三种模式的RAM。端口可以独立的设置工作模式来应对读写冲突,写写冲突,但是我们还是要尽可能避免冲突的发生。此外IP核也给我们提供了很多的附加功能,可供用户根据需要自行设计选择。关于BRAM IP核的具体使用和案例,请阅读:

FPGA原理与结构——RAM IP核的使用与测试

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT-4: 半年的深度使用思考

几个月的时间一直在使用 ChatGpt-4,以口述语音转文字的形式说一下自己的体会。 1、选择版本 大前提:我使用的都是 GPT4 的版本。也就是说至少每个月要付费20$。 因为 3.5 的版本,实际上使用体验是非常差的,主要体现在答非所问上。…

【C++习题集】-- 堆

(用于复习) 目录 树概念及结构 名词概念 二叉树概念及结构 特殊的二叉树 满二叉树 完全二叉树 运算性质 二叉树存储结构 顺序存储 链式存储 堆 - 顺序存储 堆的性质 堆的实现 堆的应用 堆排序 直接建堆法 树概念及结构 概念&#xff1a…

shell脚本——文件三剑客之sed

目录 一.sed基本用法及选项 ​二.sed脚本语法及命令 三.sed的查找替换使用 四.后向引用 五.变量 一.sed基本用法及选项 sed [选项]... {自身脚本语法};.... [input file...] seq 10 |sed #生成1-10数字传给sed #该格式报错,基本格式中的{自身脚本语法}不…

Stable Diffusion的使用以及各种资源

Stable Diffsuion资源目录 SD简述sd安装模型下载关键词,描述语句插件管理controlNet自己训练模型 SD简述 Stable Diffusion是2022年发布的深度学习文本到图像生成模型。它主要用于根据文本的描述产生详细图像,尽管它也可以应用于其他任务,如…

【SA8295P 源码分析】06 - SA8295P XBL Loader 阶段 sbl1_main_ctl 函数代码分析

【SA8295P 源码分析】06 - SA8295P XBL Loader 阶段 sbl1_main_ctl 函数代码分析 一、XBL Loader 汇编源码分析1.1 解析 boot\QcomPkg\XBLLoader\XBLLoader.inf1.2 boot\QcomPkg\XBLDevPrg\ModuleEntryPoint.S:跳转 sbl1_entry 函数1.3 XBLLoaderLib\sbl1_Aarch64.s…

shell脚本之循环语句

循环语句 循环含义 将某代码段重复运行多次,通常有进入循环的条件和退出循环的条件 for循环语句 一般知道循环次数使用for循环 第一类 格式1: for名称 in 取值次数;do;done; 格式2: for 名称 in {取值列表} do done# 打印20次 for i i…

docker安装redis7-分片集群

说明 系统:CentOS7.9 redis:7.0.5 因资源有限所有节点部署在一台宿主机上,总共启动6个redis实例,实例对应端口分别从6380-6385,文章中给的有执行脚本,方便配置redis和操作redis实例 下载镜像 docker …

JVM的元空间了解吗?

笔者近期在面试的时候被问到了这个问题,元空间也是Java8当时的一大重大革新,之前暑期实习求职的时候有专门看过,但是近期秋招的时候JVM相关的内容确实有点生疏了,故在此进行回顾。 结构 首先,我们应了解JVM的堆结构&a…

c++——引用(语法、引用特性、常引用、函数返回值引用和指针与引用的不同点)

c中的引用 一、引用 1、引用的概念:给变量取别名。 形式:原类型名& 别名 引用实体旧名; 2、特性: ①引用定义时必须初始化 ②引用一旦初始化之后就不能再改变引用的指向 ③不能引用NULL ④&再等号的左边为引用&…

FPGA原理与结构——ROM IP的使用与测试

一、前言 本文介绍Block Memory Generator v8.4 IP核 实现ROM,在学习一个IP核的使用之前,首先需要对于IP核的具体参数和原理有一个基本的了解,具体可以参考: FPGA原理与结构——块RAM(Block RAM,BRAM)http…

04_18内存反碎片技术,什么时候适合进行内存碎片整理

前言 内存碎片分为内部碎片和外部碎片,内部碎片指内存页里面的碎片,外部碎片指空闲的内存页分散,很难找到一组物理地址连续的空间内存页,无法满足超过一页的内存分配请求。 虚拟可移动区域 可移动区域(ZONE_MOVABLE…

A 题国际旅游网络的大数据分析-详细解析与代码答案(2023 年全国高校数据统计与调查分析挑战赛

请你们进行数据统计与调查分析,使用附件中的数据,回答下列问题: ⚫ 问题 1: 请进行分类汇总统计,计算不同国家 1995 年至 2020 年累计旅游总人数,从哪个国家旅游出发的人数最多,哪个国家旅游到达的人数最多…

【JavaEE】面向切面编程AOP是什么-Spring AOP框架的基本使用

【JavaEE】Spring AOP(1) 文章目录 【JavaEE】Spring AOP(1)1. Spring AOP 是什么1.1 AOP 与 Spring AOP1.2 没有AOP的世界是怎样的1.3 AOP是什么 2. Spring AOP 框架的学习2.1 AOP的组成2.1.1 Aspect 切面2.1.2 Pointcut 切点2.1…

微人事 部门管理 模块 (十五)

部门管理的树展示和搜索 数据展示页是个树,我们一次性把数据加载出来也可以通过点一次id加载查询出来出来子部门,我们用一次拿到说有json数据加载出来 数据不多可以用递归,数据很多就用懒加载的方式 由于子部门比较深就不适合,权…

# 59. python的类与对象-更新

[目录] 文章目录 59. python的类与对象-更新1.面向对象编程2.什么是类3.什么是对象4.如何描述对象5.对象的属性和方法6.Python中的类7.type()函数查看数据类型8.类在Python中的应用9.总结 【正文】 59. python的类与对象-更新 1.面向对象编程 本节内容特别抽象,初…

Web3和去中心化:互联网的下一个演化阶段

文章目录 Web3和去中心化的定义Web3:去中心化: 为什么Web3和去中心化如此重要?数据隐私和安全:去中心化的创新:去除中间商: Web3和去中心化的应用领域去中心化金融(DeFi)&#xff1a…

wustojc2003求整数均值

#include <stdio.h> int main() {int a,b,c,d;double A;scanf("%d%d%d%d",&a,&b,&c,&d);A(double)((abcd)/4.0);//强转成doubleprintf("Sum %d\n",abcd);printf("Average %.2lf",A);return 0;}

C++笔记之基类指针动态地指向某一个子类情况列举

C笔记之基类指针动态地指向某一个子类情况列举 code review! 文章目录 C笔记之基类指针动态地指向某一个子类情况列举1.基本的多态示例2.基类中的成员函数可以设置为纯虚函数3.将基本示例修改为使用智能指针并在堆上实例化子类4.父类指针指向基类后&#xff0c;可以去调用只有…

【JUC系列-01】深入理解JMM内存模型的底层实现原理

一&#xff0c;深入理解JMM内存模型 1&#xff0c;什么是可见性 在谈jmm的内存模型之前&#xff0c;先了解一下并发并发编程的三大特性&#xff0c;分别是&#xff1a;可见性&#xff0c;原子性&#xff0c;有序性。可见性指的就是当一个线程修改某个变量的值之后&#xff0c…

shell脚本之sed

sed sed 即 Stream EDitor&#xff0c;和 vi 不同&#xff0c;sed是行编辑器 基本用法 sed [选项] 自身脚本用法 [支持输入标准输入管道] 常用选项&#xff1a;-n 不输出模式空间内容到屏幕&#xff0c;即不自动打印-e 多点编辑-f FILE 从指定文件中读取编辑脚本-r, -E 使用…