FPGA原理与结构——ROM IP的使用与测试

一、前言

        本文介绍Block Memory Generator v8.4 IP核 实现ROM,在学习一个IP核的使用之前,首先需要对于IP核的具体参数和原理有一个基本的了解,具体可以参考:

FPGA原理与结构——块RAM(Block RAM,BRAM)https://blog.csdn.net/apple_53311083/article/details/132253916?spm=1001.2014.3001.5501              上文介绍了这个IP核使用的底层资源BRAM  
FPGA原理与结构——RAM IP核原理学习https://blog.csdn.net/apple_53311083/article/details/132326228?spm=1001.2014.3001.5501           上文详细介绍了这个IP核的各种功能和原理
FPGA原理与结构——RAM IP核的使用与测试https://blog.csdn.net/apple_53311083/article/details/132359524?spm=1001.2014.3001.5501

上文介绍了这个这个IP核例化RAM的具体使用方式与测试,虽然本文主要介绍ROM,但是ROM其实完全可以看作一个不具备写功能的RAM,所以如果能够理解RAM的使用,那么ROM的使用也就是水到渠成的。

二、ROM 简介

        ROM经常被拿来与RAM一起比较,两者最大的区别就在于RAM可读可写,ROM只能读,不能写。ROM(只读存储器(Read-Only Memory)),其特点是特点:非易失性,只能读出不能写入。常见的ROM可以参见下表:

掩膜ROM由厂家“固化”,不可更改
可编程ROM(PROM)熔丝烧断改写存储数据,只可编写一次
可擦除可编程ROM(EPROM)浮栅MOS管,多次编程和擦除数据。可分为紫外线可擦除可编程ROM(UVEPROM)和电可擦除可编程ROM(E2PROM)

        在这里我们使用到的Block Memory Generator v8.4 IP核是使用FPGA硬件底层中的BRAM资源,BRAM可以实现RAM,ROM和FIFO。我们知道BRAM实现的RAM可以分成的单端口,简单双端口和真双端口3种。考虑到ROM只可读不可写,BRAM实现的ROM有单端口和双端口两种。

 (1)Single Port :单口 ROM

        不能写入,只有一个端口用于数据读

(2)Dual port:双端口 ROM

        不可写,但是有2个端口用于读,两个端口读取数据的位宽可以不同,但是必须是整数倍关系

三、ROM IP核定制

1、ROM IP核

 step1 打开vivado工程,点击左侧栏中的IP Catalog

step2 在搜索栏搜索ROM,找到Block Memory Generator IP 核

2、ROM IP核定制

step3 Basic界面定制

①Component Name : IP核名字

②Interface Type : 接口类型,可选Native类型和AXI4类型,这里我们选Native类型

    Memory Type : 存储器类型选择,对于ROM来说有2种可选,单端口和双端口。

③ECC Options :Error Correction Capability,纠错能力选项,单端口 ROM 不支持 ECC。

④Write Enable:字节写使能选项,ROM不具备写功能。

⑤Algorithm Options:算法选项。可选择 Minimum Area(最小面积)、Low Power(低功耗)和 Fixed Primitives(固定原语),这里选择默认的 Minimum Area。


step4 端口定制

        这里我们选择的是单端口模式,所以只需要配置Port A一个端口,如果是双端口模式需要独立配置两个端口。

① Memory Size 

        Port A Width : 数据位宽

        Port A Depth : 数据深度        

② Operating Mode : 对于ROM来说是不可选的

     Enable Port Type:使能端口类型。Use ENA pin(添加使能端口 A 信号);Always Enabled(取消使能信号,端口 A 一直处于使能状态),这里选择默认的 Use ENA pin。

③ Port A Optional Output Register:端口 A 输出寄存器选项。其中“Primitives Output Register”默认是选中状态,作用是打开 BRAM 内部位于输出数据总线之后的输出流水线寄存器,虽然在一般设计中为了改善时序性能会保持此选项的默认勾选状态,但是这会使得 BRAM 输出的数据延迟一拍,在这里我们只是进行一个简单的例化测试,为了使得我们的效果直观,我们不进行勾选。

④ Port A Output Reset Options:ROM 输出寄存器复位信号选项,这里不添加复位信号,保持默认即可。(注意是对输出寄存器复位,不是对ROM的复位)

⑤ READ Address Change A : 这是对于ultrascale系类的,普通的7系类不适用。

step5 Other Options


 

① Pipeline Stages within Mux:当使用多个BRAM资源来构成一个较大的RAM时,IP核提供了可选的0~3流水线结构来帮助优化性能,这里我们的ROM很小,一块BRAM(18Kb)就可以实现,所以不需要 。

② Memory Initialization : 内存初始化,简单说就是给ROM进行赋初值,可以有两种方式,一种是通过Coe文件写入,还有一种是直接把RAM赋同一个值,这里我们选择的就是第一种,通过Coe文件的形式写入 

radix:使用的进制数,可选2,10,16

vector:初始化使用的数据,写入时用逗号隔开(这里是写入后的状态) 

③ :这里都是一些仿真的打印信息,我们保持默认。

step6 Summary

        最后通过Summary进行一个回顾和检查

 3、IP核例化

step7 例化

        例化代码如下:

module top(input clk,                     //时钟信号input ena,                     //使能信号input [4:0]addra,              //地址output [7:0]douta              //输出信号);rom_v1 rom_u1(.clka(clk),.ena(ena),.addra(addra),.douta(douta));endmodule

四、IP核测试

        首先编写测试文件如下:

`timescale 1ns / 1ps
module tb_top();reg clk;                //时钟
reg ena;                //使能信号
reg [4:0]addra;         //地址
wire [7:0]douta;             //输出信号initial begin clk = 0;ena = 0;addra = 0;
#30ena = 1;repeat(32) begin#10 addra = addra + 1;end
#20ena = 0;$finish;
endalways #5 clk = ~clk;top top_u1(.clk(clk),.ena(ena),.addra(addra),.douta(douta)
);endmodule

        得到的仿真结果如下:

         可以看到使能信号的拉高后,数据随着地址的增加被依次读出,功能验证正常。

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

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

相关文章

供应链安全和第三方风险管理:讨论如何应对供应链中的安全风险,以及评估和管理第三方合作伙伴可能带来的威胁

第一章:引言 在当今数字化时代,供应链的安全性越来越受到重视。企业的成功不仅仅依赖于产品和服务的质量,还取决于供应链中的安全性。然而,随着供应链越来越复杂,第三方合作伙伴的参与也带来了一系列安全风险。本文将…

C#中的委托

目录 概述: 举例:​ 总结: 概述: 中文的角度来说:指的是把事情托付给别人或别的机构(办理),造个句子:别人委托的事情,我们一定要尽力而为,不遗余力的去办成。 在C#中,委托是一种…

回归预测 | MATLAB实现GA-RBF遗传算法优化径向基函数神经网络多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现GA-RBF遗传算法优化径向基函数神经网络多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现GA-RBF遗传算法优化径向基函数神经网络多输入单输出回归预测(多指标,多图)效果…

CoordAtt注意力网络结构

源码: import torch import torch.nn as nn import math import torch.nn.functional as Fclass h_sigmoid(nn.Module):def __init__(self, inplaceTrue):super(h_sigmoid, self).__init__()self.relu nn.ReLU6(inplaceinplace)def forward(self, x):return self.…

VSCode\PyCharm23.2+PyQGIS插件开发配置相关要点

近期利用VSCode\PyCharmPyQGIS进行插件开发,现将要点总结一下: 一、VSCode,我没有配置成功,主要是最后一个阶段调试的时候老是不成功。以后会持续关注。但是有几个要点: 1、VSCodePyQIS开发,智能提示的设…

jmeter模拟多用户并发

一、100个真实的用户 1、一个账号模拟100虚拟用户同时登录和100账号同时登录 区别 (1)1个账号100个人用,同时登录; (2)100个人100个账号,同时登录。 相同 (1)两个都…

机器学习之概率论

最近,在了解机器学习相关的数学知识,包括线性代数和概率论的知识,今天,回顾了概率论的知识,贴上几张其他博客的关于概率论的图片,记录学习过程。

SSH远程直连--------------Docker容器

文章目录 1. 下载docker镜像2. 安装ssh服务3. 本地局域网测试4. 安装cpolar5. 配置公网访问地址6. SSH公网远程连接测试7.固定连接公网地址8. SSH固定地址连接测试 在某些特殊需求下,我们想ssh直接远程连接docker 容器,下面我们介绍结合cpolar工具实现ssh远程直接连接docker容器…

线性代数的学习和整理6:向量和矩阵详细,什么是矩阵?(草稿-----未完成)

43 矩阵 4.1 矩阵 4 整理网上总结一些 关于直击线性代数本质的 观点 矩阵的本质是旋转和缩放 矩阵里的数字0矩阵里的数字1,表示不进行缩放矩阵里的数字2等,表示缩放矩阵里的数字-3 表示缩放-3倍,并且反向矩阵里的数字的位置矩阵拆分为列向量…

C#与西门子PLC1500的ModbusTcp服务器通信2--ModbusTcp协议

Modbus TCP是近年来越来越流行的工业控制系统通信协议之一,与其他通信协议相比,Modbus TCP通信速度快、可靠性高、兼容性强、适用于模拟或数字量信号的传输,阅读本文前你必须比较熟悉Modbus协议,了解tcp网络。 一、什么是Modbus …

初阶c语言:实战项目三子棋

前言 大家已经和博主学习有一段时间了,今天讲一个有趣的实战项目——三子棋 目录 前言 制作菜单 构建游戏选择框架 实现游戏功能 模块化编程 初始化棋盘 打印棋盘 玩家下棋 电脑下棋 时间戳:推荐一篇 C语言生成随机数的方法_c语言随机数_杯浅…

Delegates.observable追踪观察可变数据更新,Kotlin

Delegates.observable追踪观察可变数据更新&#xff0c;Kotlin import kotlin.properties.Delegates import kotlin.reflect.KPropertyclass Person {var name: String by Delegates.observable("fly") { prop: KProperty<*>, old: String, new: String ->p…

虚幻官方项目《CropOut》技术解析 之 程序化岛屿生成器(IslandGenerator)

开个新坑详细分析一下虚幻官方发布的《CropOut》&#xff0c;文章会同步发布到我在知乎|CSDN的专栏里 文章目录 概要Create Island几何体生成部分随机种子Step 1Step 2Step 3Step 4Step 5Step 6 岛屿材质部分动态为草地设置颜色 程序设计的小技巧其它Platform Switch函数 概要 …

Android OpenCV(七十四): Android OpenCV SDK 升级至 4.8.0

前言 如昨日文章所述,OpenCV 4.8.0 已经发布,虽然系列文章已经停更很久,但是版本升级工作笔者是很乐意快速完成的。 OpenCV 4.8.0 Android SDK:https://github.com/opencv/opencv/releases/download/4.8.0/opencv-4.8.0-android-sdk.zip 更新日志:https://github.com/o…

安防视频汇聚平台EasyCVR视频监控综合管理平台H.265转码功能更新,新增分辨率配置的具体步骤

安防视频集中存储EasyCVR视频监控综合管理平台可以根据不同的场景需求&#xff0c;让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上&#xff0c;视频云存储平台EasyCVR可实现视频实时直播、云端录像、视频云存储、视频存储…

Open3D 进阶(5)变分贝叶斯高斯混合点云聚类

目录 一、算法原理二、代码实现三、结果展示四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 系列文章(连载中。。。爬虫,你倒是爬个完整的呀?): Open3D 进阶(1) MeanShift点云聚类Open3D 进阶(2)DB…

shell脚本之循环语句

循环语句 循环含义 将某代码段重复运行多次&#xff0c;通常有进入循环的条件和退出循环的条件 for循环语句 一般知道循环次数使用for循环 第一类 格式1&#xff1a; for名称 in 取值次数;do;done; 格式2&#xff1a; for 名称 in {取值列表} do done# 打印20次 for i i…

[MySQL]02关于事务的解析

目录 原子性 一致性 持久性 隔离性 事务隔离级别 并发执行可能存在问题 脏读问题 不可重复读 幻读 难点解析 原子性 事务最核心的就是原子性 以前人们认为原子不可再分&#xff0c;用原子性来表示一个事务不可分割 update account set balancebalance-500 where nam…

浅析Java设计模式之四策略模式

title: 浅析Java设计模式之四策略模式 date: 2018-12-29 17:26:17 categories: 设计模式 description: 浅析Java设计模式之四策略模式 1. 目录 1. 目录2. 概念 2.1. 应用场景2.2. 优缺点 2.2.1. 优点2.2.2. 缺点 3. 模式结构4. 样例 4.1. 定义策略4.2. 定义具体策略4.3. 定义…

Android内存泄漏总结和性能优化技巧

我们在开发安卓应用时&#xff0c;性能优化是非常重要的方面。一方面&#xff0c;优化可以提高应用的响应速度、降低卡顿率和提升应用流畅度&#xff0c;从而提升用户体验&#xff1b;另一方面&#xff0c;优化也可以减少应用的资源占用&#xff0c;提高应用的稳定性和安全性&a…