FPGA设计中BRAM(Block RAMs)资源的使用(综合为BRAM)
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)相关推荐
- 简谈FPGA设计中不同设计方法资源消耗对比
简谈FPGA设计中不同设计方法资源消耗对比 今天和大侠简单聊一聊FPGA设计中不同设计方法硬件资源消耗对比,话不多说,上货. 在这里,我们使用Verilog HDL 设计计数器,通过两种不同的写法,对 ...
- FPGA设计中,Vivado 调用IP核详细操作步骤
FPGA设计中,Vivado 调用IP核详细操作步骤 今天给大侠带来了FPGA设计中,Vivado 调用IP核详细操作步骤,话不多说,手把手教学,请往下看. 首先咱们来了解一下vivado的IP核,I ...
- 防止FPGA设计中综合后的信号被优化
这不是一个新话题了,写这个也是当作自己的一个小小的笔记吧!觉得挺有用的. 一般在做前仿真(即功能仿真)时,不会考虑信号被优化的问题.最近做一个关于运算的小程序,前仿真的数据没有问题,但是实际出来的数据 ...
- FPGA设计中,产生LFSR伪随机数
今天给大侠带来在FPGA设计中,产生LFSR伪随机数,话不多说,上货. 一.概述 通过一定的算法对事先选定的随机种子(seed)做一定的运算可以得到一组人工生成的周期序列,在这组序列中以相同的概率选取 ...
- FPGA设计中,跨时钟域问题的处理
FPGA设计中,跨时钟域问题的处理 今天和大侠简单聊一聊FPGA设计中跨时钟域问题的处理,话不多说,上货. 跨时钟域处理是FPGA设计中经常遇到的问题,而如何处理好跨时钟域间的数据,可以说是每个FPG ...
- FPGA设计中 有符号数、无符号数
FPGA设计中 有符号数.无符号数 今天给大侠聊一聊FPGA设计中有符号数以及无符号数,话不多说,上货. 在设计中,所有的算数运算符都是按照无符号数进行的.如果要完成有符号数计算,对于加.减操作通过补 ...
- 在FPGA设计中怎么应用ChatGPT?
在FPGA设计中怎么应用ChatGPT? 科技即生产力,最近,OpenAI 发布了 ChatGPT,在各大论坛和许多网站上受到了广泛关注,ChatGPT是由 OpenAI 提出的大型预训练语言模型,使 ...
- (130)FPGA面试题-FPGA设计中波特率和比特率的区别
1.1 FPGA面试题-FPGA设计中波特率和比特率的区别 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-FPGA设计中波特率和比特率的区别: 5)结束 ...
- (139)FPGA面试题-FPGA设计中的速度和面积互换原则
1.1 FPGA面试题-FPGA设计中的速度和面积互换原则 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-FPGA设计中的速度和面积互换原则: 5)结束 ...
最新文章
- 拆解交易系统--服务高可用
- SpringBoot 集成 Elasticsearch
- HBase应用快速学习
- QT自定义饼图的外观
- 算法图解学习笔记01:二分查找大O表示法
- 在 .NET Core 中的并发编程
- 谁来代替博客园——寄生博客
- getprivateprofilestring读不到数据_Tomcat NIO(11)请求数据读取
- java中如何将数字转换成字符串(int转换为string)
- 彻底理解SESSION
- aspose 转pdf表格大小乱了_自己写了一个小工具类:pdf转word,没有页数和大小限制,保真!...
- 加入HA后的完全分布式集群搭建
- 实验七——Web应用测试(bookstore项目上完成)
- 世上最全计算机网络面试整理(附答案),不服来战!!
- HTML网页设计:七、表格
- Flash 声音频谱图一
- NetCore3.1开发后台管理系统框架思路与实现
- java 堆栈的声明_Java 堆栈
- 计算机本地连接怎么找不到了,电脑本地连接不见了该怎么办
- 使用Chrome开发者工具精确定位网页元素位置
热门文章
- 计算机在材料科学中的应用上机,计算机在材料科学中的应用上机指导书-.doc
- C# 注册机功能开发,机器码设计
- 解机器码LOL-CF,无视机器码虚拟机
- Quarts 执行定时任务失败(.job.entity.ScheduleJobEntity cannot be cast to com.)
- html选择器与文档流基本介绍
- 如何高效、精准地进行图片搜索?看看轻量化视觉预训练模型
- 最常用的中文停止词(stop word)列表
- java的Swing组件模拟qq登录界面
- 如何写好毕业论文答辩PPT?
- 使用Navicat进行ssh通道连接MySQL数据库(亲测可行)