一、什么是 BRAM?
1. 它的全称是:Block RAM(块状随机访问存储器)
它是 FPGA 芯片内部自带的一种"大容量存储器 ",和我们用 reg
定义的一位位寄存器不一样,BRAM 是专门用来存数据的专属硬件资源。
2. 举个生活中类比
假设你在一个工厂做流水线处理任务:
存储方式 | 类比 | 特点 |
---|---|---|
reg |
抽屉一格一格 | 快速取放,但数量有限(资源小) |
BRAM |
大货架仓库 | 存储多,占地大,但更节省空间 |
3. 为什么要有 BRAM?
FPGA 的逻辑资源(比如寄存器、查找表LUT)只能表示有限的逻辑,但如果你要:
- 存放一张图像(几千个像素)
- 做一个缓存队列、图像 FIFO
- 模拟一个内存或 ROM
这种情况你用一堆 reg
就太浪费了!
这时就需要用 BRAM ------ 它是 FPGA 专门为你准备的大块存储区 ,效率高、功耗低、容量大。
二、Verilog 中如何写出能"变成 BRAM"的代码?
你不能直接说"我要用 BRAM",而是要用特定的写法让 FPGA 自动把你写的代码映射为 BRAM。
1. 写一个数组来存储数据(这一步是语法)
verilog
reg [7:0] memory [0:1023]; // 8位数据 × 1024行
这就等于你要一个 1KB 的存储空间。
2. 必须用"同步方式"读写(这一步是时序建模)
verilog
always @(posedge clk) begin
if (we)
memory[addr] <= din; // 写操作
dout <= memory[addr]; // 读操作(同步读)
end
注意:
posedge clk
是时钟上升沿;we
是写使能;addr
是地址;din
是输入数据;dout
是输出数据。
如果你写成这种结构,Vivado / Quartus 就能自动识别成 BRAM。
三、那这和普通 reg 有什么区别?
项目 | reg 数组(普通寄存器) | BRAM(块状RAM) |
---|---|---|
存储大小 | 较小(几十到几百条) | 大(几千或几万个) |
资源消耗 | 用的是逻辑块(LUT+FF) | 用的是 BRAM 资源 |
功耗 | 高 | 低 |
延迟 | 可组合(无延迟)或同步 | 同步,一般有一个时钟周期延迟 |
使用限制 | 灵活,仿真/综合都能用 | 写法必须合规,才能被推导为 BRAM |
四、怎么知道你的数组是否映射成了 BRAM?
用 Vivado、Quartus 工具综合之后:
方法一:看日志
txt
INFO: [Synth 8-5858] RAM inferred for "memory": RAM_STYLE=block, WIDTH=8, DEPTH=1024
说明它已经帮你识别为一个 Block RAM。
方法二:RTL Viewer 图形中你会看到:
- 一个 Memory Block 模块
- 不是一堆触发器(FF)
五、实际例子:用 BRAM 存储数据
verilog
module ram_example (
input clk,
input we,
input [9:0] addr,
input [7:0] din,
output reg [7:0] dout
);
reg [7:0] mem [0:1023];
always @(posedge clk) begin
if (we)
mem[addr] <= din;
dout <= mem[addr];
end
endmodule
如果你这样写,FPGA综合工具就会识别成一个8位 × 1024深度的 BRAM。
六、testbench 中怎么用数组驱动这个模块?
你可以这样写一个简单的测试平台:
verilog
module tb;
reg clk = 0, we;
reg [9:0] addr;
reg [7:0] din;
wire [7:0] dout;
// 实例化你的 DUT
ram_example dut (
.clk(clk),
.we(we),
.addr(addr),
.din(din),
.dout(dout)
);
// 生成时钟
always #5 clk = ~clk;
// 驱动过程
initial begin
we = 1;
// 写入十个值
for (addr = 0; addr < 10; addr = addr + 1) begin
din = addr + 8'h10;
#10;
end
we = 0;
// 读出十个值
for (addr = 0; addr < 10; addr = addr + 1)
#10;
$stop;
end
endmodule
总结一句话
BRAM 就是 FPGA 中专用的、高效的、大块存储硬件。你用 Verilog 写出正确的数组 + 同步读写逻辑,就能让综合工具自动把它合成成 BRAM。