赞
踩
RAM 是随机存取存储器(Random Access Memory)的简称,它是一种易失性存储器,RAM 工作时可以随时从任意一个合法地址写入或读取数据。
Vivado 软件自带的 Block Memory Generator IP 核(缩写为 BMG,中文名为块 RAM 生成器),可以用来配置单口RAM、伪双口RAM、真双口RAM、ROM( ROM 是一种只读存储器,也就是说,在工作时只能读出数据,而不能写入数据)。对于单端口 RAM,读写操作共用一组地址端口和数据端口,因此读写操作不能同时进行;对于伪双端口 RAM,读操作和写操作分别有各自的地址端口和数据端口(一个读端口和一个写端口),使用时要避免读写冲突;对于真正双端口 RAM,则有两个可以进行读写的地址端口和数据端口,使用时要避免读写冲突和写写冲突(IP 核内提供几种解决读写冲突和写写冲突策略,使用时根据需要进行选择)。
注意:
Block Memory Generator IP 核配置生成的 RAM 或者 ROM 使用的都是 FPGA 内部的 BRAM 资源只不过配置成 ROM 时只用到了嵌入式 BRAM 的读数据端口。
单端口 RAM 的框图如下:
各个端口的功能描述如下:
Block Memory Generator IP核的 IP Catalog 窗口如下,主要包括一个IP名称输入框核4个选项卡,页面依次进行介绍。
本次实验的用 Xilinx BMG IP 核配置成一个单端口的 RAM 并对其进行读写操作,系统框图如下:
单口 RAM IP 核的配置如下:
在单口 RAM IP读写代码中先例化了一个单口 RAM IP 核,然后对其进行读写操作。
它在复位完成后便一直进行单口 RAM IP 核的读写操作,再每轮操作中都是先向RAM的地址0到31写入数据(共计32个),然后再将地址0到31的数据读出(共计32个),其RAM IP读写时序图如下:
代码如下:
`timescale 1ns / 1ps module ram_ip_rw( input sys_clk, //系统时钟 input sys_rst_n //系统复位,低电平有效 ); //RAM 使能,高电平使能 reg ram_en; //RAM 读写使能信号,高电平写入,低电平读出 wire ram_we; //RAM 读写地址 wire [4:0] ram_addr; //写入 RAM 的数据 wire [7:0] ram_wr_data; //从 RAM 读取的数据 wire [7:0] ram_rd_data; //读写控制计数器,每次写入32个,读取32个,共计64个 reg [5:0] rw_count; //RAM 使能控制,高电平使能 always @(posedge sys_clk) begin if(!sys_rst_n) ram_en <= 0; else ram_en <= 1; end //RAM 读写使能信号,高电平写入,低电平读出 //计数器0~31时写入,计数器31~63时读取 assign ram_we = ((rw_count <= 31) && (ram_en == 1)) ? 1 : 0; //RAM 读写地址,0~31 assign ram_addr = (ram_en == 1) ? rw_count[4:0] : 0; //写入 RAM 数据,从地址0~31依次写入如0~31 assign ram_wr_data = (ram_we == 1) ? rw_count[4:0] : 0; //读写计数器,从0~63进行计数 always @(posedge sys_clk) begin if(!sys_rst_n) rw_count <= 0; else if((rw_count < 63) && (ram_en == 1)) rw_count <= rw_count + 1; else rw_count <= 0; end //例化单口RAM IP核 blk_mem_gen_0 u_blk_mem_gen_0_inst0( .clka(sys_clk), .ena(ram_en), .wea(ram_we), .addra(ram_addr), .dina(ram_wr_data), .douta(ram_rd_data) ); endmodule
仿真激励代码非常简单,只需要例化 单口 RAM IP读写模块 ,然后产生一个周期时钟即可,完整的代码如下:
`timescale 1ns / 1ps //仿真单位/仿真精度 module tb_ram_ip_rw(); reg sys_clk; //系统时钟 reg sys_rst_n; //系统复位,低电平有效 //信号初始化 initial begin sys_clk = 1'b0; sys_rst_n = 1'b0; #200 sys_rst_n = 1'b1; end //产生时钟 always #20 sys_clk = ~sys_clk; //例化需要仿真的IP核 ram_ip_rw tb_u_ram_ip_rw_inst0( .sys_clk(sys_clk), //系统时钟 .sys_rst_n(sys_rst_n) //系统复位,低电平有效 ); endmodule
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。