Vivado 下 IP核 之ROM 读写

这篇具有很好参考价值的文章主要介绍了Vivado 下 IP核 之ROM 读写。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

Vivado 下 IP核 之ROM 读写

1、实验简介

2、ROM IP 核简介

3、ROM IP 核配置

3.1、创建 ROM 初始化文件

3.2、单端口 ROM 的配置

加载数据文件,将 .coe 文件保存到生成的 Rom IP 核中

3.3、双端口 ROM 的配置

3.4、ROM IP 核的调用

(1)ROM 顶层模块代码

(2)ROM IP 核仿真

(3)仿真结果

4、添加约束文件 .xdc


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 所示。

Vivado 下 IP核 之ROM 读写 Vivado 下 IP核 之ROM 读写

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

3、ROM IP 核配置

3.1、创建 ROM 初始化文件

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

Vivado 下 IP核 之ROM 读写

 如上图 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”。

Vivado 下 IP核 之ROM 读写

(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 即可

Vivado 下 IP核 之ROM 读写

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

Vivado 下 IP核 之ROM 读写

  • 加载数据文件,将 .coe 文件保存到生成的 Rom IP 核中

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

Vivado 下 IP核 之ROM 读写

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

Vivado 下 IP核 之ROM 读写

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

Vivado 下 IP核 之ROM 读写

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

Vivado 下 IP核 之ROM 读写

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

Vivado 下 IP核 之ROM 读写

3.3、双端口 ROM 的配置

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

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

Vivado 下 IP核 之ROM 读写

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

Vivado 下 IP核 之ROM 读写

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

Vivado 下 IP核 之ROM 读写

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

Vivado 下 IP核 之ROM 读写

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

Vivado 下 IP核 之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               sys_clk,       //50MHz系统时钟(一个周期是20ns:1/50MHz=0.02us=20ns)
    //differential system clocks //200MHz系统时钟(一个周期是5ns:1/200MHz=0.005us=5ns)
    input               sys_clk_p,       // Differential input clock 200Mhz
    input               sys_clk_n,       // Differential input clock 200Mhz
    input  wire  [7:0]      addra ,      //输入 rom 地址
    
    output  wire [7:0]      douta        //输出 rom 数据
    );

//*********差分时钟这么处理***START******************
wire        sys_clk;
//差分输入时钟缓冲器-黑金FPGA
IBUFDS sys_clk_ibufgds //generate single end clock
(
	.O       (sys_clk      ),   //Differential clock converted to single terminal clock
	.I       (sys_clk_p    ),
	.IB      (sys_clk_n    )
);
//*********差分时钟这么处理*****END*******************

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

endmodule

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

Vivado 下 IP核 之ROM 读写

(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 and Internal Signal *******************//
//********************************************************************//

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

//reg define
//reg          sys_clk;   //时钟信号
reg        sys_clk_p;   //时钟信号
wire       sys_clk_n;
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_clk_p <= 1'b1;   //初始时钟为低电平
    sys_rst_n <= 1'b0 ;  //复位信号初始为低电平
    #200   //等待200ns后
    sys_rst_n <= 1'b1 ;   //复位信号拉高
end

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

//让地址从 0~255 循环
always @(posedge sys_clk_p 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
     .sys_clk_p   (sys_clk_p    ),     //200Mhz系统时钟(差分时钟),一个周期为5ns
     .addra     (addra      ),     //输入 rom 地址
     
     .douta     (douta      )      //输出 rom 数据
);

endmodule

(3)仿真结果

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

Vivado 下 IP核 之ROM 读写

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

4、添加约束文件 .xdc

添加约束文件 ip_rom.xdc,添加约束文件.xdc,详细步骤见:Vivado 下 LED 流水灯实验_OliverH-yishuihan的博客-CSDN博客中的 “4.3、添加 XDC管脚约束文件”

约束文件 ip_rom.xdc 的具体内容如下:文章来源地址https://www.toymoban.com/news/detail-451058.html

############## NET - IOSTANDARD #######黑金-FPGA##############
set_property CFGBVS VCCO [current_design]
set_property CONFIG_VOLTAGE 3.3 [current_design]
#############SPI Configurate Setting#################
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design] 
set_property CONFIG_MODE SPIx4 [current_design] 
set_property BITSTREAM.CONFIG.CONFIGRATE 50 [current_design] 
############## clock define 时钟引脚、电平信号约束 #######黑金-FPGA##############
create_clock -period 5 [get_ports sys_clk_p]
set_property PACKAGE_PIN R4 [get_ports sys_clk_p]
set_property IOSTANDARD DIFF_SSTL15 [get_ports sys_clk_p]
##############reset key define#######################
set_property PACKAGE_PIN F15 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]

到了这里,关于Vivado 下 IP核 之ROM 读写的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vivado 下 IP核之FIFO 实验

    目录 Vivado 下 IP核之FIFO 实验 1、FIFO IP 核简介 2、实验任务 3、程序设计 3.1、FIFO IP 核配置 3.1.1、“Basic” 选项卡下各参数配置 3.1.2、“Native Ports”选项卡下各参数配置 3.1.3、“Status Flags” 选项卡下各参数配置 3.1.4、“Data Counts(数据计数)”选项卡下各参数配置 3.2、时序图讲

    2024年02月09日
    浏览(47)
  • DDR3 AXI4 IP核读写仿真实验(2)

    上篇blog中记录了DDR3 AXI4接口的IP配置详情,这一文章则是记录自己在项目工程以及学习中对于DDR3的读写测试。先讲一下大概的工程架构:产生16位的自加数写进写FIFO中,当FIFO中的数达到一次突发长度后将其全部读出写进DDR3中,再检测到DDR3中数达到1024之后全部读出写入到读

    2024年02月13日
    浏览(35)
  • Vivado DDS IP配置

            本文记录Vivado中DDS IP核相关配置方法,主要涉及输出信号位宽、频率、频率分辨率、相位等相关内容。       一、点击 IP Catalog,打开DDS IP配置界面 Configuration界面: 1、System Requirement         System Clock:产生DDS的时钟         Number of Channels:默认为1 2、System Par

    2024年02月15日
    浏览(28)
  • Vivado:ROM和RAM的verilog代码实现

    本文主要介绍ROM和RAM实现的verilog代码版本,可以借鉴参考下。 Read-only memory(ROM)使用ROM_STYLE属性选择使用寄存器或块RAM资源来实现ROM,示例代码如下: RAM设计方式有很多,可以用BRAM、LUT、分布式RAM、URAM实现,可以使用RAM_STYLE属性强制规定使用的资料类型。 (*rom_style = \\\"bl

    2024年02月09日
    浏览(30)
  • Vivado综合属性系列之四 ROM_STYLE

    目录 一、前言 二、ROM_STYLE         ROM英文全称为Read Only Memory,只读存储器,里面主要存放固定的数据。         ROM的使用方式与RAM类似,格式样例为:(* rom_style=\\\"{distributed | block}\\\" *),但可设置的值只有distributed和block,同时也支持在约束文件XDC使用set_property设置。 2.

    2024年02月05日
    浏览(29)
  • Vivado clocking wizard IP核PLL/MCMM配置

           PLL的英文全称是Phase Locked Loop,即锁相环,是一种反馈控制电路。PLL对时钟网络进行系统级的时钟管理和偏移控制,具有时钟倍频、分频、相位偏移和可编程占空比的功能。Xilinx 7系列器件中的时钟资源包含了时钟管理单元CMT,每个CMT由一个MMCM和一个PLL组成。对于一个

    2024年02月12日
    浏览(38)
  • Vivado中使用IP核SelectIO配置LVDS学习笔记

             Ps.1: 起初将PLL、OSERDESE、ISERDESE的复位都接系统复位,但是由于PLL初始化需要一段时间导致data异常,将PLL复位取消后data正常(且系统复位要在PLL初始化完成之后)。           Ps.2: bitslip不使能时,ISERDESE不能解串。          顶层模块代码如下:      

    2024年02月15日
    浏览(34)
  • ZYNQ学习笔记(四):PL与PS数据交互——基于BRAM IP 核的(PS端读写+PL端读)控制实验

    说起PS、PL数据交互,常见的有IO方式:MIO EMIO GPIO,还有利用BRAM或FIFO等,在上一篇文章ZYNQ学习笔记(三):PL与PS数据交互—— UART串口+AXI GPIO控制DDS IP核输出实验咱们学会了如何利用AXI GPIO IP核来实现PS(写)与PL(读)的数据交互,那么这篇文章来学习如何使用BRAM~ 本次实验

    2024年02月05日
    浏览(42)
  • VIVADO FFT IP核使用之SCALE_SCH的配置

    分为流水线架构,基-4突发架构,基-2突发架构,基-2LITE突发架构,原文 1 如下: 基-2和基-4是FFT算法的不同实现形式,简而言之,基-2算法按照时间或频率对序列进行抽取,将序列一分为二,基-4是一分为四。流水线算法能实现数据的连续输出。基-2LITE突发架构基于基-2架构,

    2024年02月07日
    浏览(26)
  • nginx简介与安装配置,目录结构和配置文件介绍,配置nginx的service管理

    目录 一.nginx简介 1.简介 2.特性 二.nginx安装 1.rpm包方式 (1)下载扩展源 (2)安装扩展rpm包,nginx -V查看配置参数,后面源码安装时要用到 (3)默认的配置文件位置和html存放位置 2.源码方式 (1)建议提前下好所需要的部分包 (2)下载tar.gz包 (3)建议将包解压到/usr/local

    2024年02月04日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包