1 簡述
RAM :隨機(jī)存取存儲器(random access memory,RAM)又稱作“隨機(jī)存儲器”。在FPGA開發(fā)過程中經(jīng)常使用到,而所謂的雙端口RAM就是有兩組獨(dú)立的端口對存儲塊進(jìn)行讀寫操作,如下圖所示。
一般在應(yīng)用時(shí),一個(gè)作為讀端口,另一個(gè)作為寫端口(也可以同時(shí)寫和讀)。
2 例化IP核
在開發(fā)過程中,常會(huì)用到雙端口RAM,下面說一下FPGA中雙端口RAM的常規(guī)使用方法,更多的使用方案可翻閱參考文獻(xiàn)。
本次仿真采用Xilinx的 Block Memory Generator v8.4的IP核來進(jìn)行例化,例化參數(shù)如下。
porta端口配置
portb端口配置
若以端口a作為寫端口,b作為讀端口,則寫端口的數(shù)據(jù)位寬為128bit,深度為8192,則地址位寬為14bit,而讀端口的數(shù)據(jù)位寬為32bit,深度為3276,則地址寬度為15bit。
3 端口描述
在寫仿真激勵(lì)之前,需要了解各端口在IP核中的功能,例化后的IP核如下圖所示
各端口定義如下,端口b定義和a一樣。
4 仿真激勵(lì)編寫
根據(jù)端口定義設(shè)計(jì)仿真激勵(lì),tb代碼如下。
`timescale 1ns / 1ps
module tb_memory();
reg [12:0] addra;
reg clka ;
reg [127:0] dina ;
reg wea ;
reg ena ;
reg [14:0] addrb;
reg clkb ;
wire [31:0] doutb;
reg enb ;
reg web ;
initial begin
addra = 13'd0;
clka = 1'b0 ;
dina = 128'h40000000300000002000000010000000;
wea = 1'b1;
ena = 1'b1;
addrb = 15'd0;
clkb = 1'b0 ;
enb = 1'b1;
web = 1'b0;
end
always #10 clka = ~clka;//寫時(shí)鐘為50M
always #20 clkb = ~clkb;//讀時(shí)鐘為25M
reg [15:0] counta = 16'd0;
always @(posedge clka) begin;
if(wea==1'b1) begin
addra <= addra + 13'b1;
dina <= dina + 128'b1;
if (addra == 13'h3fff) begin
addra <= 13'h0;
end
end
end
reg [15:0] countb = 16'd0;
always @(posedge clkb) begin
if(enb==1'b1) begin
addrb <= addrb + 15'b1;
if (addrb == 15'h3fff) begin
addrb <= 15'h0;
end
end
end
design_1_wrapper tb_memory(
.BRAM_PORTA_0_addr(addra),
.BRAM_PORTA_0_clk (clka ),
.BRAM_PORTA_0_din (dina ),
.BRAM_PORTA_0_we (wea ),
.BRAM_PORTA_0_en (ena),
.BRAM_PORTB_0_addr(addrb),
.BRAM_PORTB_0_clk (clkb ),
.BRAM_PORTB_0_dout(doutb),
.BRAM_PORTB_0_we (web),
.BRAM_PORTB_0_en (enb)
);
endmodule
仿真結(jié)果如下圖所示
由上圖所示,由于寫數(shù)據(jù)的位寬為128bit,讀數(shù)據(jù)的位寬為32bit,因此需要讀4次拼接起來才能恢復(fù)寫入的數(shù)據(jù)。
-
存儲器
+關(guān)注
關(guān)注
38文章
7452瀏覽量
163599 -
RAM
+關(guān)注
關(guān)注
8文章
1367瀏覽量
114528 -
FPGA開發(fā)
+關(guān)注
關(guān)注
1文章
43瀏覽量
14891 -
隨機(jī)存取存儲器
+關(guān)注
關(guān)注
0文章
44瀏覽量
8952
發(fā)布評論請先 登錄
相關(guān)推薦
評論