12 单口RAM IP核

RAM IP 核简介

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 简介

单端口 RAM 的框图如下:
在这里插入图片描述
各个端口的功能描述如下:
在这里插入图片描述

单口 RAM 配置核生成

打开 BMG IP 核的“Customize IP”窗口

  1. Vivado 工程左侧“Flow Navigator”栏中的“IP Catalog”
    在这里插入图片描述
  2. 在“IP Catalog”窗口的搜索栏中输入“Block Memory”关键字后,出现唯一匹配的“Block Memory Generator”
    在这里插入图片描述
  3. 双击“Block Memory Generator”后弹出 IP 核的配置界面
    在这里插入图片描述

BMG IP 核有关单口 RAM 的配置

Block Memory Generator IP核的 IP Catalog 窗口如下,主要包括一个IP名称输入框核4个选项卡,页面依次进行介绍。
在这里插入图片描述

  1. 在“Component Name”一栏可以设置该 IP 元件的名称
    在这里插入图片描述
  2. “Basic”选项卡
    在这里插入图片描述
    (1)“lnterface Type(接口模式)”:有两种接口模式可选,分别为 Native(常规)接口和 AXI4 接口。AXI4 模式一般是在处理器中的数据需要和 BRAM 交互时才会使用,当不需要与处理器数据进行交互时一般采用 Native 模式。
    (2) “Generate address interface with 32 bits”选项为是否生成位宽为 32 的地址接口,勾选后内存的数据位宽也必须设置成 32 的整数倍,一般不做勾选。
    (3) “Memory Type(存储类型)”:有五种类型可选,分别为“Single Port RAM(单端口RAM)”、“Simple Dual Port RAM(伪双端口 RAM)”、“True Dual Port RAM(真双端口 RAM)”、“Single Port ROM(单端口 ROM)”和“Dual Port ROM(双端口 ROM)”,这里以单端口 RAM 为例。
    (4) “Common Clock”选项:是否启用同步时钟,在单端口模式下不需要考虑这个问题。
    (5) “ECC Options(ECC 选项)”:ECC纠错码选项只有在伪双端口 RAM 类型下才可以进行配置。
    (6) “Write Enable(写使能)”:可以选择是否使用字节写使能功能,启用后可设置字节大小为 8 位或 9 位,需要注意的是启用后内存的数据位宽必须设置为所选字节大小的整数倍。
    (7) “Algorithm Options(算法选项)”:算法选项主要用于决定 BRAM 的拼接的方式,一般在BRAM 深度、宽度较大的时候起作用,有三种算法可选,分别为“Minimum Area(最小面积算法)”、“Low Power(低功耗算法)”和“Fixed Primitives(固定单元算法)”
  3. “Port A Options”选项卡
    在这里插入图片描述
    (1)“Memory Size(内存大小)”:用于指定端口读/写宽度和深度、运行模式和使能端口类型。
  • Write Width 写数据位宽,单位 bit,本次实验我们设置成 8,可设置的位宽范围为 1~4608。
  • Read Width 读数据位宽,其位宽设置必须与写数据位宽存在倍数关系(倍数比仅支持 1:1、1:2、1:4、1:8、2:1、4:1、8:1 和 16:1),通常情况下读/写数据位宽保持一致。
  • Write Depth 写深度,即 RAM 所能访问的地址范围。这里有一点需要注意,那就是写深度和写位宽的乘积不要超过器件本身的 ram 资源的大小。
  • Read Depth 读深度,当写数据位宽、读数据位宽和写深度的值确定后,读深度的值就会自动确定。
  • Operating Mode RAM 运作模式,有三种模式可选,分别是Write First(写优先模式)、 Read First(读优先模式)、No Change(不变模式),单口 RAM 一般选 No Change(不变模式)。
  • Enable Port Type 使能端口类型。有两种可选,分别为 Use ENA pin(添加使能端口 A 的信号)和 Always Enabled(取消使能信号,端口 A 一直处于使能状态)。
    (2)“Port A Optional Output Register”:用于为 RAM 的输出端添加寄存器。其作用是提高 BRAM 的运行频率和改善时序,当然为此付出的代价就是每勾选一个寄存器,输出就会延迟一拍。
  • Primitives Output Register 使用 BRAM 内部的寄存器打拍输出。
  • Core Output Register 使用 SLICE 的寄存器打拍输出。
  • SoftECC Input Register 当使用软 ECC 的时候,用 SLICE 的寄存器打拍。
  • REGCEA,当使用 Primitives Output Register 或者 Core Output Register 时,可以用 REGCEA 来使能相应的输出。
    (3)“Port A Output Reset Options”:用于配置端口的复位信号。可以添加一个复位信号(RSTA Pin)、配置复位时 RAM 输出总线上的数据值(Output Reset Value)、配置是否复位内置锁存器(Reset Memory Latch)、配置复位信号与时钟使能之间的优先级(Reset Priority)。
    (4)“READ Address Change A”:用于更改端口的读地址,这个功能只在 UltraScale 设备上使用。
  1. “Other Options”选项卡
    在这里插入图片描述
    (1)“Pipeline Stages within Mux”:输出端 Mux 选择器的流水线级数。在大位宽、大深度的 BRAM 拼接场景中会用 MUX 来选择输出地址所对应的数据,勾选该选项后可以使输出数据具有更好的时序。
    (2)“Memory Initialization(初始化文件)”:选择是否使用本地初始化文件(.coe 文件)来对存储空间进行初始化。
    (3)“Structural/UniSim Simulation Model Options”:用于选择结构仿真模型发生碰撞时生成的警告消息和输出的类型。
    (4)“Behavioral Simulation Model Options”:用于关闭仿真时的冲突告警和超出范围告警。
  2. “Summary”选项卡
    在这里插入图片描述
    该界面显示了配置的存储器的类型,消耗的 BRAM 资源等信息,检查没问题可以直接点击“OK”按钮生成 RAM IP 核。
    在这里插入图片描述
    在弹出的“Generate Output Products”窗口直接点击“Generate”即可。
    在这里插入图片描述

模块设计

本次实验的用 Xilinx BMG IP 核配置成一个单端口的 RAM 并对其进行读写操作,系统框图如下:
在这里插入图片描述

编写代码

生成单口 RAM IP 核

单口 RAM IP 核的配置如下:
在这里插入图片描述
在这里插入图片描述

单口 RAM IP读写代码编写

在单口 RAM IP读写代码中先例化了一个单口 RAM IP 核,然后对其进行读写操作。
它在复位完成后便一直进行单口 RAM IP 核的读写操作,再每轮操作中都是先向RAM的地址0到31写入数据(共计32个),然后再将地址0到31的数据读出(共计32个),其RAM IP读写时序图如下:
在这里插入图片描述
代码如下:

`timescale 1ns / 1psmodule 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) beginif(!sys_rst_n)ram_en <= 0;elseram_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) beginif(!sys_rst_n)rw_count <= 0;else if((rw_count < 63) && (ram_en == 1))rw_count <= rw_count + 1;elserw_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 beginsys_clk = 1'b0;sys_rst_n = 1'b0;#200sys_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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/499033.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flask知识--01

flask介绍 # python 界的web框架&#xff1a; Django&#xff1a;大而全&#xff0c;使用率较高 &#xff1a;https://github.com/django/django -FastAPI&#xff1a;新项目选择使用它&#xff1a;https://github.com/tiangolo/fastapi -flask&#xff1a;公司一些…

Mac电脑输入正确密码后提示密码错误

&#x1f3dd; 背景 Mac Pro 在擦键盘时&#xff0c;屏幕一直亮起&#xff0c;导致密码一致输入错误&#xff0c;想来没有什么问题便没有处理。但是&#xff01;&#xff01;&#xff01;在擦完键盘后输入正确的密码依旧提示密码错误&#x1f631; 接下来就是不断的重启、关机…

【Leetcode每日一题】二分查找 - 在排序数组中查找元素的第一个和最后一个位置(难度⭐⭐)(18)

1. 题目解析 Leetcode链接&#xff1a;34. 在排序数组中查找元素的第一个和最后一个位置 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 核心在于找到给定目标值所在的数组下标区间&#xff0c;设计一个O(logn)的算法。 2. 算法原…

力扣 674. 最长连续递增序列

题目来源&#xff1a;https://leetcode.cn/problems/longest-continuous-increasing-subsequence/description/ C题解&#xff1a;贪心算法。把所有元素遍历一遍&#xff0c;比较它与上个数的大小&#xff0c;大的话更新长度tmp&#xff0c;小的话初始化长度tmp&#xff0c;并与…

ctfshow——反序列化

文章目录 web 254——啥也没web 255——反序列化对变量进行赋值&#xff08;1&#xff09;web 256——反序列化对变量进行赋值&#xff08;2&#xff09;web 257——对象注入web 258——对象注入(绕过preg_match)web 259 web 254——啥也没 这里就是使用GET传输&#xff0c;use…

gitlab+jenkins 搭建部署

为什么要搭建gitlab和jenkins&#xff1f; 开发人员在每次开发完或修改一个bug后都要手动合并&#xff0c;打包或者连接服务器执行打包部署&#xff0c;每次手动操作&#xff0c;极大的影响了开发人员的效率。 gitlab和jenkins组合起来&#xff0c;开发人员只需要进行推送或合并…

XSS简介及xsslabs第一关

XSS被称为跨站脚本攻击(Cross-site scripting)&#xff0c;由于和CSS(CascadingStyle Sheets)重名&#xff0c;所以改为XSS。 XSS主要速于javascript语言完成恶意的攻击行为&#xff0c;因为javascript可非常灵活的操作html、css和浏览器 XSS就是指通过利用网页开发时留下的漏…

【git】入门

当我们设计文档时&#xff0c;我们会不断的修改文档&#xff0c;而设计的文档通过第一次修改&#xff0c;第二次修改&#xff0c;很难讲每次修改的版本维护起来&#xff0c;每个版本可以分为v1,v2 ,v3,v4如果需要哪个版本&#xff0c;我们可以直接查看。 随着版本的不断增多&am…

好物周刊#41:新一代截图神器

https://github.com/cunyu1943 村雨遥的好物周刊&#xff0c;记录每周看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;每周五发布。 一、项目 1. LiteFlow 轻量&#xff0c;快速&#xff0c;稳定&#xff0c;可编排的组件式规则引擎 / 流程引擎。 拥有全新设…

数据卷dockerfile

目录 一、数据卷 1. 简介 2. 数据卷和数据卷容器 1. 数据卷&#xff1a; 2. 数据卷容器&#xff1a; 二、自定义镜像 1. 作用 2. 自定义centos 3. 自定义tomcat8 一、数据卷 1. 简介 数据卷是一个可供一个或多个容器使用的特殊目录&#xff0c;它将主机操作系统目录直…

sawForceDimensionSDK安装,sigma7+ros

force dimension的sdk中没有关于ros&#xff0c;借助开源的sawForceDimensionSDK实现对于数据的封装和可视化&#xff0c;方便后续使用 链接&#xff1a; GitHub - jhu-saw/sawForceDimensionSDK 具体步骤&#xff1a; 安装qt和ros&#xff0c;官网下载Force Dimension SDK …