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;
#30
    ena = 1;
    repeat(32) begin
    #10 addra = addra + 1;
    end
#20
    ena = 0;
    $finish;
end

always #5 clk = ~clk;

top top_u1(
    .clk(clk),
    .ena(ena),
    .addra(addra),
    .douta(douta)
);

endmodule

        得到的仿真结果如下:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

KUST_LI计算机视觉实验室服务器安装与管理

第一步:安装 Linux-Ubuntu系统 系统语言设置为英文 ENGLISH,防止系统 BUG;选择-清除整个磁盘并安装系统;设置用户名和密码,实验室统一其余全部默认设置 开机后设置磁盘挂载 在系统设置中找到 desk 打开,…

从零开始 Spring Cloud 12:Sentinel

从零开始 Spring Cloud 12:Sentinel 1.初识 Sentinel 1.1雪崩问题 1.1.1什么是雪崩问题 微服务中,服务间调用关系错综复杂,一个微服务往往依赖于多个其它微服务。 如图,如果服务提供者I发生了故障,当前的应用的部分…

简单认识Docker的资源控制

文章目录 一、CPU资源限制1.设置CPU使用率上限2.设置CPU资源占用比(设置多个容器才有效)3.设置容器与CPU绑核 二、内存资源限制三、对磁盘I/O配额的限制 一、CPU资源限制 1.设置CPU使用率上限 Linux通过CFS(Completely Fair Scheduler&#…

【jenkins】jenkins流水线构建打包jar,生成docker镜像,重启docker服务的过程,在jenkins上一键完成,实现提交代码自动构建的功能

【jenkins】jenkins流水线构建打包jar,生成docker镜像,重启docker服务的过程,在jenkins上一键完成,实现提交代码自动构建,服务重启,服务发布的功能。一键实现。非常的舒服。 1. 启动脚本 shell脚本 这是 s…

vue3 路由缓存问题

目录 解决问题的思路: 解决问题的方案: 1、给roter-view添加key(破坏复用机制,强制销毁重建) 2、使用beforeRouteUpdate导航钩子 3、使用watch监听路由 vue3路由缓存:当用户从/users/johnny导航到/use…

【王道-进程与线程】

#pic_center R 1 R_1 R1​ R 2 R^2 R2 目录 知识框架No.0 引言No.1 进程的概念、组成、特征一、进程的概念二、进程的组成1、PCB进程控制块2、程序段/数据段 三、程序是如何运行的?四、进程的特征五、总结 No.2 进程的状态转换和组织一、进程的状态1、创建态、就绪态…

(牛客网)链表相加(二)

嗯哼~ 题目 描述 假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。 给定两个这种链表,请生成代表两个整数相加值的结果链表。 数据范围:0 ≤ n,m ≤ 1000000,链表任意值 0 ≤ val ≤ 9 要求&#x…

c++优先级队列的模拟实现代码

了解: 1.优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。 2. 类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。 3. 优先队列被实现为…

IDEA 如何制作代码补丁?IDEA 生成 patch 和使用 patch

什么是升级补丁? 比如你本地修复的 bug,需要把增量文件发给客户,很多场景下大家都需要手工整理修改的文件,并整理好目录,这个很麻烦。那有没有简单的技巧呢?看看 IDEA 生成 patch 和使用 patch 的使用。 介…

Ubuntu安装Apache+Php

环境:ubuntu 22.04 虚拟机 首先更新一下 sudo apt-get update sudo apt-get upgrade安装Apache2: sudo apt-get install apache2 输入y,继续。等着他恐龙抗浪抗浪的下载安装就好了 打开浏览器访问http://localhost/ 安装php: …

【Linux】进程信号篇Ⅰ:信号的产生(signal、kill、raise、abort、alarm)、信号的保存(core dump)

文章目录 一、 signal 函数:用户自定义捕捉信号二、信号的产生1. 通过中断按键产生信号2. 调用系统函数向进程发信号2.1 kill 函数:给任意进程发送任意信号2.2 raise 函数:给调用进程发送任意信号2.3 abort 函数:给调用进程发送 6…

【C语言】数组概述

🚩纸上得来终觉浅, 绝知此事要躬行。 🌟主页:June-Frost 🚀专栏:C语言 🔥该篇将带你了解 一维数组,二维数组等相关知识。 目录: 📘前言:&#x1f…

vue3+ts+vite使用el-breadcrumb实现面包屑组件,实现面包屑过渡动画

简介 使用 element-plus 的 el-breadcrumb 组件&#xff0c;实现根据页面路由动态生成面包屑导航&#xff0c;并实现面包屑导航的切换过渡动画 一、先看效果加粗样式 1.1 静态效果 1.2 动态效果 二、全量代码 <script lang"ts" setup> import { ref, watch…

JVM基础了解

JVM 是java虚拟机。 作用&#xff1a;运行并管理java源码文件锁生成的Class文件&#xff1b;在不同的操作系统上安装不同的JVM&#xff0c;从而实现了跨平台的保证。一般在安装完JDK或者JRE之后&#xff0c;其中就已经内置了JVM&#xff0c;只需要将Class文件交给JVM即可 写好的…

安装pyrender和OSMesa

1&#xff09;安装 pyrender Pyrender是一个基于OpenGL的库&#xff0c;可以加载和渲染三维网格、点云、相机等对象3。 pip install pyrender 2&#xff09;理解PyOpenGL和OSMesa的关系是: PyOpenGL是Python的OpenGL绑定库&#xff08;接口壳子&#xff09;,它提供了在Python中…

day9 STM32 I2C总线通信

I2C总线简介 I2C总线介绍 I2C&#xff08;Inter-Integrated Circuit&#xff09;总线&#xff08;也称IIC或I2C&#xff09;是由PHILIPS公司开发的两线式串行总线&#xff0c;用于连接微控制器及其外围设备&#xff0c;是微电子通信控制领域广泛采用的一种总线标准。 它是同步通…

基于ACF,AMDF算法的语音编码matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .......................................................................... plotFlag …

day-25 代码随想录算法训练营(19)回溯part02

216.组合总和||| 思路&#xff1a;和上题一样&#xff0c;差别在于多了总和&#xff0c;但是数字局限在1-9 17.电话号码的字母组合 思路&#xff1a;先纵向遍历第i位电话号码对于的字符串&#xff0c;再横向递归遍历下一位电话号码 93.复原IP地址 画图分析&#xff1a; 思…

微服务中间件--Ribbon负载均衡

Ribbon负载均衡 a.Ribbon负载均衡原理b.Ribbon负载均衡策略 (IRule)c.Ribbon的饥饿加载 a.Ribbon负载均衡原理 1.发起请求http://userservice/user/1&#xff0c;Ribbon拦截该请求 2.Ribbon通过EurekaServer拉取userservice 3.EurekaServer返回服务列表给Ribbon做负载均衡 …

学习笔记230810--get请求的两种传参方式

问题描述 今天写了一个对象方式传参的get请求接口方法&#xff0c;发现没有载荷&#xff0c;ip地址也没有带查询字符串&#xff0c;数据也没有响应。 代码展示 错误分析 实际上这里的query是对象方式带参跳转的参数名&#xff0c;而get方法对象方式传参的参数名是parmas 解…
最新文章