当前位置: 首页 > news >正文

Xilinx FPGA怎么使用LUTRAM

       经常遇到Block RAM使用率几乎100%,LUTRAM使用率也才百分之几十。盲目去试,并不能带来满意的结果。现在我们来详细讲解一下在 Xilinx FPGA 中如何使用 LUTRAM。

一、什么是 LUTRAM?

首先,要理解 LUTRAM,我们需要知道 FPGA 中的基本单元——查找表。

  • LUT: 是 FPGA 中实现组合逻辑的基本单元。一个 6 输入的 LUT 可以看作是一个有 64 个地址的 1 位 ROM。你输入一个 6 位地址,它就输出预先配置好的那 1 位数据。

  • LUTRAM: 是 LUT 的一种特殊工作模式。在这种模式下,LUT 被配置为一个小的、同步的 随机存取存储器。你可以对它进行读和写操作,就像一个真正的 RAM 一样。

二、关键特性

  • 容量小: 一个 6 输入 LUT 可以配置为 64x1 位 或 32x2 位的 RAM。通常用于小容量的存储,如 FIFO、小缓冲区、寄存器堆等。

  • 分布式 RAM: 因为 LUT 是分布在 FPGA 的整个可编程逻辑阵列中的,所以由 LUT 构成的 RAM 被称为 分布式 RAM。与之相对的是大型的、集中的 Block RAM

  • 同步写,异步/同步读: 大多数 LUTRAM 的写操作是同步的(需要时钟)。读操作可以是异步的(地址变化,数据立即输出)或同步的(在时钟边沿输出数据),具体取决于配置模式。

三、为什么使用 LUTRAM?

  1. 小容量存储的理想选择: 当你只需要几十到几百个字节的存储空间时,使用一个完整的 Block RAM 是浪费的。LUTRAM 可以更精细地利用资源,避免 Block RAM 的浪费。

  2. 分布式特性: 由于 LUTRAM 遍布整个芯片,你可以将存储单元放在离使用它的逻辑电路非常近的地方,这有助于减少布线延迟,提高性能。

  3. 解决时序瓶颈: 对于需要极低延迟访问的小型存储器,LUTRAM 通常是性能最好的选择。

四、 如何使用 LUTRAM?

主要有三种方法,推荐程度从高到低。

方法一:通过 HDL 代码推断(最常用、最推荐)

       这是最通用、可移植性最好的方法。综合工具(如 Vivado 的 Vivado Synthesis)能够识别出特定的代码模式,并自动将其映射到 LUTRAM。

下面是一些常见的可推断模式的 Verilog 示例:

示例 1:单端口 RAM(同步写,异步读)
module lutram_single_port (input clk,input we,          // 写使能input [5:0] addr,  // 6位地址,深度64input [7:0] din,   // 8位写入数据output [7:0] dout  // 8位读出数据
);// 声明一个 64x8 位的寄存器数组
reg [7:0] ram [0:63];// 同步写操作
always @(posedge clk) beginif (we)ram[addr] <= din;
end// 异步读操作
assign dout = ram[addr];endmodule
  • 注意: 异步读在 FPGA 中可能会引入布线延迟不一致的问题,在高性能设计中,更推荐使用同步读。

示例 2:单端口 RAM(同步写,同步读)
module lutram_single_port_sync (input clk,input we,input [4:0] addr, // 5位地址,深度32input [7:0] din,output reg [7:0] dout // 输出定义为寄存器
);// 声明一个 32x8 位的寄存器数组
reg [7:0] ram [0:31];// 同步写操作
always @(posedge clk) beginif (we)ram[addr] <= din;
end// 同步读操作
always @(posedge clk) begindout <= ram[addr];
endendmodule
示例 3:简单的双端口 RAM(一个端口写,另一个端口读)
module lutram_simple_dual_port (input clk,input we,input [4:0] waddr, // 写地址input [4:0] raddr, // 读地址input [7:0] din,output reg [7:0] dout
);// 声明一个 32x8 位的寄存器数组
reg [7:0] ram [0:31];// 同步写操作
always @(posedge clk) beginif (we)ram[waddr] <= din;
end// 同步读操作
always @(posedge clk) begindout <= ram[raddr];
endendmodule

关键点:

  • 使用 reg [data_width-1:0] ram [0:depth-1]; 这样的数组声明。

  • 写操作必须在时钟控制的 always 块中。

  • 读操作可以在组合逻辑中(异步读)或在时钟控制的 always 块中(同步读)。

  • 确保你的代码风格简洁,符合工具推荐的推断模板。

方法二:使用 Vivado 的原语(Primitive)进行实例化

       这种方法直接调用 Xilinx 器件专用的底层硬件单元,不具可移植性,但可以精确控制。

常见的 LUTRAM 原语包括:

  • RAM64X1S: 64x1 单端口分布式 RAM

  • RAM32X1S: 32x1 单端口...

  • RAM64X1D: 64x1 双端口(一个写端口,两个异步读端口)

  • RAM32M: 一个 LUT6 实现 32x6 的 RAM(4个写端口,4个读端口,结构特殊)

示例:使用 RAM64X1S
// 直接实例化一个 64x1 的 LUTRAM
RAM64X1S #(.INIT(64'h0000000000000000) // 可选的初始值
) RAM64X1S_inst (.O(O),       // 1位数据输出.A0(A0),     // 地址位[0].A1(A1),     // 地址位[1].A2(A2),     // 地址位[2].A3(A3),     // 地址位[3].A4(A4),     // 地址位[4].A5(A5),     // 地址位[5].D(D),       // 1位数据输入.WCLK(WCLK), // 写时钟.WE(WE)      // 写使能
);

要构建一个更宽的 RAM,你需要将多个这样的原语并排实例化。

这种方法通常只在高级优化或特殊需求时使用,对于一般应用,推断方法更简单高效。

方法三:使用 IP 核生成器

在 Vivado 的 IP Catalog 中,你可以使用 Distributed Memory Generator 这个 IP 核。

  1. 打开 Vivado,在 IP Catalog 中搜索 "Distributed Memory"。

  2. 双击打开配置界面。

  3. 你可以选择内存类型:

    • 单端口 RAM

    • 简单的双端口 RAM

    • 真双端口 RAM(注意:LUTRAM 对真双端口的支持有限,通常需要多个 LUT 实现,可能不如 Block RAM 高效)

    • ROM

  4. 设置宽度、深度等参数。

  5. 生成 IP 核,然后在你的代码中实例化生成的模块。

这种方法适用于希望快速生成并集成一个经过验证的 LUTRAM 模块的情况。

五、如何确认你的设计确实使用了 LUTRAM?

在 Vivado 中完成综合后,可以通过以下方式验证:

  1. 打开综合后的设计。

  2. 在 "Netlist" 窗口中,搜索你的 RAM 模块名。 你应该能看到它被实现为了 RAM64X1SRAM32X1D 等原语,或者被封装在一个更大的 DRAM* 模块中。

  3. 查看资源利用率报告。 在报告中,你会看到 "Distributed RAM" 资源被使用,而 "Block RAM" 没有被使用(除非你的设计其他地方用了)。

六、总结

特性LUTRAMBlock RAM
容量小(几Kb)大(几十到几百Kb)
位置分布式集中式,专用列
端口通常单端口或简单双端口真双端口
功耗通常较低(根据用量)较高(即使不用也耗电)
使用场景小缓冲区、FIFO、寄存器堆大型缓冲区、帧缓冲区、大型数据存储

七、最佳建议

  • 首选代码推断法,因为它灵活、可读性强、工具支持好。

  • 明确你的存储需求,小容量用 LUTRAM,大容量用 Block RAM

  • 在代码中,尽量使用同步读,以获得更好的时序性能。

  • 综合后,务必查看报告和原理图,确认工具是否按照你的预期实现了设计。

通过以上方法,你就可以高效地在 Xilinx FPGA 设计中利用 LUTRAM 这一灵活的资源了。

http://www.dtcms.com/a/585914.html

相关文章:

  • 漫谈 Java 轻量级的模板技术:从字符串替换到复杂模板
  • 免费网站空间有哪些mdx wordpress
  • 第九章 生成树
  • UniApp 全局使用字体教程
  • 404网站怎么做网站开发费用明细
  • python爬虫学习笔记
  • 【算法】递归算法实战:汉诺塔问题详解与代码实现
  • js 网站首页下拉广告南宁市网站开发建设
  • SolarEdge和英飞凌合作开发人工智能数据中心
  • asp.net core webapi------3.AutoMapper的使用
  • CCF LMCC人工智能大模型认证 青少年组 第一轮样题
  • 百度搜索不到asp做的网站全球知名购物网站有哪些
  • Android Studio 中 Gradle 同步慢 / 失败:清理、配置全攻略
  • Makefile极简指南
  • 信息系统项目管理师--论文case
  • win7 iis网站无法显示该页面网站上线准备
  • 华为防火墙基础功能详解:构建网络安全的基石
  • 北京网站定制设计开发公司宁波专业定制网站建设
  • 网站的后台怎么做调查问卷设计之家广告设计
  • WebRtc语音通话前置铃声处理
  • 使用XSHELL远程操作数据库
  • 淘宝客网站域名宜昌做网站哪家最便宜
  • 微信小程序中使用 MQTT 实现实时通信:技术难点与实践指南
  • Java computeIfAbsent() 方法详解
  • 做网站市场报价免费企业网站开源系统
  • 天元建设集团有限公司企业代码东莞做网站seo
  • Web前端摄像头调用安全性分析
  • 绵阳网站建设怎么做免费查公司
  • std之list
  • 前端:前端/浏览器 可以录屏吗 / 实践 / 录制 Microsoft Edge 标签页、应用窗口、整个屏幕