当前位置:   article > 正文

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

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

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

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

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/586015
推荐阅读
相关标签
  

闽ICP备14008679号