目录
RAM(Random Access Memory )简介
当我们做相关项目时,经常会遇到存储数据的问题,数据量过大时,我们可以将其存储在 FPGA 芯片的外设存储器上,比如sdram、 ddr sdram 等,然而访问这些外设存储器相对比较麻烦,因此当数据量较小时,我们可以直接使用 FPGA 芯片内部自带的 IP 生成的 RAM。 RAM (random access memory)是随机存储器的意思, ram 可以按照所需进行随机读/写,掉电后数据丢失。
配置RAM
打开IP Catalog,配置ROM用的也是这个IP核
配置IP核,有多种模式可选择:单口RAM,简单双口RAM,真双口RAM,单口ROM,双口ROM
单口RAM
“WRITE_FIRST” 模式,写操作时,输出端口会将当前写的数据输出。(ASIC中又称“write through”,或AWT,Async)
“READ_FIRST” 模式,写操作时,输出端口会将当前写地址的原数据输出。
“NO_CHANGE”模式,写操作时,输出端口会保持原值不变。只有在读操作的过程中输出端口才会变化
summary中检查无误点击OK生成IP核
程序设计
深度为16384,位宽为16bit的RAM,写数据为wr_addr,写完就读,读完就写,并使用testbench进行仿真
`timescale 1ns / 1ps
// 单口RAM
module ram_ctrl(
input clk,
input rst_n,
//input [15:0] wr_data, // 写入数据
output [15:0] rd_data // 读出数据
);
parameter Depth = 16384;
reg wr_en; //高电平时向RAM中写入数据,低电平时从RAM中读出数据
reg [13:0] wr_addr; // 写地址 ---深度为16384
reg [13:0] rd_addr; // 读地址
wire [13:0] addr; // 地址
wire [15:0] wr_data;
assign wr_data = wr_addr ; //写入数据
//----------------- wr_en
always@(posedge clk or negedge rst_n) begin
if(!rst_n)
wr_en <= 1'b1;
else if(rd_addr == Depth - 1) // 读完了
wr_en <= 1'b1;
else if(wr_addr == Depth - 1) // 写完了
wr_en <= 1'b0;
else
wr_en <= wr_en;
end
//----------------- wr_addr
always@(posedge clk or negedge rst_n) begin
if(!rst_n)
wr_addr <= 'b0;
else if(wr_en) begin
if(wr_addr == Depth - 1)
wr_addr <= 'b0;
else
wr_addr <= wr_addr + 1'b1;
end
else
wr_addr <= 'b0;
end
//----------------- rd_addr
always@(posedge clk or negedge rst_n) begin
if(!rst_n)
rd_addr <= 'b0;
else if(!wr_en) begin
if(rd_addr == Depth - 1)
rd_addr <= 'b0;
else
rd_addr <= rd_addr + 1'b1;
end
else
rd_addr <= 'b0;
end
// ------------------ addr
assign addr = wr_en?wr_addr:rd_addr;
adc_data_ram adc_data_ram_inst(
.clka(clk), // 50Mhz
.ena(1'b1),
.wea(wr_en), // 写使能
.addra(addr), // 地址 -------读/写
.dina(wr_data), // 写数据
.douta(rd_data) // 读数据
);
endmodule
testbench
`timescale 1ns / 1ps
module tb_ram_ctrl();
reg clk;
reg rst_n;
wire [15:0] rd_data;
initial begin
clk = 1;
rst_n = 0;
#3000;
rst_n = 1;
end
always#10 clk = ~clk;
ram_ctrl ram_ctrl_inst(
.clk(clk),
.rst_n(rst_n),
.rd_data(rd_data)
);
endmodule
仿真结果
把显示格式改成analog,可以直观地看看
标签:clk,IP,RAM,vivado,wr,rst,data From: https://blog.csdn.net/2301_79235594/article/details/143486390