系列文章目录:FPGA原理与结构(0)——目录与传送门
一、BRAM简介
大家对于RAM应该并不陌生,RAM就是一张可读可写的存储表,它经常被拿来与ROM进行对比,相比之下,ROM只可读。而在FPGA中,RAM一般可以分成两种,一种是使用LUT资源组成的分布式RAM(DRAM),另一种就是块RAM(BRAM),这里我们讨论的是BRAM,关于DRAM的内容,可以阅读:FPGA原理与结构——分布式RAM(Distributed RAM,DRAM)。
BRAM就是嵌入在FPGA中的整块的RAM资源,是FPGA中重要的存储资源。在早期的FPGA架构中,基本上只使用基于查找表和触发器的逻辑块实现用户电路,可用作存储要素的就只有逻辑块中的触发器。因此很难在芯片上保存大量数据,而有这样需求的应用需要在FPGA上连接外部存储器。但是在很多情况下,FPGA和外部存储器的带宽会成为系统的瓶颈,从而限制整体性能。因此商用的FPGA架构在发展中开始集成高效的片上存储器。这就是我们BRAM的由来。
二、BRAM的特性和分布
在xilinx 7系类的FPGA里,一个BRAM的大小是36Kb(这里的K代表的是1024,而不是1000),它也可以被拆分成2个独立的18Kb BRAM来使用,这就是xilinx 7系类里RAM的最小实现形式了。也就是说使用的BRAM在使用的时候必须是整块进行使用的,一块BRAM最小就是18Kb。举个例子,我们需要存储40Kb的资源,就需要使用:一块36Kb的RAM+一块18Kb的RAM,这样就造成了14Kb的资源浪费。
两个相邻的RAM还可以组合来构成更大的RAM。
每块36Kb的RAM根据深度和位宽的不同,可以配置成如下形式(深度×位宽):32K x 1, 16K x 2, 8K x 4, 4K x 9, 2K x 18, 1K x 36, or 512 x 72。
每块18Kb的RAM根据深度和位宽的不同,可以配置成如下形式(深度×位宽):16K x 1, 8K x2 , 4K x 4, 2K x 9, 1K x 18 or 512 x 36。
根据FPGA型号的不同,每块FPGA中蕴含的BRAM资源数量也是不一样的,用户可以根据自己的需求和成本选择最适合自己的型号,我们以下图为例,这只是xilinx的一部分型号对应的BRAM资源,可以看到不同的device对应的BRAM数量和分布情况有所不同。
在如今xilinx的FPGA中普遍使用的是ASMBL架构,所以BRAM在FPGA也是按列分布的。
三、BRAM的使用
BRAM的作用是非常巨大的,也是具有一定复杂性的,BRAM可以被配置成RAM,ROM或者FIFO,我们一个一个来讨论。
1、RAM
首先就是最直观的RAM的情况,但是就算是用作RAM,也有着许多不同的工作模式:
(1)Single Port :单口 RAM
读写共用一个地址总线,在同一个端口,但是不能同时进行
(2)Simple dual port:简单双口 RAM
一个写通道,一个读通道,通过A端口写入数据的同时可以通过B端口读出数据
(3)True Dual Port:真双口 RAM
两个通道都支持读写,互相独立。A端口和B端口可同时读写数据
2、ROM
ROM其实也非常好理解,甚至是BRAM应用中最简单的部分,因为ROM可以理解成只具备读功能,不具备写功能的RAM。
(1)Single Port :单口 ROM
不能写入,只有一个端口用于数据读
(2)Dual port:双端口 ROM
不可写,但是有2个端口用于读,两个端口读取数据的位宽可以不同,但是必须是整数倍关系
3、FIFO
FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,与普通存储器的区别是没有外部读写地址线,使用简单,缺点就是只能顺序读、写入数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。
FIFO的作用:
(1)不同时钟域之间的数据传输;
(2)对不同宽度的数据位宽转换;
(3)数据缓存
根据FIFO工作的时钟域,可以将FIFO分为:
(1)同步FIFO:读时钟和写时钟为同一个时钟,在时钟沿来临时同时发生读写操作。
作用:位宽转换或数据缓存。
(2)异步FIFO:读写时钟不一致,读写操作是互相独立的。
作用:多比特数据跨时钟域。
四、7系类BRAM的一些额外特性
1、可选输出寄存器
BRAM的输出还内嵌了个寄存器,我们打拍输出的时候可以使用它,这样就能省下SLICE上的寄存器资源,而且就算我们使用SLICE的FF资源,会引入一个较大的时延,这样做还能降低时延问题。
2、BRAM的级联
在xilinx的FPGA里,2块相邻的BRAM可以在不消耗CLB资源的情况下就级联形成更大的RAM。任意两个相邻的BRAM都可以进行级联
五、为什么是最小是18kb
在Xilinx FPGA中,块RAM(BRAM)的大小选择,如18KB,是基于多方面考虑的结果,包括技术限制、市场需求、设计灵活性以及与现有架构的兼容性等因素。尽管Xilinx没有公开详细解释为什么特定选择了18KB作为BRAM的大小,但我们可以推测这一选择背后的几个可能原因:
5.1 技术和制造的限制
-
制造效率:在半导体制造过程中,对硅片空间的利用是一个重要考虑因素。18KB的大小可能代表了一种在提供充足的存储容量和保持良好的芯片制造效率之间的平衡。
-
性能与功耗:BRAM的大小影响其访问速度和功耗。18KB可能是在满足大多数应用需求的存储容量和保持较低功耗之间的优化结果。
5.2 设计灵活性
-
应用适应性:18KB的BRAM大小提供了足够的灵活性,能够适应各种不同的应用场景,从简单的缓存到复杂的数据结构存储等。它允许设计师根据需要将多个BRAM组合使用,以满足更大的存储需求。
-
细粒度资源管理:通过提供18KB的BRAM单元,Xilinx FPGA允许开发者更细致地管理和优化他们设计中的内存资源。这有助于提高整个系统的效率和性能。
5.3 向后兼容性与标准化
-
保持兼容性:在新的FPGA系列中采用18KB作为BRAM单元的标准大小,有助于保持与旧设计的兼容性,使得设计迁移和升级更加容易。
-
行业标准:随着时间的发展,某些内存大小可能会成为设计中的非正式标准。虽然18KB可能起初是基于技术限制和性能优化的考虑,但它也可能适应了市场上常见的应用需求,从而成为了一种常见的配置选项。
总而言之,18KB BRAM的选择反映了在满足广泛应用需求、优化性能和功耗、以及提供设计灵活性方面的综合考量。这样的设计决策使Xilinx FPGA能够适应各种不同的使用场景,同时保持高效的资源利用和良好的制造经济性。