-
使用vivado中的BRAM可以通過例化
Block Memory Generator
這一ip并進行相關的設定。 -
另外可以通過直接編寫符合BRAM規(guī)范的代碼,借助綜合工具直接將其綜合為BRAM。這時需要通過
(*ram_style="block"*)
對array
進行修飾。 -
下面給出一種看似可以綜合為BRAM的示例。
module LUTRAM #( parameter ADDR_WIDTH = 32,
parameter DATA_WIDTH = 32,
parameter DEPTH = 1024)
(
input logic clk,
input logic rst_n,
//read port
input logic re,
input logic [ADDR_WIDTH-1:0] rd_addr,
output logic [DATA_WIDTH-1:0] rd_data,
//write port
input logic we,
input logic [ADDR_WIDTH-1:0] wr_addr,
input logic [DATA_WIDTH-1:0] wr_data
);
(*ram_style="block"*)logic [DATA_WIDTH-1:0] bram [0:DEPTH-1];
//read
always_ff@(posedge clk, negedge rst_n)
begin
if(!rst_n)
rd_data <= 0;
else if(re)
rd_data <= bram[rd_addr];
else
rd_data <= 0;
end
//write
always_ff @(posedge clk)
begin
if(we)
bram[wr_addr]<=wr_data;
end
endmodule
-
上述代碼雖然用
(*ram_style="block"*)
對array
進行了修飾,再綜合時卻沒有消耗BRAM資源,而是消耗了LUTRAM資源。 -
查看Vivado的官方手冊ug901可知,對于Distributed RAM(LUTRAM)和Dedicated Block RAM(BRAM),二者都是寫同步的。主要區(qū)別在于讀數(shù)據(jù),前者為異步,后者為同步的。
-
到這里也就清楚了為什么上方的代碼會被工具綜合為LUTRAM,最小的改動只需將
negedge rst_n
去掉即可。
※ 區(qū)別于(*ram_style="block"*)
,若要生成LUTRAM,相應的修飾應為(* ram_style="distributed" *)
文章來源:http://www.zghlxwxcb.cn/news/detail-557940.html -
最后貼出官方手冊中給出的簡易雙端口BRAM的一種示例代碼
文章來源地址http://www.zghlxwxcb.cn/news/detail-557940.html
到了這里,關于Vivado綜合生成BRAM及與LUTRAM的區(qū)別的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!