一、引言:为什么需要 RAM?
在 FPGA 系统设计中,很多时候我们需要的是可读可写的存储器,这就是 RAM(Random Access Memory,随机存取存储器)。无论是用于数据缓存、帧缓冲还是实时数据存储,RAM 都是构建高效 FPGA 系统不可或缺的组成部分。
本文将从 RAM 的基本原理出发,详细讲解嵌入式块存储器 RAM 的分类、特性、配置方法以及在实际项目中的应用,特别关注如何通过 Vivado 工具链高效地使用 RAM IP 核。
二、RAM 的核心特性与应用场景
- RAM 的三大核心特性 与 ROM 相比,RAM 具有以下显著特性:
- 随机存取:支持对任意地址的读写操作,访问顺序不受限制
- 非破坏性读取:读取操作不会清除存储内容,数据可多次重复读取
- 覆盖写入:新数据写入会直接覆盖旧数据,支持动态更新
- 典型应用场景分析 场景一:数据速率匹配缓冲 这是 RAM 最常见的应用场景之一。考虑以下实际问题: 某 ADC 以 1μs 的间隔产生 12 位数据(速率:1000 个/ms),而串口以 115200 波特率发送数据(每 6 位数据需要 69.4μs)。数据产生速率远快于发送速率。
解决方案:
// 使用 RAM 作为数据缓冲器
module data_buffer(
input clk,
input rst_n,
input [11:0] adc_data,
input adc_data_valid,
output reg [5:0] uart_data,
output reg uart_data_valid
);
// 双端口 RAM:端口 A 用于写入 ADC 数据,端口 B 用于读取串口数据
// 深度:1000,宽度:12 位(写入)和 6 位(读取)
// 写入逻辑
always @(posedge clk) begin
if(adc_data_valid) begin
ram_wea <= 1'b1;
ram_addra <= write_addr;
ram_dina <= adc_data;
write_addr <= write_addr + 1;
end
end
// 读取逻辑
always @(posedge clk) begin
if(uart_ready) begin
ram_addrb <= read_addr;
uart_data <= ram_doutb[5:0]; // 只取低 6 位
read_addr <= read_addr + 1;
end
end
endmodule
场景二:图像帧缓冲 在视频处理系统中,RAM 常被用作帧缓冲器:
// TFT 显示屏图像缓冲
module tft_frame_buffer(
input clk_pixel, // 像素时钟
input clk_system, // 系统时钟
input [15:0] pixel_in,// RGB565 像素数据
input pixel_valid,
output [15:0] pixel_out
);
// 双端口 RAM 配置
// 端口 A:串口写入(系统时钟域)
// 端口 B:TFT 读取(像素时钟域)
// 存储需求计算:
// 800×480 分辨率,16 位/像素 → 800×480×16 = 6,144,000 bits
// 需要约 170 个 36Kb 的 BRAM 块
endmodule
三、RAM 的类型:SRAM 与 DRAM 详解
DDR3 控制器接口示例:
// DDR3 控制器接口示例
module ddr3_controller(
input clk,
input rst_n, // 用户接口
input [31:0] app_addr,
input [255:0] app_wdf_data,
input app_wdf_wren,
output [255:0] app_rd_data,
output app_rd_data_valid,
// DDR3 物理接口
output [13:0] ddr3_addr,
output [2:0] ddr3_ba,
output ddr3_cas_n,
output ddr3_ras_n,
output ddr3_we_n
);
// 使用 Xilinx MIG IP 核实现
endmodule
四、Vivado 中 RAM IP 核的详细配置指南
- RAM IP 核类型选择 在 Vivado 的 IP Catalog 中搜索"Block Memory Generator",可以看到多种 RAM 类型:


