FPGA入门学习—BRAM IP的使用(简单双端口Simple Dual Port RAM):
-
1、BRAM大小的计算:
宽度18bit * 深度1024 = 18KBit(1个18K BRAM)注:位宽不足18或深度不足1024,按照一个18K BRAM计算
宽度36bit * 深度1024 = 36KBit(1个36K BRAM)
地址位宽:ceil(log2(Depth)) -
2、BRAM IP的配置:
在Vivado中选择 Block Memory Generator IP,按照需求对参数进行配置。(下面以数据宽度8Bit,深度1024为例)
具体配置如下:
Basic:
Port A Options:
Port B Options:
-
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端口读取的数据(输出)
- 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)
- 5、BRAM 读写进一步设计:
设置输出寄存器,使得输出数据比正常晚一拍
设置输出寄存器后的波形图:
同时勾选Primitives Output Register 和Core Output Register,可以使得输出数据比正常延迟两拍,波形图如下: