FPGA入门学习—BRAM IP的使用(简单双端口Simple Dual Port RAM)

FPGA入门学习—BRAM IP的使用(简单双端口Simple Dual Port RAM):

  1. 1、BRAM大小的计算:
    宽度18bit * 深度1024 = 18KBit(1个18K BRAM) 注:位宽不足18或深度不足1024,按照一个18K BRAM计算
    宽度36bit * 深度1024 = 36KBit(1个36K BRAM)
    地址位宽:ceil(log2(Depth))

  2. 2、BRAM IP的配置:
    在Vivado中选择 Block Memory Generator IP,按照需求对参数进行配置。(下面以数据宽度8Bit,深度1024为例)
    具体配置如下:
    Basic:
    在这里插入图片描述
    Port A Options:
    在这里插入图片描述
    Port B Options:
    在这里插入图片描述

  3. 3、BRAM 功能/时序分析:
    在这里插入图片描述

addra[9:0]、addrb[9:0]:A、B端口写/读数据的地址
clka、clkb:A、B端口的时钟
dina:A端口写入的数据(输入)
ena、enb:A、B端口的使能信号,控制A、B端口的使能
wea:A端口写入的使能信号
dout:B端口读取的数据(输出)

  1. 4、BRAM 读写设计:

注意第0拍时数据的存储,即地址自加要在使能信号有效后一拍开始。

module设计文件:

`timescale 1ns / 1ps
module test_bram(
	input clk,
	input rst_n
);
reg ena;
reg wea;
reg [9:0] addra;
reg enb;
reg [9:0] addrb;
//port A:clka,ena,wea,addra,dina
reg write_state;
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)
        begin
            ena <= 0;
            wea <= 0;
            addra <= 0;
            write_state <= 0;
        end
    else
    	begin
    		case(write_state)
    			1'b0:begin ena <= 1;wea <= 1;write_state <= 1'b1; end
    			1'b1:begin ena <= 1;wea <= 1;addra <= addra + 1'd1; end
    			default:write_state <= 1'b1;
    		endcase
    	end
end
//read data port B:clkb,enb,addrb
reg read_state;
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)
        begin
            enb <= 0;
            addrb <= 0;
            read_state <= 0;
        end
    else
    	begin
    		case(read_state)
    			1'b0:begin enb <= 1;read_state <= 1'b1; end
    			1'b1:begin enb <= 1;addrb <= addrb + 1'd1; end
    			default:read_state <= 1'b1;
    		endcase
    	end
end
wire [7:0]dina = addra[7:0];
wire [7:0]doutb;

blk_mem_gen_0 u_blk_mem_gen_0 (
  .clka(clk),    // input wire clka
  .ena(ena),      // input wire ena
  .wea(wea),      // input wire [0 : 0] wea
  .addra(addra),  // input wire [9 : 0] addra
  .dina(dina),    // input wire [7 : 0] dina
  .clkb(clk),    // input wire clkb
  .enb(enb),      // input wire enb
  .addrb(addrb),  // input wire [9 : 0] addrb
  .doutb(doutb)  // output wire [7 : 0] doutb
);

endmodule

module仿真文件:

`timescale 1ns / 1ps
module tb_test_bram;
reg clk;
reg rst_n;
initial begin
clk = 0;
rst_n = 0;
#200; rst_n = 1;
end
always#50 clk = ~clk;
test_bram u_test_bram(
	.clk(clk),
	.rst_n(rst_n)
);
endmodule

仿真波形图:
在这里插入图片描述
在这里插入图片描述

RTL分析原理图:
在这里插入图片描述
在这里插入图片描述
同时可以看到综合后使用了0.5个BRAM资源。(0.5个36K BRAM,即1个18K BRAM)

  1. 5、BRAM 读写进一步设计:

设置输出寄存器,使得输出数据比正常晚一拍

在这里插入图片描述
设置输出寄存器后的波形图:
在这里插入图片描述
同时勾选Primitives Output Register 和Core Output Register,可以使得输出数据比正常延迟两拍,波形图如下:
在这里插入图片描述

### 如何在Vivado中配置和使用BRAM IP核 #### 配置BRAM IP核 在 Vivado 中,通过 BRAM Memory Generator 可视化工具可以方便地生成 BRAM IP 核[^1]。具体操作如下: 启动 Vivado 后,在项目管理界面选择 “IP Catalog”,从中找到并双击打开 “Block Memory Generator”。这将开启 Block RAM (BRAM) 的配置向导。 在此过程中,可以根据需求设置参数,如内存宽度、深度以及其他特性选项。完成这些设定后点击 Generate 来创建所需的 BRAM 实例。 对于 Xilinx FPGA 而言,其内部集成了多种有用的 IP 核资源,其中就包含了像 BRAM 这样的存储类 IP 核[^2]。因此利用好这类预构建模块能够极大地简化设计流程,并提高开发效率。 #### 使用BRAM IP核实例 一旦成功生成了 BRAM IP 核文件,则可以在 RTL 设计里将其作为组件调用。通常情况下,会自动生成相应的 Verilog 或 VHDL 文件供集成到顶层实体中去。 值得注意的是,在某些特定应用场景下,原始输出寄存器(primitive output register)可以直接由 RAM 单元实现而无需额外声明,默认即具备相应配置属性[^3]。 ```verilog // 示例:Verilog 代码片段展示如何实例化一个名为 bram_0 的 BRAM IP 核 module top_module ( input wire clk, // ...其他端口定义... ); // 实例化 BRAM IPbram_0 your_instance_name ( .clka(clk), // 输入时钟信号a // ...连接其余所需接口... ); endmodule ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值