Distributed Memory Generator IP 核采用 LUT RAM 資源創(chuàng)建各種不同的存儲器結構。IP可用來創(chuàng)建只讀存儲器 (ROM)、單端口隨機存取存儲器 (RAM) 和簡單雙/雙端口 RAM 以及基于 SRL16 的 RAM。該IP的靈活的特性配置方式,使用戶能針對存儲器類型、數據寬度、存儲器大小、輸入/輸出選項和復位選項進行定制。
Distributed Memory Generator IP GUI界面如下:
該IP的主要特性為:
- 生成只讀存儲器 (ROM)、單、簡單雙和雙端口隨機存取存儲器 (RAM)以及基于SRL16 的 RAM;
- 支持 16 到 65536 的數據深度;
- 支持1 到 1024 之間的數據寬度;
- 可選的寄存輸入和輸出;
這個IP的端口如下圖所示:
輸入:
a:地址輸入;
Dpra:雙端口時的讀地址;
d:數據輸入;
Clk:時鐘
Qdpo_clk:雙端口模式下的第二個時鐘
We:寫使能
i_ce:輸入時鐘使能;
Qspo_ce:輸出時鐘使能;
Qdpo_ce:第二個端口的輸出時鐘使能;
輸出:
Spo:非寄存器模式下第一個端口的輸出數據
Dpo:非寄存器模式下第二個端口的輸出數據
Qspo:寄存器模式下第一個端口的輸出數據
Qdpo:寄存器模式下第二個端口的輸出數據
復位:
qspo_rst :寄存器模式下第一個端口的異步復位
qdpo_rst :寄存器模式下第二個端口的異步復位
qspo_srst:寄存器模式下第一個端口的同步復位
qdpo_srst :寄存器模式下第二個端口的同步復位
Distributed Memory在不同工作模式下的內部情況如下圖所示:
ROM模式:
單端口RAM模式:
雙端口RAM模式:
簡單雙端口模式:
一般情況下常用簡單雙端口模式進行跨時鐘域,簡單緩存的操作。用簡單雙端口實現一個簡單的跨時鐘域代碼如下:
// ============================================================
// File Name: tb_dist_mem_gen
// VERSION : V1.0
// DATA : 2023/8/18
// Author : FPGA干貨分享
// ============================================================
// 功能:xilinx Distributed Memory Generator ip 代碼仿真
// 使用簡單雙端口實現一個簡單的跨時鐘域
// delay :
// ============================================================
`timescale 1ns/100ps
module tb_dist_mem_gen ;
reg clka = 'd0 ;
reg ena = 'd1 ;
reg [0 : 0] wea = 'd1 ;
reg [5 : 0] addra = 'd0 ;
reg [15 : 0] dina = 'd0 ;
reg clkb = 'd1 ;
reg enb = 'd1 ;
reg [5 : 0] addrb = 'd0 ;
wire [15 : 0] doutb ;
reg [2:0] S_addr_a_flag ='d0 ;
reg S_a_flag ='d0 ;
reg [2:0] S_a_flag_2_b ='d0 ;
reg S_b_flag ='d0 ;
reg [2:0] S_clk_cnt8 ='d3 ;
always #1 clka = ~clka;
always #1 clkb = ~clkb;
//----------- clk_a ---//
always @(posedge clka)
if(ena && wea)
begin
addra <= addra + 'd1;
dina <= dina + 'd1;
end
always @(posedge clka)
S_addr_a_flag[0] <= (addra == 6'd10);
always @(posedge clka)
S_addr_a_flag[2:1] <= S_addr_a_flag[1:0] ;
always @(posedge clka)
S_a_flag <= |S_addr_a_flag ;
//----------- clk_b ---//
always @(posedge clkb)
S_a_flag_2_b <= {S_a_flag_2_b[1:0],S_a_flag} ;
always @(posedge clkb)
S_b_flag <= (!S_a_flag_2_b[2])&& S_a_flag_2_b[1] ;
always @(posedge clkb)
if((S_clk_cnt8 > 3'd2)&&S_b_flag)
S_clk_cnt8 <= 3'd2;
else
S_clk_cnt8 <= S_clk_cnt8 + 'd1;
always @(posedge clkb)
if(S_clk_cnt8 == 3'd1)
addrb <= 'd0;
else
addrb <= addrb + 'd1;
dist_mem_gen_0 dist_mem_gen_0 (
.a (addra ), // input wire [5 : 0] a
.d (dina ), // input wire [15 : 0] d
.dpra (addrb ), // input wire [5 : 0] dpra
.clk (clka ), // input wire clk
.we (wea ), // input wire we
.qdpo_clk (clkb ), // input wire qdpo_clk
.qdpo (doutb ) // output wire [15 : 0] dpo
);
endmodule
-
FPGA
+關注
關注
1630文章
21796瀏覽量
606010 -
存儲器
+關注
關注
38文章
7528瀏覽量
164344 -
RAM
+關注
關注
8文章
1369瀏覽量
115005 -
Xilinx
+關注
關注
71文章
2171瀏覽量
122134 -
IP核
+關注
關注
4文章
331瀏覽量
49638
發(fā)布評論請先 登錄
相關推薦
評論