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

  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 / 1psmodule 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) beginmem[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_WRITEif ( cs && we ) beginmem[address] <= data;end
end// Memory Read Block
// Read Operation : When we = 0, oe = 1, cs = 1
always @ (posedge clk)
begin : MEM_READif (cs && !we && oe) begindata_out <= mem[address];
/*     oe_r <= 1;end else beginoe_r <= 0; */end
endendmodule // End of Module ram_sp_sr_sw

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


  于是,参考Xilinx Template给出模板(或者在Xilinx官方文档UG901中也可查看),指定将RAM综合为BRAM,如下图所示。

  在寄存器前面加上语句: (*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。

注意:这里由于所设计的RAM不大,所以在不指定RAM的类型时会自动综合成了DRAM,但是在RAM的存储空间较大时,会自动综合成BRAM,可以通过在前面加入语句 (*ram_style=“distributed”*)指定综合为DRAM。

参考资料
1、FPGA单端口RAM的设计(同步读、同步写)
2、UG901(Xilinx官方设计文档)

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

  1. 简谈FPGA设计中不同设计方法资源消耗对比

    简谈FPGA设计中不同设计方法资源消耗对比 今天和大侠简单聊一聊FPGA设计中不同设计方法硬件资源消耗对比,话不多说,上货. 在这里,我们使用Verilog HDL 设计计数器,通过两种不同的写法,对 ...

  2. FPGA设计中,Vivado 调用IP核详细操作步骤

    FPGA设计中,Vivado 调用IP核详细操作步骤 今天给大侠带来了FPGA设计中,Vivado 调用IP核详细操作步骤,话不多说,手把手教学,请往下看. 首先咱们来了解一下vivado的IP核,I ...

  3. 防止FPGA设计中综合后的信号被优化

    这不是一个新话题了,写这个也是当作自己的一个小小的笔记吧!觉得挺有用的. 一般在做前仿真(即功能仿真)时,不会考虑信号被优化的问题.最近做一个关于运算的小程序,前仿真的数据没有问题,但是实际出来的数据 ...

  4. FPGA设计中,产生LFSR伪随机数

    今天给大侠带来在FPGA设计中,产生LFSR伪随机数,话不多说,上货. 一.概述 通过一定的算法对事先选定的随机种子(seed)做一定的运算可以得到一组人工生成的周期序列,在这组序列中以相同的概率选取 ...

  5. FPGA设计中,跨时钟域问题的处理

    FPGA设计中,跨时钟域问题的处理 今天和大侠简单聊一聊FPGA设计中跨时钟域问题的处理,话不多说,上货. 跨时钟域处理是FPGA设计中经常遇到的问题,而如何处理好跨时钟域间的数据,可以说是每个FPG ...

  6. FPGA设计中 有符号数、无符号数

    FPGA设计中 有符号数.无符号数 今天给大侠聊一聊FPGA设计中有符号数以及无符号数,话不多说,上货. 在设计中,所有的算数运算符都是按照无符号数进行的.如果要完成有符号数计算,对于加.减操作通过补 ...

  7. 在FPGA设计中怎么应用ChatGPT?

    在FPGA设计中怎么应用ChatGPT? 科技即生产力,最近,OpenAI 发布了 ChatGPT,在各大论坛和许多网站上受到了广泛关注,ChatGPT是由 OpenAI 提出的大型预训练语言模型,使 ...

  8. (130)FPGA面试题-FPGA设计中波特率和比特率的区别

    1.1 FPGA面试题-FPGA设计中波特率和比特率的区别 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-FPGA设计中波特率和比特率的区别: 5)结束 ...

  9. (139)FPGA面试题-FPGA设计中的速度和面积互换原则

    1.1 FPGA面试题-FPGA设计中的速度和面积互换原则 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-FPGA设计中的速度和面积互换原则: 5)结束 ...

最新文章

  1. 拆解交易系统--服务高可用
  2. SpringBoot 集成 Elasticsearch
  3. HBase应用快速学习
  4. QT自定义饼图的外观
  5. 算法图解学习笔记01:二分查找大O表示法
  6. 在 .NET Core 中的并发编程
  7. 谁来代替博客园——寄生博客
  8. getprivateprofilestring读不到数据_Tomcat NIO(11)请求数据读取
  9. java中如何将数字转换成字符串(int转换为string)
  10. 彻底理解SESSION
  11. aspose 转pdf表格大小乱了_自己写了一个小工具类:pdf转word,没有页数和大小限制,保真!...
  12. 加入HA后的完全分布式集群搭建
  13. 实验七——Web应用测试(bookstore项目上完成)
  14. 世上最全计算机网络面试整理(附答案),不服来战!!
  15. HTML网页设计:七、表格
  16. Flash 声音频谱图一
  17. NetCore3.1开发后台管理系统框架思路与实现
  18. java 堆栈的声明_Java 堆栈
  19. 计算机本地连接怎么找不到了,电脑本地连接不见了该怎么办
  20. 使用Chrome开发者工具精确定位网页元素位置

热门文章

  1. 计算机在材料科学中的应用上机,计算机在材料科学中的应用上机指导书-.doc
  2. C# 注册机功能开发,机器码设计
  3. 解机器码LOL-CF,无视机器码虚拟机
  4. Quarts 执行定时任务失败(.job.entity.ScheduleJobEntity cannot be cast to com.)
  5. html选择器与文档流基本介绍
  6. 如何高效、精准地进行图片搜索?看看轻量化视觉预训练模型
  7. 最常用的中文停止词(stop word)列表
  8. java的Swing组件模拟qq登录界面
  9. 如何写好毕业论文答辩PPT?
  10. 使用Navicat进行ssh通道连接MySQL数据库(亲测可行)