(1)RAM IP核简介
RAM是随机存取存储器(Random Access Memory)的简称,是一个易失性存储器,其工作时可以随时对任何一个指定地址写入或读出数据。(掉电数据丢失)
(2)RAM IP核的配置
- 单端口RAM读写共用一根地址线,一个时钟,读写操作不能同时进行。
- 简单双端口RAM,读写有自己专门的地址线,写端口只能进行数据写入,读端口只能进行数据读出。
- 真正双端口RAM,读写端口不固定,可以自定义。
- 写优先:在同一时刻对同一个地址进行读写,读出的数据为刚刚写入的数据。
- 读优先:在同一时刻对同一个地址进行读写,读出的数据为前一刻写入的数据。
- 不变模式:不能在同一时刻进行读写。
单端口RAM配置过程:
简单双端口RAM配置过程:
真正双端口RAM的配置:
(3)单端口RAM IP核的调用:
module ram
(
input clk ,
input wea ,
input [7:0]add ,
input [7:0]data_in,
output[7:0]data_out
);
//wea 读写控制端,高电平为写,低电平为读
s_ram_8x256 ram_inst (
.clka(clk), // input wire clka
.wea(wea), // input wire [0 : 0] wea
.addra(add), // input wire [7 : 0] addra
.dina(data_in), // input wire [7 : 0] dina
.douta(data_out) // output wire [7 : 0] douta
);
endmodule
(4)仿真文件代码:
`timescale 1ns / 1ps
module ram_tb;
reg clk ;
reg reset_n ;
reg wea ;
reg [7:0]add ;
wire [7:0]data_in ;
wire [7:0]data_out;
ram ram_inst
(
.clk (clk ) ,
.wea (wea ) ,
.add (add ) ,
.data_in (data_in ) ,
.data_out(data_out)
);
initial clk = 1'b1;
always #10 clk = ~clk;
initial begin
reset_n <= 1'd0;
#21;
reset_n <= 1'd1;
#100_000;
$stop;
end
//地址线设计
always@(posedge clk or negedge reset_n)
if(!reset_n)
add <= 8'd0;
else if(add == 8'd255)
add <= 8'd0;
else
add <= add + 8'd1;
//wea信号设计
always@(posedge clk or negedge reset_n)
if(!reset_n)
wea <= 1'd1;
else if(add == 8'd255)
wea <= ~wea;
else
wea <= wea;
//data_in信号设计
assign data_in = add;
endmodule
(5)仿真波形: