簡介
今天購買了AXLINX AX7020的開發闆,從今天開始每一個例程都要做文檔記錄,為自己加油。
本實驗,基于ALINX AX7020開發闆,晶片為xc7z020clg400-2。
開發闆輸入時鐘為50MHz
單口和雙口指的是位址線資料線的組數。
單口RAM隻有一組資料線和位址線,讀寫不能同時進行
雙口RAM有兩組位址線和資料線,讀寫可以同時進行
一、單端口RAM設計
RAM存儲器是一種可以暫時存儲資料或信号的常用器件,它通常由鎖存器陣列構成。在時鐘上升沿,采集位址,輸入資料,執行相關控制資訊。如果寫使能有效,則執行一次寫操作。

上代碼:
`timescale 1ns/1ps
module single_ram#(
parameter ADDR_WIDTH = 4,
parameter ADDR_LENGTH = 12,
parameter DATA_WIDTH = 4
)(
input clk,
input wr_en,
input rd_en,
input [DATA_WIDTH-1:0] din,
input [ADDR_WIDTH-1:0] addr,
output reg [DATA_WIDTH-1:0] dout
);
reg [DATA_WIDTH-1:0] ram [ADDR_LENGTH-1:0];
always@(posedge clk)
begin
if(rd_en)
begin
dout <= ram[addr];
end
else
begin
if(wr_en)
begin
ram[addr] <= din;
end
end
end
endmodule
二、僞雙端口RAM設計
一個端口隻讀,一個端口隻寫;
上代碼:
`timescale 1ns/1ps
module simple_dual_ram#(
parameter DATA_WIDTH = 4,
parameter ADDR_WIDTH = 8,
parameter ADDR_LENGTH= 256
)(
input clk,
input rst_n,
input wr_en,
input rd_en,
input [ADDR_WIDTH-1:0] addr_w,
input [ADDR_WIDTH-1:0] addr_r,
input [DATA_WIDTH-1:0] din,
output [DATA_WIDTH-1:0] dout
);
reg [DATA_WIDTH-1:0] data_reg;
reg [DATA_WIDTH-1:0] ram [ADDR_LENGTH-1:0];
generate
genvar i;
for(i=0;i<ADDR_LENGTH-1;i=i+1)
begin
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
ram[i] <= {DATA_WIDTH{1'b0}};
else
ram[i] <= ram[i];
end
end
endgenerate
always@(posedge clk)
begin
if(wr_en)
ram[addr_w] <= din;
else
ram[addr_w] <= ram[addr_w];
end
always@(posedge clk)
begin
if(rd_en)
data_reg <= ram[addr_r];
else
data_reg <= ram[addr_r];
end
assign dout = data_reg;
endmodule
三、雙端口RAM
有兩組位址線和資料線,兩組都可以進行讀寫。
沒代碼
四、僞雙端口RAM和FIFO
RAM有位址線和資料線,可通過位址線對存儲單元進行尋址,讀取是随機的。RAM可分為:單口RAM和雙口RAM,雙口RAM又可以分為真雙口RAM和僞雙口RAM。
FIFO為先進新出,沒有位址線,無法對存儲單元進行尋址。FIFO的讀寫可同時進行,一個端口隻讀,一個端口隻寫。
FIFO可分為異步FIFO和同步FIFO,同步FIFO使用同一個時鐘信号進行資料的讀寫,異步FIFO采用兩個不同的時鐘信号進行讀寫,即兩個時 鐘同頻率不同相位,或者不同頻率都算是不同時鐘信号。
FIFO主要用于資料的緩沖,異步FIFO主要用于跨時鐘信号的同步。
FIFO有兩個基本的規則:
1.已經滿了不能再寫,
2.已經空了不能再讀。
整理不易,希望對同學有幫助,加油