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

这篇具有很好参考价值的文章主要介绍了FPGA设计中BRAM(Block RAMs)资源的使用(综合为BRAM)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  RAM分为BRAM(Block RAMs)和DRAM(Distributed RAM),即块RAM与分布式RAM,这两个差别在于BRAM是FPGA上固有的一些存储资源(针对不同型号的FPGA,其存储资源大小会有差别),而DRAM则是由LUT组合而成的。所以在数据量较大的情况下,一般使用BRAM,尽量避免使用DRAM,导致LUT资源的浪费。
  以Vivado平台为例,如果不指定综合为BRAM还是DRAM,则Vivado会根据RAM的大小自动判断综合为BRAM还是DRAM。
  参考博客《单端口RAM设计》中的单端口RAM代码,如下。

`timescale 1ns / 1ps

module single_port_ram (
clk         , // Clock Input
address     , // Address Input
data        , // Data bi-directional
cs          , // Chip Select
we          , // Write Enable/Read Enable
oe            // Output Enable
); 
 
parameter DATA_WIDTH = 8 ;
parameter ADDR_WIDTH = 4 ;
parameter RAM_DEPTH = 1 << ADDR_WIDTH;
 
//--------------Input Ports----------------------- 
input                  clk         ;
input [ADDR_WIDTH-1:0] address     ;
input                  cs          ;
input                  we          ;
input                  oe          ; 
 
//--------------Inout Ports----------------------- 
inout [DATA_WIDTH-1:0]  data       ;
 
//--------------Internal variables---------------- 
reg [DATA_WIDTH-1:0] data_out ;
//(*ram_style = "block"*) reg [DATA_WIDTH-1:0] mem [0:RAM_DEPTH-1];
reg [DATA_WIDTH-1:0] mem [0:RAM_DEPTH-1];
reg                  oe_r;
 
 
//initialization
 
// synopsys_translate_off
integer i;
initial begin
    //$readmemb("F:/IP_core/Single Port RAM/SIM/single_port_rom_init.txt", mem);
	for(i=0; i < RAM_DEPTH; i = i + 1) begin
        mem[i] = 8'h00;
    end
end
// synopsys_translate_on
 

 
//--------------Code Starts Here------------------ 
 
// Tri-State Buffer control 
// output : When we = 0, oe = 1, cs = 1
assign data = (cs && oe && !we) ? data_out : 8'bz; 
 
// Memory Write Block 
// Write Operation : When we = 1, cs = 1
always @ (posedge clk)
begin : MEM_WRITE
   if ( cs && we ) begin
       mem[address] <= data;
   end
end
 
// Memory Read Block 
// Read Operation : When we = 0, oe = 1, cs = 1
always @ (posedge clk)
begin : MEM_READ
  if (cs && !we && oe) begin
    data_out <= mem[address];
/*     oe_r <= 1;
  end else begin
    oe_r <= 0; */
  end
end
 
endmodule // End of Module ram_sp_sr_sw

  对该代码进行综合,可以看到资源使用报告如下。可以看到这里根据RAM的大小自动综合成DRAM(LUTRAM)。

td fpga bram,# 基础语法篇,fpga开发,硬件工程,其他,嵌入式硬件
  于是,参考Xilinx Template给出模板(或者在Xilinx官方文档UG901中也可查看),指定将RAM综合为BRAM,如下图所示。

td fpga bram,# 基础语法篇,fpga开发,硬件工程,其他,嵌入式硬件

  在寄存器前面加上语句: (*ram_style=“block”*),即

	reg [DATA_WIDTH-1:0] mem [0:RAM_DEPTH-1]; //修改前
	(*ram_style = "block"*) reg [DATA_WIDTH-1:0] mem [0:RAM_DEPTH-1]; //修改后

  再进行综合,查看资源使用报告,可见此时我们编写的单端口RAM已经被综合成了BRAM。
td fpga bram,# 基础语法篇,fpga开发,硬件工程,其他,嵌入式硬件
注意:这里由于所设计的RAM不大,所以在不指定RAM的类型时会自动综合成了DRAM,但是在RAM的存储空间较大时,会自动综合成BRAM,可以通过在前面加入语句 (*ram_style=“distributed”*)指定综合为DRAM。

参考资料
1、FPGA单端口RAM的设计(同步读、同步写)
2、UG901(Xilinx官方设计文档)文章来源地址https://www.toymoban.com/news/detail-796050.html

到了这里,关于FPGA设计中BRAM(Block RAMs)资源的使用(综合为BRAM)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA | BRAM和DRAM

    Block ram 由一定数量固定大小的存储块构成的,使用 BLOCK RAM 资源不占用额外的逻辑资源,并且速度快。 但是 使用的时候消耗的 BLOCK RAM 资源是其块大小的整数倍 。如 Xilinx公司的结构中每个 BRAM 有 36Kbit 的容量,既可以作为一个 36Kbit 的存储器使用,也可以拆分为两个独立的

    2024年02月12日
    浏览(46)
  • FPGA — BRAM学习笔记—读写操作

    使用软件: Vivado 开发板: EGO1采用Xilinx Artix-7系列XC7A35T-1CSG324C FPGA BRAM 即块 RAM, 是 FPGA 的固有硬件资源。 另一种形式的 RAM 是分布RAM(Distribution RAM), 是由 FPGA 逻辑资源查找表 LUT 拼起来的 。这两种 RAM 最本质的区别是 块RAM 默认输入有寄存器 ,所以它在读、写使能信号后的 下个

    2024年02月01日
    浏览(74)
  • 【FPGA】AXI4-Lite总线读写BRAM

    AXI协议基础知识 。这篇博客比较详细地介绍了AXI总线,并且罗列了所有的通道和端口,写代码的时候可以方便地进行查表。 AXI总线,AXI_BRAM读写仿真测试 。 这篇文章为代码的书写提供大致的思路,比如状态机和时序的控制问题,可以参考。 双向握手机制的实质是: 数据接

    2024年02月15日
    浏览(75)
  • FPGA节省资源篇------正确处理设计优先级

    声明:以下文章来源于孤独的单刀,仅供学习用途 概述 假如现在有一种方法–可以在不怎么需要修改已有设计的情况下,就可以帮您节省50%的设计资源,那你会试试看吗? 当前市场环境下,更低廉的成本却可获得同等性能无疑是极具诱惑的。本文将介绍一种FPGA设计技术,该

    2024年01月17日
    浏览(41)
  • FPGA时钟资源与设计方法——Xilinx(Vivado)

    1.时钟资源包括:时钟布线、时钟缓冲器(BUFGBUFRBUFIO)、时钟管理器(MMCM/PLL)。 2.时钟类型有三种:全局时钟,可以驱动整个内核上的同步逻辑;局部时钟,可以驱动特定和相邻区域的逻辑;IO时钟,可以驱动某个IO的特定逻辑。 3.混合模式时钟管理器(MMCM)和数字时钟管理

    2024年02月22日
    浏览(56)
  • 【 FPGA 封装设计资源 】 Xilinx vs Altera

    PACKAGE 一般在doc nav搜索,同样也可以在官网;检索“*pkg-pinout.” 比如vu9p: ug575-ultrascale-pkg-pinout.pdf 原理库文件 Package Files Portal 举例: 先选封装; 再选器件 二维交叉检索后,在右击另存即可。《xczu48drffvg1517pkg.txt》。 PACKAGE 蓝厂、Altrea package 下载地址 库文件 Mentor Gra

    2024年01月15日
    浏览(41)
  • 【FPGA】正确处理设计优先级--或许能帮你节省50%的资源

    假如现在有一种方法–可以在不怎么需要修改已有设计的情况下,就可以帮您节省50%的设计资源,那你会试试看吗? 当前市场环境下,更低廉的成本却可获得同等性能无疑是极具诱惑的。本文将介绍一种FPGA设计技术,该技术可以改变 FPGA 设计的规模大小和使用性能。 你可以

    2024年02月05日
    浏览(41)
  • 如何创建 Xilinx BRAM 或 ROM 初始化文件(.COE)并实现初始化数据在 FPGA 上的载入

    如何创建 Xilinx BRAM 或 ROM 初始化文件(.COE)并实现初始化数据在 FPGA 上的载入 在 FPGA 开发中,初始化数据是一个非常重要的内容,它决定了电路从上电开始的初始状态,对于保证正确性和可靠性有着至关重要的作用。其中,BRAM(Block RAM)和 ROM(Read-Only Memory)是两种常见的

    2024年02月09日
    浏览(63)
  • Xilinx FPGA器件中时钟资源的说明以及使用 --ibufg ibufgds

    xilinx 时钟资源分为两种:全局时钟和第二全局时钟。 一、全局时钟资源 Xilinx 全局时钟采用全铜工艺实现,并设计了专用时钟缓冲与驱动结构,可以到达芯片内部任何一个逻辑单元,包括CLB、I/O引脚、内嵌RAM、硬核乘法器等,而且时延和抖动都很小。对FPGA设计而言,全局时

    2023年04月09日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包