FPGA開發中使用頻率非常高的兩個IP就是FIFO和BRAM,上一篇文章中已經詳細介紹了Vivado FIFO IP,今天我們來聊一聊BRAM IP。
本文將詳細介紹Vivado中BRAM IP的配置方式和使用技巧。
一、BRAM IP核的配置
1、打開BRAM IP核
在Vivado的IP Catalog中找到Block Memory Generator IP核,雙擊打開參數配置界面。
2、配置BRAM IP基本參數
(1)IP名
定制的IP的名字只能在定制時設定好,后續不能修改。
IP名設定,簡單易懂即可,按照功能或數據寬度和深度來設定即可,例如BRAM_8x256,即表示數據寬度為8bit,數據深度為256bit。
(2)接口類型(Interface Type)
AXI4:AXI4總線通信協議接口
(3)存儲類型(Memory Type)
Single Port RAM:單端口RAM
Simple Dual Port RAM:簡單雙端口RAM,可選同步時鐘和異步時鐘,A端口只支持寫數據,B端口只支持讀數據。
True Dual Port RAM:真雙端口RAM,可選同步時鐘和異步時鐘,A端口和B端口都支持寫數據和讀數據。
Single Port ROM:單端口ROM
Dual Port ROM:雙端口ROM,A端口和B端口都可以讀取數據
3、配置A端口或B端口參數
A端口和B端口參數配置界面基本一致,這里只介紹A端口的參數配置。
(1)存儲大小設置(Memory Size)
設置讀數據或寫數據端的數據位寬和深度,數據位寬范圍為1 ~ 4608bit,數存儲深度為2~1048576。
operating mode:讀寫同一個地址時,操作模式設定:寫優先、讀優先、不變,建議在實際應用時不出現這種情況。
Enable Port Type:設定是否開放端口使能控制信號。
(2)輸出數據寄存設置
Primitives Output Register:輸出數據是否插入一個寄存器,如果不選中這個,則讀數據延時只有1個周期,否則讀數據延時有2個周期。
建議選中這個輸出寄存器,可以改善時序。
(3)復位參數設置
RSTA Pin (setreset pin):復位端口選擇,如果選中,則開放復位端口。
Output Reset Value (Hex):設定復位生效后,輸出數據值,默認為0
4、Other Options
這部分初始化值,對于RAM來說可能用處不大,但對于ROM來說很重要。
選中這個Load Init File,再點擊“Browse”選中“coe或mif”格式文件,最后點擊“Edit”,在打開的界面選擇“Valide”校驗一下,如果有問題,這部分會提示紅色文字,否則繼續下一步即可。
5、IP設置參數總覽
IP設置參數總覽,可看到資源消耗、寬度、深度、讀延遲等信息。
6、點擊OK生成IP核。
在IP核生成完成后,點擊source窗口下的“IP source”,鼠標左鍵單擊這個IP,在“Instantiation Template”下,雙擊“veo”后綴文件,即可看到例化模板。
二、BRAM IP核的接口
1、時鐘信號和復位信號
復位信號 rsta/rstb
時鐘 clka(A端口時鐘) clkb(b端口時鐘),復位信號 rsta(A端口復位),rstb(B端口復位)
2、端口信號
A和B端口信號基本一樣,這里以A端口為例。
ena A端口使能信號
wea A端口寫使能信號
addra A端口讀寫地址
dina A端口的寫入數據
douta A端口的讀取數據
三、BRAM IP核的調用
BRAM IP核的調用很簡單,這里以同步時鐘下的簡單雙端口RAM為例:
module top (
input clk,
input [7:0] data_in,
input wr_en,
input [7:0] wr_addr,
input [7:0] rd_addr,
output [7:0] data_out
);
BRAM_8x256 u_BRAM_8x256 (
.clka(clk), // input wire clka
.ena(1'b1), // input wire ena
.wea(wr_en), // input wire [0 : 0] wea
.addra(wr_addr), // input wire [7 : 0] addra
.dina(data_in), // input wire [7 : 0] dina
.clkb(clk), // input wire clkb
.enb(1'b1), // input wire enb
.addrb(rd_addr), // input wire [7 : 0] addrb
.doutb(data_out) // output wire [7 : 0] doutb
);
endmodule
下面是BRAM IP核的一個簡單的testbench:
module test;
reg clk;
reg [7:0] din;
reg wen;
reg [7:0] waddr;
reg [7:0] raddr;
wire [7:0] dout;
top u_top(
.clk(clk),
.data_in(din),
.wr_en(wen),
.wr_addr(waddr),
.rd_addr(raddr),
.data_out(dout)
);
initial begin
clk = 0;
wen = 0; waddr = 0; raddr = 0;
#10 wen = 1; waddr = 1; din = 5;
#10 wen = 1; waddr = 2; din = 6;
#10 wen = 1; waddr = 3; din = 7;
#10 wen = 1; waddr = 4; din = 8;
#10 wen = 1; waddr = 5; din = 9;
#10 wen = 0; raddr = 1;
#10 wen = 0; raddr = 2;
#10 wen = 0; raddr = 3;
#10 wen = 0; raddr = 4;
#10 wen = 0; raddr = 5;
#30 $finish;
end
always #5 clk = ~clk;
endmodule
仿真測試圖:
-
FPGA
+關注
關注
1643文章
21925瀏覽量
612556 -
寄存器
+關注
關注
31文章
5402瀏覽量
122928 -
fifo
+關注
關注
3文章
397瀏覽量
44520 -
IP核
+關注
關注
4文章
337瀏覽量
50320 -
BRAM
+關注
關注
0文章
41瀏覽量
11206
發布評論請先 登錄
FPGA設計中BRAM的知識科普

請問vivado如何減少BRAM瓦片這一數量?如何操作?
初始化BRAM警告coe文件不存在
如何使用Vivado IP Block Design?
在vivado中bram加載coe文件數據僅在實例化中生成datain
URAM和BRAM的區別是什么
如何在Vivado Design Suite 中進行IP加密
FPGA實現基于Vivado的BRAM IP核的使用
Vivado中xilinx_BRAM IP核使用

評論