FPGA基础 -- BRAM简介

一、什么是 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。

相关推荐
紫霄芯语7 小时前
观察者模式在FPGA中断系统的实战重构
观察者模式·fpga开发·重构
ARM+FPGA+AI工业主板定制专家1 天前
国产化RK3576+FPGA架构|晶圆传输机器人高速定位+AI瑕疵检测一体化方案
fpga开发·架构·机器人·嵌入式·fpga·工控·机器人运控
Eloudy2 天前
FPGA (QSFP28 + CMAC US+ RoCEv2) 与 Ubuntu22 + Mellanox 网卡直连分析
fpga开发
szxinmai主板定制专家2 天前
RK3568+FPGA高速并行采集|半导体探针测试设备多通道同步数据采集系统设计
人工智能·嵌入式硬件·计算机视觉·fpga开发
ARM|X86+FPGA工业主板厂家3 天前
RK3588+FPGA+EtherCAT异构架构解析|工业场景如何同时保住AI算力与微秒级运动实时性
人工智能·fpga开发·架构
zlinear数据采集卡3 天前
从“脏信号”到“纳伏级纯净”:硬核拆解DABL7606的多级抗混叠滤波与24位过采样算法
arm开发·科技·嵌入式硬件·fpga开发·开源
尤老师FPGA3 天前
HDMI数据的接收发送实验(二十)
fpga开发
千寻xun4 天前
三、实战篇-NVME SSD控制之FPGA实现(一)
fpga开发·nvme ssd·nvme协议
XMAIPC_Robot4 天前
软硬协同实时控制|RK3588业务调度+FPGA硬件时序,ethercat实现半导体设备微秒级响应(125us)
linux·arm开发·人工智能·fpga开发
upper20204 天前
从零开始设计riscv cpu记录之七
fpga开发·riscv·riscv设计·btb·分支预测