RAM简介:
随即存取存储器(Random Access Memory,RAM)
可以把数据随时存储到任一指定的数据储存单元,也可以随时从储存单元中读取数据,在FPGA中通常作用:
用来存放程序及执行过程中产生的数据和运算结果等。
读写速率由时钟频率决定
ZYNQ7020拥有140个BRAM,每一个BRAM为36kb
32K × 1,
16K × 2,
8K × 4,
4K × 9 (or x 8),
2K ×18 (or x 16),
1K × 36 (or x 32),
512 × 72 (or x 64)
单端口:
读写数据不能同时进行
伪双端口:
一个端口写一个端口读(固定)
真双端口:
一个端口读(写)一个端口写(读)(不固定)
参数说明:
Interface Type:
RAM接口总线。这里保持默认,选择Native 接口类型(标准RAM接口总线)。
Memory Type:
存储器类型。可配置为Single Port RAM(单端口RAM)、Simple Dual Port RAM (伪双端口RAM)、True Dual Port RAM(真双端口RAM)、Single Port RAM(单端口ROM)和Dual Port ROM(双端口ROM)
ECC Options:
纠错能力选项,单端口RAM不支持ECC。
Write Enable:
字节写使能选项,勾中后可以单独将数据的某个字节写入RAM中。
Algorithm Options:
算法选项。可选择Minimum Area(最小面积)、Low Power(低功耗)和Fixed Primitives(固定的原语)
这里的数据参数选择10 x 1024,其他全部选择默认即可。
驱动程序设计思路:
将RAM一直进行使能使其一直处于写入数据状态。
驱动程序:
`timescale 1ns / 1ps
module RAM(
input clk ,//system clock
input rst_n ,//reset
input [7:0] data ,//input data
input done ,//done
input flag ,//flag
output [7:0] doutb //RAM output data
);
reg en ;//energy
reg wea ;//write enable
reg [9:0] addra ;//address A
reg [7:0] dina ;//input data A
reg [9:0] addrb ;//address B
//将RAM使能
always@(posedge clk)
if(!rst_n)
en <= 0;
else
en <= 1;
//写入数据
always@(posedge clk)
if(!rst_n)//初始化输入数据
begin
wea <= 0;//read
addra <= 0;
dina <= 0;
end
else if(done == 1)
begin
wea <= 1;//write
addra <= addra + 1;//地址+1
dina <= data;//将data赋值为RAM input data
end
else
begin
wea <= 0;//read
addra <= addra;//address
dina <= 0;//使RAM input data清零
end
//当触发信号flag触发时(flag==1)开始读取数据。
always@(posedge clk)
if(!rst_n)
addrb <= 0;
else if(flag == 1)
addrb <= addrb + 1;
IP例化:
blk_mem_gen_0 ram_u (
.clka (clk ), // input wire clka
.ena (en ), // input wire ena
.wea (wea ), // input wire [0 : 0] wea
.addra (addra ), // input wire [9 : 0] addra
.dina (dina ), // input wire [7 : 0] dina
.clkb (clk ), // input wire clkb
.enb (en ), // input wire enb
.addrb (addrb ), // input wire [9 : 0] addrb
.doutb (doutb ) // output wire [7 : 0] doutb
);
编写思路:
通过串口通信进行数据传输(TX发送数据,RX读取数据),将数据存放到RAM中,通过按键将flag信号置为高电平对RAM中数据进行读取操作。
顶层模块:
`timescale 1ns / 1ps
module TOP(
input clk ,
input rst_n ,
input rx ,
input key ,
output tx
);
wire [7:0] DATA ;
wire done ;
wire flag ;
wire [7:0] doutb ;
例化RAM模块:
RAM u2(
.clk (clk ) ,
.rst_n (rst_n ) ,
.data (DATA ) ,
.done (done ) ,
.flag (flag ) ,
.doutb (doutb )
);
RX 以及TX模块例化:
RX u0(
.clk (clk ) ,
.rst_n (rst_n ) ,
.rx (rx ) ,
.DATA (DATA ) ,
.done (done )
);
TX u1(
.clk (clk ) ,
.rst_n (rst_n ) ,
.done (flag ) ,
.DATA (doutb ) ,
.tx (tx )
);
例化按键消抖模块:
key u3(
.clk (clk ) ,
.rst_n (rst_n ) ,
.key (key ) ,
.flag (flag )
);
实验截图: