Vivado 下 IP核 之ROM 读写

news2024/9/29 5:32:00

目录

Vivado 下 IP核 之ROM 读写

1、实验简介

2、ROM IP 核简介

3、ROM IP 核配置

3.1、创建 ROM 初始化文件

3.2、单端口 ROM 的配置

3.3、双端口 ROM 的配置

3.4、ROM IP 核的调用

(1)ROM 顶层模块代码

(2)ROM IP 核仿真

(3)仿真结果


Vivado 下 IP核 之ROM 读写

1、实验简介

本实验基于 Xinlinx 黑金  AX7A035 FPGA 开发板在Vivado平台下介绍如何使用 FPGA 内部的 ROM 以及程序对该 ROM 的数据读操作。

2、ROM IP 核简介

          本小节为大家介绍一种较为常用的存储类 IP 核——ROM 的使用方法。ROM 是只读存储器(Read-Only Memory)的简称,是一种只能读出事先所存数据的固态半导体存储器。其特性是一旦储存资料就无法再将之改变或删除,且资料不会因为电源关闭而消失。而事实上在 FPGA 中通过 IP 核生成的 ROM RAM 调用的都是 FPGA 内部的 RAM 资源,掉电内容都会丢失(这也很容易解释,FPGA 芯片内部本来就没有掉电非易失存储器单元)。用 IP 核生成的 ROM 模块只是提前添加了数据文件(.coe 格式),在 FPGA 运行时通过数据文件给 ROM 模块初始化,才使得 ROM 模块像个“真正”的掉电非易失存储器;也正是这个原因,ROM 模块的内容必须提前在数据文件中写死,无法在电路中修改。

       Xilinx 推出的 ROM IP 核分为两种类型:单端口 ROM(Single-Port Rom)双端口ROM(Dual-Port ROM)。对于单端口 ROM 提供一个读地址端口和一个读数据端口,只能进行读操作;双端口 ROM 与单端口 ROM 类似,区别是其提供两个读地址端口和两个读数据端口,基本上可以看做两个单口 RAM 拼接而成。下面是 ROM 不同配置模式存储器的接口信号图,如图 23-22、图 23-23 所示。

 

 上图中的接口信号我们并不是全部需要用到,因为我们配置时,有些信号是可以不创建的。所以很多接口信号我们可以不用管,只需管我们需要用的信号即可,而什么信号是我们需要用到的呢?这在我们调用完 IP 核后,是可以生成其例化模块的,到时候就可以看到我们需要控制的信号了。

3、ROM IP 核配置

3.1、创建 ROM 初始化文件

ROM 作为只读存储器,在进行 IP 核设置时需要指定初始化文件,即写入存储器中的 数据,数据要以规定的格式才能正确写入 ROM,这种格式就是 coe 文件。coe Vivado 规定的一种文件格式,文件格式示意图,具体见图 23-24

 如上图 23-24 所示,该文件的格式较为简单,第一行是定义数据的格式,其中 16 表示数据格式为 16 进制,也可将数据格式定义为二进制和八进制,只需将 16 改为 2 8 即可。其中第 3 到第 18 行是 16*8bit 大小 ROM 的初始化数据。

3.2、单端口 ROM 的配置

(1)新建一个 ip_rom 工程后,首先点击 “IP Catalog”,点击后会出现 IP Catalog 页面;我们在 IP 核的搜索框中搜索 “rom”,双击 RAM & ROM & BRAM 核下的 “Block Memory Generator”。

(2)双击之后会出现如下图所示的配置界面。在 "Basic" 栏目下,将 “Component Name” 改为 "rom_256x8b"(rom 是我们调用的 IP 核,256 是调用的 IP 核容量,8 是调用的 IP 核数据位宽。这里这样命名是为了方便识别我们创建的 IP 核类型及资源量)。“Interface Type” 保持默认 "Native "。

在“Memory Type” 框中选择存储器类型,可供选择的类型有:Single Port RAM(单端口 RAMSimple Dual Port RAM(简单双口 RAMTrue Dual Port RAM(真双口 RAMSingl Port ROM(单端口 ROMDoul Port ROM(双端口 ROM这里我们选择“Single Port Rom”单端口 ROM。 在 Algorithm 一栏中可选择用于实现内存的算法,其中 Minimum Area 为最小面积 算法;Low Power 为低功耗算法;Fixed Primitives 为固定单元算法这里我们按默认选择 Minimum Area 即可

 (3)切换到 “Port A Options ”栏目下,设置存储数据的位宽,将 ROM 位宽 "Port A Width" 改为 8;设置数据深度,将 ROM 深度 "Port A Depth" 改为 256,这样我们设置的 ROM 和最大能存储的数据即为 256 x 8bit。(注意:设置的容量需大于我们需要写入的数据文件的数据量);使能管脚 "Enable Port Type" 选择是否创建端口使能信号,这里我们不创建,选择“Always Enabled”始终 使能。如下图:

 (4)切换到“Other Options”栏目加载数据文件,将 .coe 文件保存到生成的 Rom IP 核中,即我们前面讲到的 ROM 初始化文件, 由于 ROM 是只读存储器,所以我们必须添加 ROM 初始化文件才行。勾选上“Load Init File”点击Browse 进行添加.coe 初始化文件,文件格式我们之前已经讲解,大家可根据自己想存入的数据进行生成该文件。该页面其余按默认设置即可。

 (5)切换到“Summary”页面,在 “Summary” 页面,从“IP Symbol”窗口可以看到我们最终创建的 ROM 核的端口信号。点击 “OK” 完成 ROM 的创建设置。

(6)创建之后接下来跳出如下图所示界面,我们点击“Generate” 生成 ip 核。 

(7)接下来出现如下图所示界面,我们点击“OK”完成生成。

(8)生成之后可以在工程中看到我们正常的 IP 核,双击 IP 核可进入配置界面,对 IP 核的相关参数进行更改。

3.3、双端口 ROM 的配置

单端口 ROM 的配置步骤讲解完之后,下面介绍一下双端口 ROM 的配置步骤。

(1)该步骤前面的步骤与单端口 ROM 的配置是一样的,到该页面我们在 Memory Type 选择 “Dual Port ROM” 双端口 ROM,其余设置不变。如图 23-34 所示

(2)切换到 “Potr A Options” 页面,如图 23-35 所示,该窗口是对端口 A 的设置,该页面的设置我们跟单端口 ROM 的设置一样即可。

(3)切换到 “Potr B Options” 页面,如图 23-36 所示,该窗口是对端口 B 的设置,这也是双端口 ROM 与单端口 ROM 最大的区别,多了一组端口。这里我们只需对 B 端口的数据位宽设置即可,数据深度会根据端 口 A 的设置自动设置。例如我们端口 A 设置的数据位宽为 8bit,深度为 256;而我们 B 端口设置的数据位宽为 16bit,则其深度即为 128,其数据总量是一样的。其余设置与端口 A 设置一样即可。

(4)切换到“Other Options”页面,如图 23-37 所示,该页面与单端口 ROM 配置一样。

(5)切换到“Summary”页面,如图 23-38 所示,在“Summary”页面,从“IP Symbol”窗口可以看到我们最终创建的 ROM 核的端口信号。可以看到其相比单端口 ROM 来说多了一组端口 B 信号。点击“OK”完成 ROM 的创建设置。接下来步骤与单端口 ROM 一样,就不再重复介绍。

3.4、ROM IP 核的调用

       在配置 ROM 核之前,我们先生成一个 ROM 的初始化文件(生成数据是十进制数 0~255,256 × 8bit),即我们往地址 0~255 存入十进制数据 0~255。初始化文件生成之后我们按单端口 ROM 的配置步骤配置一个单端口 ROM

       ROM IP 核配置完成后我们对它进行调用,通过仿真来观察输出信号的变化。验证的方法和例子有很多,后面我们还会在实战项目中使用到这个 IP 核。为了让大家能够清晰的看到 ROM IP 核信号的变化,RTL 代码的顶层只有端口列表和 ROM IP 核的实例化,其中:

  • RTL 代码顶层的输入信号有:50MHz 的系统时钟 sys_clk、输入 ROM 的读地址。这些输入信号需要在 Testbench 中产生激励。
  • RTL 代码顶层的输出信号有:ROM 的输出数据。

(1)ROM 顶层模块代码

ROM 顶层模块参考代码,如下所示:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/05/19 21:35:56
// Design Name: 
// Module Name: ip_rom
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module ip_rom(
    input  wire              sys_clk ,         //系统时钟,频率 50MHz
    input  wire   [7:0]      addra ,     //输入 rom 地址
    
    output  wire  [7:0]      douta      //输出 rom 数据
    );

//********************************************************************//
//*************************** Instantiation **************************//
//********************************************************************//
//rom_256x8b_inst
rom_256x8b u_rom_256x8b
(
     .clka       (sys_clk    ),      // input clka
     .addra      (addra      ),      // input [7 : 0] addraendmodule
     .douta      (douta      )       // output [7 : 0] douta
);

endmodule

根据上面 RTL 代码综合出的 RTL 原理图如图 23-39 所示。

(2)ROM IP 核仿真

仿真参考代码如下所示:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/05/19 21:45:01
// Design Name: 
// Module Name: tb_ip_rom
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module tb_ip_rom();

parameter T = 20;   //50Mhz系统时钟,一个周期为20ns
//parameter T = 5;    //200Mhz系统时钟,一个周期为5ns

//********************************************************************//
//****************** Parameter and Internal Signal *******************//
//********************************************************************//

//reg define
reg sys_clk ;
reg sys_rst_n ;
reg [7:0] addra ;

//wire define
wire [7:0] douta ;

//********************************************************************//
//***************************** Main Code ****************************//
//********************************************************************//

//对 sys_clk, sys_rst 赋初值,并模拟按键抖动
initial begin
    sys_clk = 1'b1 ;
    sys_rst_n <= 1'b0 ;
    #200 
    sys_rst_n <= 1'b1 ;
end

//sys_clk:模拟系统时钟,每 10ns 电平取反一次,周期为 20ns,频率为 50Mhz
//always #10 sys_clk = ~sys_clk;
always #(T/2) sys_clk = ~sys_clk;

//让地址从 0~255 循环
always @(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
         addra <= 8'd0;
    else if(addra == 8'd255)
         addra <= 8'd0;
    else
         addra <= addra + 1'b1;

//********************************************************************//
//*************************** Instantiation **************************//
//********************************************************************//

//rom_inst
ip_rom  u_ip_rom
(
     .sys_clk (sys_clk    ),     //50Mhz系统时钟,一个周期为20ns
     .addra   (addra      ),     //输入 rom 地址
     
     .douta   (douta      )      //输出 rom 数据
);

endmodule

(3)仿真结果

对代码进行仿真,仿真波形如下所示。

      从图中可以很清楚的看到 ROM IP 核地址与数据的关系。在前面我们知道我们往地址 0~255 存入的数据是 0~255,从波形图中可以看到当读时钟的上升沿采到地址时,在下一刻就会输出该地址存储的数据。

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

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

相关文章

lua-5.3.6源码安装

参考博客有https://blog.csdn.net/m0_53157173/article/details/124653430和http://blog.chinaunix.net/uid-14824714-id-3125340.html。 https://www.lua.org/download.html下载网址。点击当前网址中的“download”超链接可以下载以前的版本。 cat /etc/redhat-release看一下…

408考研计算机之计算机组成与设计——计算机层次系统概述2

目录 一、 冯诺依曼机基本思想 二、计算机的功能部件 1、输出输入设备 2、存储器 3、运算器 4、控制器​​​​​​​ 三、指令执行过程的描述 一、 冯诺依曼机基本思想 首先&#xff0c;第一个问题&#xff0c;冯诺依曼是谁&#xff1f;小编第一次知道这个名字&#xff…

Qt将十二位整形十进制转换成十六进制,在转为ascii字符,并下发串口。在接受端完整还原这个十二位的十进制数。

可以按照以下步骤进行操作&#xff1a; 将十进制数123456789012转换成十六进制字符串&#xff1a; QString hexString QString("%1").arg(123456789012ull, 0, 16);其中&#xff0c;%1表示替换第1个参数&#xff0c;0表示输出的最小位数为0&#xff0c;16表示输出…

Capturing Omni-Range Context for Omnidirectional Segmentation总结笔记

Capturing Omni-Range Context for Omnidirectional Segmentation&#xff08;捕获全范围上下文进行全方位分割&#xff09; 目录 一、论文出发点 二、论文核心思想 三、论文工作中主要问题 四、方法论 五、实验 六、结论 一、论文出发点 大多数用于分析城市环境的分割…

springboot+swagger项目中,controller引入@NotEmpty等校验注解的问题

springboot项目 springbootswagger项目中&#xff0c;controller层如果使用对基本数据类型使用 NotEmpty Length 等校验注解&#xff0c;controller会获取不到值&#xff0c;加了RequestBody后可以获取到了&#xff0c;但是前端传值content-type必须是text/plain。所以建议con…

考研数据结构--树和二叉树(2)

文章目录 二叉树的遍历前序遍历中序遍历后序遍历层次遍历 不用栈的二叉树中序遍历算法Morris代码分析 二叉树的构造概述如何完成二叉树的构造**回顾****思考**各种遍历序列提供的信息二叉树遍历性质性质1性质2 线索化二叉树引入定义构造 堆堆的定义堆的性质堆的建立堆的元素插入…

GPT1解读:Improving Language Understanding by Generative Pre-Training

自然语言处理NLP是当代人工智能的关键领域&#xff0c;包含文本识别、智能问答等多个方向任务&#xff0c;通过监督学习方式一般需要大量带标签数据&#xff0c;而对某些特定任务&#xff0c;获取带标签数据成本非常高。GPT通过大量的未标记文本数据来学习一个通用预训练&#…

ZiKiT DICOM 存档(PACS)模态服务器 Crack

ZiKiT结合了DICOM存档&#xff08;PACS&#xff09;&#xff0c;模态工作列表服务器和HL7消息代理&#xff0c;它们共享相同的数据库并相互通信。 最新版本 – ZiKiT 2020 ZiKiT 提供动态映射规则和消息结构定义&#xff0c;同时保持合规性并遵守标准。该套件使非程序员能够在…

电动力学:电偶极辐射场

电磁辐射的产生条件 存在时变源&#xff08;时变的电荷源、时变的电流源&#xff0c;或时变的电磁场&#xff09;时变源的频率应足够高&#xff08;辐射系统的尺寸大小和电磁波波长差不多时&#xff0c;才有可能产生明显的辐射效应&#xff09;波源电路必须开放&#xff08;源电…

Android 如何获取有效的DeviceId

目录 前言官方唯一标识符建议使用广告 ID使用实例 ID 和 GUID不要使用 MAC 地址标识符特性常见用例和适用的标识符 解决方案DeviceIdANDROID_IDMac地址UUID补充 总结 前言 从 Android 10 开始&#xff0c;应用必须具有 READ_PRIVILEGED_PHONE_STATE 特许权限才能访问设备的不可…

新手建站:腾讯云轻量服务器安装宝塔镜像和使用方法

腾讯云轻量应用服务器宝塔面板怎么用&#xff1f;轻量应用服务器如何安装宝塔面板&#xff1f;在镜像中选择宝塔Linux面板腾讯云专享版&#xff0c;在轻量服务器防火墙中开启8888端口号&#xff0c;然后远程连接到轻量服务器执行宝塔面板账号密码查询命令&#xff0c;最后登录和…

Java内存模型介绍

Java作为一种面向对象的&#xff0c;跨平台语言&#xff0c;其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似&#xff0c;很多人会傻傻分不清楚。比如本文要讨论的JVM内存结构、Java内存模型和Java对象模型&#xff0c;这就是三个截然不同的概念&…

系列四、vue3 初始化项目(图形化界面方式)

一、启动UI界面 vue ui 二、创建项目 2.1、在此创建项目 2.2、创建新项目-详情配置 2.3、创建新项目-预设 2.4、创建新项目-功能 2.5、创建新项目-配置 2.6、运行项目 任务》serve》运行》启动app 2.7、首页 三、安装element-plus 3.1、步骤 ①、运行 vue ui 命令&#…

【C++初阶】想要编译器为你干活吗?来试试模板吧(模板初阶)

一.泛型编程 引入 我们之前都写过交换函数Swap&#xff0c;例如这样的&#xff1a; //交换两个整型 void Swap(int*x1, int *x2) {int tmp *x1;*x1 *x2;*x2 tmp;} 如果要交换其它的类型该怎么办呢&#xff1f; 那只能当个CV工程师了&#xff0c;然后再修修改改&#xff0c;…

java枚举enum

目录 一、概念二、声明枚举三、枚举类四、为枚举添加方法五、EnumMap 与 EnumSet 一、概念 枚举是一个被命名的整型常数的集合&#xff0c;用于声明一组带标识符的常数。枚举在曰常生活中很常见&#xff0c;例如一个人的性别只能是“男”或者“女”&#xff0c;一周的星期只能…

CAN总线通讯协议学习

s目录 CAN&#xff08;controller Area Network) 控制器局域网 CAN通讯 CAN总线的数据帧 解析 CAN&#xff08;controller Area Network) 控制器局域网 CAN总线应用最多的是汽车领域,这里的控制器在汽车领域的专业术语是ECU.(electronic control unit)电子控制单元。可以看成…

【计算机网络之HTTP篇】HTTP协议详解

目录 一、HTTP协议概念 二、HTTP 协议格式 三、HTTP请求详解 认识URL 认识HTTP方法 GET POST Host Content-Length Content-Type User-Agent (简称 UA) Referer Cookie 四、HTTP 响应详解 状态码 200 OK 404 Not Found 403 Forbidden 500 Internal Server E…

IMX6ULL裸机篇之DDR3初始化

一. DDR3L初始化简介 I.MX6U-ALPHA 开发板上带有一个 256MB/512MB 的 DDR3 内存芯片&#xff0c;16 位宽&#xff0c;型号为 NT5CC128M16JR/MT5CC256M16EP&#xff0c;nanya 公司出品的&#xff0c;分为对应 256MB 和 512MB 容量。 我自己用的开发板上 DDR3L内存芯片型号为…

【论文阅读】REPLUG: Retrieval-Augmented Black-Box Language Models

文章目录 前言REPLUGREPLUG LSR: Training the Dense RetrieverComputing Retrieval LikelihoodComputing LM likelihood 前言 原文地址&#xff1a;REPLUG: Retrieval-Augmented Black-Box Language Models 本文提出REPLUG&#xff0c;一个将语言模型视为黑盒检索增强的语言模…

45道SQL题目陆续更新

文章目录 学习视频配置环境第一天内连接 外连接第二天 学习视频 学习视频 配置环境 四张表 配置四张表的sql语句 #创建发据库 create database frogdata charsetutf8&#xff1b;use frogdata;# 学生表 Student create table Student( SId varchar(10), Sname varchar(1…