Xilinx系FPGA学习笔记(五)ROM的IP核学习

2024-09-07 18:52
文章标签 ip 学习 笔记 fpga xilinx rom

本文主要是介绍Xilinx系FPGA学习笔记(五)ROM的IP核学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • ROM IP
    • 分布式ROM生成
      • ROM配置
      • 创建COE文件
    • 块ROM生成
      • 如何快速生成Example Design
  • 两种ROM对比


前言

最近在学习小梅哥的xilinx型FPGA开发板,一边学习一边记录,简化整理一下笔记


ROM IP

在 Memories &Storage Elements 下可以看到有两个与 ROM 相关的 IP,一个是 Distributed Memory Generator,另一个是 Block Memory Generator
在这里插入图片描述

两种生成的 Core所占用的 FPGA 资源不一样

Distributed Memory Generator 生成的 ROM/RAM Core 占用的资源是 LUT(查找表,查找表本质就是一个小的 RAM);
可以生成:Distributed ROM、Distributed Single-Port RAM、Distributed Dual-Port RAM、Distributed Simple Dual-Port RAM

Block Memory Generator 生成的 ROM/RAM Core 占用的资源是 Block Memory(嵌入式的硬件 RAM)

ROM即随机只读存储器,所以一般只能读,我们可以编写COE文件,与生成的ROM进行绑定,这样从ROM读出来的数据就是我们自定义的

这里还有一种URAM,Ultra RAM是一种高性能、低延迟的存储器资源,实现大容量的存储和高带宽的存储访问,暂时还没有涉及该方面

分布式ROM生成

ROM配置

选择Distributed Memory Generator来生成IP核

在这里插入图片描述
Depth:设置 ROM 深度
Data Width:设置数据位宽
Memory Type:选择存储类型,这里选择 ROM
在这里插入图片描述
Input Options:设置是否对输入的地址增加一级寄存器,设置选择 Registered,对输入的地址增加一级寄存器,会发现多了一个CLK

Output Option:设置是否对输出的地址增加一级寄存器,这里选择 Both,输出数据信号 spo 和增加一级寄存器后的输出数据信号 qspo 都从端口引出。下面还有个 SinglePort Output CE 可选配,当勾选后,ROM Core 就会多出一个 qspo_ce 的端口,这个信号是用来控制使能输出寄存器的时钟。

Pipeline Stages:流水线级数,在生成 ROM 模式下,不可配。
在这里插入图片描述

添加 COE 文件位置,可以通过选择路径添加已有的 COE 文件,软件会通过 COE 文件生成 ROM 初始化文件 MIF 文件。
没有也可以直接创建编辑

COE Options:设置 ROM 中初始化数据没有覆盖的区域的数值,比如 ROM 深度 256,添加的 COE 文件中仅初始化了 200 个数据,这里就是统一设置剩下的 56 个数据的数值。Radix是进制

Reset Options:添加输出寄存器复位信号,可添加同步复位或异步复位

ce overrides 设置:
CE Overrides Sync Controls:在选择了输出寄存器同步复位和时钟使能才能启用,启用后,同步控制由时钟使能限定。
Sync Controls Overrides CE:在选择了输出寄存器同步复位和时钟使能才能启用,启用后,同步控制信号会工作,不受时钟使能限定。
前面未勾选时钟使能信号 CE,这里就不可设置,保持默认即可。

在这里插入图片描述
这里的a是输入地址,clk是时钟,qspo_ce是qspo的使能,不要也行,qspo是寄存一级的输出,spo是直接输出,qspo会比spo慢一个时钟周期

创建COE文件

新建行,添加进制和数据信息
在这里插入图片描述
memory_initialization_radix 是 ROM 初始化数值进制设置,对应后面 Value 值可设置 2,10,16,分别表示 2 进制,10 进制,16 进制。

memory_initialization_vector 是 ROM 初始化数据向量,对应后面 Value 值就是填写 ROM 初始化的数据,数据与数据之间通过空格或逗号隔开,数据个数不允许超过设置 ROM 的深度(可以少于设置的深度),数据不允许为负数。

注:Key 和 Value 里面填写内容不区分大小写。

设置完成后保存即可(软件会自动validate验证编写对否)

在这里插入图片描述
IP Source 窗 口 IP Synthesis 下 看 到 有dist_mem_rom_ip.mif 文件,这个文件就是 IP 生成过程中通过我们添加的 coe 文件自动生成的,这点和 quartus 有所不同(quartus 是用户直接添加指定 mif 文件)。有一点比 quartus 好的就是在 ROM Core 建立时 vivado 软件会根据用户添加 coe 文件以及设置 ROM 参数(深度,位宽)对 coe 文件进行校验,如果不符合要求会提示相关错误,可以有效避免初始化文件不匹配的问题。

mif文件可以用matlab来写txt生成一个我们想要的数据,当我们想要更换COE文件的时候,对 rom IP 进行重新的设置
在这里插入图片描述
重新绑定COE文件就行

块ROM生成

使用硬件块 RAM 资源的 ROM IP,点击 Block Memory Generator
在这里插入图片描述
在这里插入图片描述
Interface选项有两种接口,一种是常规接口,一种是AXI 接口
memory type有 ROM 和 RAM 两种类型,ROM 又分为单端口 ROM 和双端口ROM。对于 RAM 而言,有三种可选项,单端口 RAM、简单双端口 RAM 和真双端口 RAM。

单端口 ROM,一个时钟,一个地址通道,一个数据通道。
双端口 ROM,两个时钟,两个地址通道,两个数据通道,可同时在两个时钟域下读取地址 ROM 中的数据。(相当于两个ROM)

Algorithm Options 算法类型:有三种选项可选,最小面积、低功耗、固定原语。(可查手册)

在这里插入图片描述
memory size设置位宽和深度
在这里插入图片描述
端口使能信号类型设置,一个是一直使能,一个是通过一个 ENA 信号管脚控制

Prot A Output Reset Options: 端口 A 输出置位/复位设置,这里置位/复位并不复位RAM 中的数据而是只复位寄存器上的值。

在这里插入图片描述
勾选 Load Init File,加载初始化文件,这里可以加载上面生成的 coe 文件,下面的 Fill Remaining Memory Location 是用来填充初始化文件没有覆盖的地址区域的数值(类似前面介绍的意思)

Latentcy 指的是相对于某个时钟起始位的 1 个或多个时钟后数据才有效,一般以时钟为单位,这里表示的是时钟采集到读数据地址到数据有效的时间间隔
在这里插入图片描述
这里 Latency 等于 3,是因为我们前面配置同时勾选了Primitives Output Register和 Core Output Register,相当于数据打了两拍。

如何快速生成Example Design

在 PROJECT 窗口的 IP Sources 中找到我们生成的 block ROM IP ,右键找到 Open IP Example Design。
在这里插入图片描述
会生成一个新的项目,会用VHDL帮我们写一个测试文件,然后我们自己Run Simulation就行了
在这里插入图片描述

两种ROM对比

在这里插入图片描述
在这里面可以看到具体资源使用情况,包括每个模块使用后的资源情况。
在这里插入图片描述

使用了 29 LUT、8 个触发器、12 个 F7 的选择器、6 个 F8 的选择器、17 个 IO资源(1 个时钟输入,8 个地址输入线,8 个数据输出线)
还有消耗了 Slice 和 Slice LUTs

CLB(Configurable Logic Block,可配置逻辑快)资源:包含了 2 个 Slice,每个 Slice 包含 4 个 6 输入 LUT、进位链、3 个多路复用器和 8 个寄存器,一个 LUT 逻辑容量为 2^6bit,
在这里插入图片描述
Block RAM生成的块 ROM IP,只使用了寄存器和 Block
RAM 资源。没有消耗 LUT 资源。

在这里插入图片描述

这篇关于Xilinx系FPGA学习笔记(五)ROM的IP核学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1145871

相关文章

Nginx实现动态封禁IP的步骤指南

《Nginx实现动态封禁IP的步骤指南》在日常的生产环境中,网站可能会遭遇恶意请求、DDoS攻击或其他有害的访问行为,为了应对这些情况,动态封禁IP是一项十分重要的安全策略,本篇博客将介绍如何通过NG... 目录1、简述2、实现方式3、使用 fail2ban 动态封禁3.1 安装 fail2ban3.2 配

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

查询SQL Server数据库服务器IP地址的多种有效方法

《查询SQLServer数据库服务器IP地址的多种有效方法》作为数据库管理员或开发人员,了解如何查询SQLServer数据库服务器的IP地址是一项重要技能,本文将介绍几种简单而有效的方法,帮助你轻松... 目录使用T-SQL查询方法1:使用系统函数方法2:使用系统视图使用SQL Server Configu

使用Java实现获取客户端IP地址

《使用Java实现获取客户端IP地址》这篇文章主要为大家详细介绍了如何使用Java实现获取客户端IP地址,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 首先是获取 IP,直接上代码import org.springframework.web.context.request.Requ

C++实现获取本机MAC地址与IP地址

《C++实现获取本机MAC地址与IP地址》这篇文章主要为大家详细介绍了C++实现获取本机MAC地址与IP地址的两种方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实际工作中,项目上常常需要获取本机的IP地址和MAC地址,在此使用两种方案获取1.MFC中获取IP和MAC地址获取

C/C++通过IP获取局域网网卡MAC地址

《C/C++通过IP获取局域网网卡MAC地址》这篇文章主要为大家详细介绍了C++如何通过Win32API函数SendARP从IP地址获取局域网内网卡的MAC地址,感兴趣的小伙伴可以跟随小编一起学习一下... C/C++通过IP获取局域网网卡MAC地址通过win32 SendARP获取MAC地址代码#i

shell脚本快速检查192.168.1网段ip是否在用的方法

《shell脚本快速检查192.168.1网段ip是否在用的方法》该Shell脚本通过并发ping命令检查192.168.1网段中哪些IP地址正在使用,脚本定义了网络段、超时时间和并行扫描数量,并使用... 目录脚本:检查 192.168.1 网段 IP 是否在用脚本说明使用方法示例输出优化建议总结检查 1

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

SpringBoot实现基于URL和IP的访问频率限制

《SpringBoot实现基于URL和IP的访问频率限制》在现代Web应用中,接口被恶意刷新或暴力请求是一种常见的攻击手段,为了保护系统资源,需要对接口的访问频率进行限制,下面我们就来看看如何使用... 目录1. 引言2. 项目依赖3. 配置 Redis4. 创建拦截器5. 注册拦截器6. 创建控制器8.