简介
今天购买了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.已经空了不能再读。
整理不易,希望对同学有帮助,加油