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,可以使得输出数据比正常延迟两拍,波形图如下:
在这里插入图片描述

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值