Quick Start
- 步骤1:打开Vivado(或Quartus)并新建工程,选择目标器件(如Xilinx Artix-7或Intel Cyclone V)。
- 步骤2:编写一个深度256、位宽32的双端口存储器模块,分别用BRAM和LUTRAM实现。
- 步骤3:在代码中通过综合属性(syn_ramstyle = "block_ram" 或 "distributed_ram")显式指定实现方式。
- 步骤4:运行综合(Synthesis),查看综合报告中的资源利用率(BRAM_18K或LUTRAM计数)。
- 步骤5:打开功耗分析(Report Power),对比两种实现的动态功耗和静态功耗。
- 步骤6:运行实现(Implementation),检查时序报告(Setup/Hold Slack),确认Fmax差异。
- 步骤7:在仿真中写入并读出数据,验证功能正确性。
- 步骤8:记录结果:资源、功耗、Fmax,形成对比表。
前置条件与环境
| 项目/推荐值 | 说明 | 替代方案 |
|---|---|---|
| 器件/板卡 | Xilinx Artix-7 XC7A35T 或 Intel Cyclone V 5CEBA4 | 任何含BRAM的FPGA(如Lattice ECP5) |
| EDA版本 | Vivado 2023.1 或 Quartus Prime 22.1 | ISE 14.7(较老,属性写法不同) |
| 仿真器 | Vivado Simulator 或 ModelSim SE-64 2020.1 | Verilator(仅仿真,不支持功耗分析) |
| 时钟/复位 | 单时钟100 MHz,同步高有效复位 | 异步复位亦可,但需注意CDC |
| 接口依赖 | 双端口RAM:一个读口、一个写口,独立地址 | 单端口RAM也可,但对比维度减少 |
| 约束文件 | XDC:create_clock -period 10 [get_ports clk] | SDC for Quartus |
目标与验收标准
完成以下目标即算验收通过:
- 功能:双端口存储器读写正确,无数据冲突。
- 资源:BRAM实现消耗1个BRAM_18K(或1个M9K),LUTRAM实现消耗约256个LUT + 128个FF。
- 功耗:LUTRAM实现动态功耗比BRAM高30%-50%(典型值),静态功耗略低。
- 时序:LUTRAM实现Fmax比BRAM高10%-20%(因为LUTRAM路径更短)。
- 验收方式:查看Vivado/Quartus的Report Power和Report Timing。
实施步骤
工程结构
创建两个顶层模块:ram_bram 和 ram_lutram,每个模块包含一个双端口存储器实例。建议使用参数化设计:DATA_WIDTH=32,ADDR_WIDTH=8(深度256)。
关键模块:BRAM实现
module ram_bram #(
parameter DATA_WIDTH = 32,
parameter ADDR_WIDTH = 8
)(
input wire clk,
input wire we,
input wire [ADDR_WIDTH-1:0] waddr,
input wire [DATA_WIDTH-1:0] wdata,
input wire [ADDR_WIDTH-1:0] raddr,
output reg [DATA_WIDTH-1:0] rdata
);
(* ram_style = "block" *) reg [DATA_WIDTH-1:0] mem [0:(1<<ADDR_WIDTH)-1];
always @(posedge clk) begin
if (we) mem[waddr] <= wdata;
rdata <= mem[raddr];
end
endmodule注意:ram_style = "block" 会强制综合工具使用BRAM。若未指定,工具可能自动推断为LUTRAM。
关键模块:LUTRAM实现
module ram_lutram #(
parameter DATA_WIDTH = 32,
parameter ADDR_WIDTH = 8
)(
input wire clk,
input wire we,
input wire [ADDR_WIDTH-1:0] waddr,
input wire [DATA_WIDTH-1:0] wdata,
input wire [ADDR_WIDTH-1:0] raddr,
output reg [DATA_WIDTH-1:0] rdata
);
(* ram_style = "distributed" *) reg [DATA_WIDTH-1:0] mem [0:(1<<ADDR_WIDTH)-1];
always @(posedge clk) begin
if (we) mem[waddr] <= wdata;
rdata <= mem[raddr];
end
endmodule注意:ram_style = "distributed" 强制使用LUTRAM。深度超过64时,LUTRAM会占用大量LUT和FF,且可能无法满足时序。
时序/CDC/约束
对于双端口RAM,需确保读写地址不冲突(或使用真双端口)。约束文件只需定义主时钟:



