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.rhkb.cn/news/266050.html

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

相关文章

linux centos7.9改dns和ip

vi /etc/sysconfig/network-scripts/ifcfg-ens32 &#xff1a;wq后 重启网络服务 systemctl restart network —————————————————————————— 篇外话题 软件下载 xshell可以从腾讯软件中心下载

哈登谈失利:这是我们所有人的责任 不能在主场领先18分然后输球

nba直播吧地址&#xff1a;www.gznuqsxy.cn 2月29日讯 今天结束的一场NBA常规赛&#xff0c;快船在主场112比116被湖人逆转。赛后哈登接受了媒体的采访。 哈登谈到了这场失利&#xff1a;“这是我们所有人的责任。这是一场令人失望的失利。你不能在主场领先18分然后让出一场胜…

T - SQL使用事务 及 在Winform使用事务

事务适用场景 1 事务使用在存储过程中&#xff0c;直接在数据库中进行编写 2 事务使用在Winfrom项目中 SQl&#xff1a;使用事务转账操作的实例 一般都会找一个变量记录错误的个数&#xff0c;error记录上一句sql的错误和错误编号 declare errornum int 0 -- 定义…

逆向案例三:动态xhr包中AES解密的一般步骤,以精灵数据为例

补充知识&#xff1a;进行AES解密需要知道四个关键字&#xff0c;即密钥key,向量iv,模式mode,填充方式pad 一般网页AES都是16位的&#xff0c;m3u8视频加密一般是AES-128格式 网页链接:https://www.jinglingshuju.com/articles 进行抓包结果返回的是密文&#xff1a; 一般思…

5G网络介绍

目录 一、网络部署模式 二、4/5G基站网元对标 三、4/5G系统架构对比 四、5G核心单元 五、边缘计算 六、轻量化&#xff08;UPF下沉&#xff09; 方案一&#xff1a;UPF下沉 方案二&#xff1a;UPF下沉 方案三&#xff1a;5GC下沉基础模式 方案四&#xff1a;…

浅谈 Linux 网络编程 socket

文章目录 socket 介绍 socket 介绍 socket 被翻译成 网络套接字&#xff0c;这个名字实在是不好理解&#xff0c;我更愿意称为"插槽"。 忽略 socket 的中文名&#xff0c;先无脑记住两个规则&#xff1a; ① 记住&#xff0c;一个文件描述符(fd) 指向一个 socket&…

力扣550 游戏玩法分析 IV

目录 题目描述 思路整理 1. 首次登录日期 2. 第二天登录 3. 计算比率 实现思路 完整代码及解释 题目描述 Table: Activity ----------------------- | Column Name | Type | ----------------------- | player_id | int | | device_id | int | | ev…

雾锁王国Enshrouded服务器CPU内存配置怎么选择?

雾锁王国/Enshrouded服务器CPU内存配置如何选择&#xff1f;阿里云服务器网aliyunfuwuqi.com建议选择8核32G配置&#xff0c;支持4人玩家畅玩&#xff0c;自带10M公网带宽&#xff0c;1个月90元&#xff0c;3个月271元&#xff0c;幻兽帕鲁服务器申请页面 https://t.aliyun.com…

代码随想录训练营第32天 | LeetCode 122.买卖股票的最佳时机 II、LeetCode 55.跳跃游戏、LeetCode 45.跳跃游戏 II

目录 LeetCode 122.买卖股票的最佳时机 II 文章讲解&#xff1a;代码随想录(programmercarl.com) 视频讲解&#xff1a;贪心算法也能解决股票问题&#xff01;LeetCode&#xff1a;122.买卖股票最佳时机 II_哔哩哔哩_bilibili 思路 ​​​​​​LeetCode 55. 跳跃游戏 文…

Keepalived介绍、架构和安装

Keepalived介绍、架构和安装 文章目录 Keepalived介绍、架构和安装1.Keepalived&#xff08;高可用性服务&#xff09;1.1 Keepalived介绍1.2 Keepalived 架构1.3 Keepalived 相关文件 2.Keepalived安装2.1 主机初始化2.1.1 设置网卡名和ip地址2.1.2 配置镜像源2.1.3 关闭防火墙…

DPU是什么?

问题描述&#xff1a; DPU是什么&#xff1f; 解答&#xff1a; DPU&#xff08;Data Processing Unit&#xff09;是以数据为中心构造的专用处理器&#xff0c;采用软件 定义技术路线支撑基础设施层资源虚拟化&#xff0c;支持存储、安全、服务质量管理等 基础设施层服务。…

基于x86架构的OpenHarmony应用生态挑战赛等你来战!

为了更快速推进OpenHarmony在PC领域的进一步落地&#xff0c;加快x86架构下基于OpenHarmony的应用生态的繁荣&#xff0c;为北向应用开发者提供一个更加便捷的开发环境&#xff0c;推动OpenHarmony北向应用开发者的增加&#xff0c;助力OpenHarmony在PC领域实现新的突破&#x…

buuctf_N1BOOK_粗心的小李

题目&#xff1a; 看完题目&#xff0c;git下载文件&#xff1f;然后将.git文件传到线上环境&#xff1f;&#xff08;which 会造成git泄露的安全威胁&#xff09;<这个背景抱歉我不太了解哈&#xff0c;可能后续有补充> 这里主要记录做法过程&#xff1a; 工具&#xf…

javaWeb个人学习02

会话技术 会话: 用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束.在一次会话中包含多次请求和响应 会话跟踪: 一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一个浏览器,以便在同一次会话的多次请求之间共享数据 会话跟踪方案: …

#stm学习总结 (二十八)硬件随机数实验

28.1 随机数发生器简介 STM32F407 自带了硬件随机数发生器&#xff08;RNG&#xff09;&#xff0c;RNG 处理器是一个以连续模拟噪声为基础的随机数发生器&#xff0c;在主机读数时提供一个 32 位的随机数。 28.1.1 RNG 框图 STM32F407 的随机数发生器&#xff08;RNG&#x…

React中使用useActive

1.引入 import { useActivate } from "react-activation";2.React Activation 在React中使用react-activation,其实就是类似于Vue中的keep-alive&#xff0c;实现数据的缓存&#xff1b; 源码&#xff1a; import { ReactNode, ReactNodeArray, Context, Component…

数据库的基本操作

数据库的基本操作 1创建数据库与查看数据库 创建数据库之前&#xff0c;先查看数据库&#xff1a; 然后使用命令行创建数据库&#xff1a; 再次查看数据库&#xff0c;发现多了一个数据库&#xff1a; 查看数据库基本信息&#xff1a; 2修改数据库 注意&#xff0c;修改…

Git自动忽略dll文件的问题

检查了半天发现是sourcetreee的全局忽略文件导致&#xff0c; 从里面删除dll即可。 我是干脆直接删了全局忽略&#xff0c;太恶心了&#xff0c;如下&#xff1a; #ignore thumbnails created by windows Thumbs.db #Ignore files build by Visual Studio *.exe .vsconfig .s…

使用全局事件总线实现任意组件间的通讯

本文以vue2中爷孙组件通讯为例&#xff0c;需求是点击孙组件的按钮&#xff0c;实现关闭爷组件的弹窗。 全局事件总线是通过Vue实例的事件系统来实现组件之间的通讯&#xff0c;可以方便地在任何组件中进行事件的触发和监听。 以下是使用全局事件总线实现爷孙组件通讯的步骤&a…

初阶数据结构:链表相关题目练习(补充)

目录 1. 单链表相关练习题1.1 移除链表元素1.2 反转链表1.3 链表的中间结点1.4 链表的倒数第k个结点1.5 合并两个有序链表1.6 链表分割1.7 链表的回文结构1.8 相交链表1.9 判断一个链表中是否有环1.10 寻找环状链表相遇点1.11 链表的深度拷贝 1. 单链表相关练习题 注&#xff1…