ZYNQ之FPGA 片内ROM读写测试实验

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


前言

FPGA本身是SRAM架构的,断电之后程序就会消失,那么如何利用FPGA实现一个ROM呢,我们可以利用FPGA内部的RAM资源实现ROM,但这不是真正意义上的ROM,而是每次上电都会把初始化的值先写入RAM。Vivado软件中提供了ROM的IP核 , 我们只需通过IP核例化一个ROM,根据ROM的读时序来读取ROM中存储的数据。本实验将介绍如何使用FPGA内部的ROM以及程序对该ROM的数据读操作。该实验与ZYNQ之FPGA 片内RAM读写测试实验操作类似,可以参考。


一、创建ROM初始化文件

对于ROM,我们需要提前准备好数据,这样在FPGA 实际运行时,就可以直接读取这些ROM中预存好的数据了。Xilinx FPGA 的片内ROM支持初始化数据配置,我们可以创建一个后缀名为“.coe”的ROM初始化文件。
首先创建一个名为rom_test的文件夹。
ZYNQ之FPGA 片内ROM读写测试实验
然后在该文件夹下新建一个文本文档,将其后缀名改为“.coe”,我这里给文件命名为rom_init.coe。
ZYNQ之FPGA 片内ROM读写测试实验rom_init.coe文件中的内容如下。

//该代码来自正点原子
MEMORY_INITIALIZATION_RADIX=16;        //表示ROM内容的数据格式是16进制
MEMORY_INITIALIZATION_VECTOR= 
11,
22,
33,
44,
55,
66,
77,
88,
99,
aa,
bb,
cc,
dd,
ee,
ff,
00,
a1,
a2,
a3,
a4,
a5,
a6,
a7,
a8,
b1,
b2,
b3,
b4,
b5,
b6,
b7,
b8;       //每个数据后面用逗号或者空格或者换行符隔开,最后一个数据后面加分号

ROM初始化文件的内容格式比较简单,其中,第1行为定义的数据格式,第3行到第34行是这个 32*8bit 大小ROM的初始化数据,每行数字后面用逗号,最后一行数字结束时用分号。


二、添加ROM IP核

先新建一个名为rom_test的Vivado工程,具体的步骤可以参见:Vivado软件的使用——以led的交替闪烁为例。
新工程到下图所示的界面后点击Finish即可完成工程的创建。
ZYNQ之FPGA 片内ROM读写测试实验
接着在工程中添加ROM IP,步骤为依次按照下图中的序号找到Block Memory Generator双击打开。
ZYNQ之FPGA 片内ROM读写测试实验
在弹出的对话框中的Basic下修改Component Name为rom_ip,修改Memory Type为Single Port ROM。
ZYNQ之FPGA 片内ROM读写测试实验
在Port A Options下按照下图中的序号依次修改。
ZYNQ之FPGA 片内ROM读写测试实验
把Primitives Output Register取消勾选,其功能是在输出数据上加寄存器,这可以有效改善时序 ,但读出的数据会落后地址两个周期,因此在很多情况下,不用这项功能,保持读出的数据落后地址一个周期即可。
在Other Options下勾选Load Init File,然后点击Browse查找第一步中创建好的文件rom_init.coe。
ZYNQ之FPGA 片内ROM读写测试实验
按照下图中序号依次选择到ROM的初始化文件。
ZYNQ之FPGA 片内ROM读写测试实验
可以看到该文件已经添加成功了,点击OK即可。
ZYNQ之FPGA 片内ROM读写测试实验
在弹出的对话框中点击Generate就可以生成ROM IP。
ZYNQ之FPGA 片内ROM读写测试实验


三、编写测试程序

ROM的程序设计非常简单,在程序中我们只要每个时钟改变ROM的地址,ROM就会输出当前地址的内部存储数据 ,例化ILA,用于观察地址和数据的变化。
新建名为rom_test的Verilog文件,依次按照下图中标注的序号进行即可。
ZYNQ之FPGA 片内ROM读写测试实验
在新建好的rom_test.v中写入如下代码。

//该代码来自正点原子
`timescale 1ns / 1ps

module rom_test(
	input sys_clk,	//50MHz时钟
	input rst_n		//复位,低电平有效
    );

wire [7:0] rom_data;	  //ROM读出数据
reg	 [4:0] rom_addr;      //ROM输入地址 

//产生ROM地址读取数据
always @ (posedge sys_clk or negedge rst_n)
begin
    if(!rst_n)
        rom_addr <= 10'd0;
    else
        rom_addr <= rom_addr+1'b1;
end        
//实例化ROM
rom_ip rom_ip_inst
(
    .clka   (sys_clk),      //inoput clka
    .addra  (rom_addr),      //input [4:0] addra
    .douta  (rom_data)       //output [7:0] douta
);
//实例化逻辑分析仪
ila_0 ila_m0
(
    .clk    (sys_clk),
    .probe0 (rom_addr),
	.probe1 (rom_data)
);

endmodule

其中实例化ROM部分的代码来自rom_ip中的rom_ip.veo文件,不过需要将括号内的参数做一修改。
ZYNQ之FPGA 片内ROM读写测试实验


四、添加ILA

我们还需要添加ILA,其添加过程可参见:使用Vivado软件进行硬件调试。
探针的数量这里设置为2,即rom_addr和rom_data两个探针。
ZYNQ之FPGA 片内ROM读写测试实验
这里每个探针的位数按照代码中的分配,rom_addr是5位,rom_data是8位。
ZYNQ之FPGA 片内ROM读写测试实验
对应的代码如下。

wire [7:0] rom_data;	  //ROM读出数据
reg	 [4:0] rom_addr;      //ROM输入地址 

在弹出的对话框中点击Generate即可。
ZYNQ之FPGA 片内ROM读写测试实验
实例化ILA逻辑分析仪部分的代码来自ila_0中的ila_0.veo文件,不过需要将括号内的参数做一修改。
ZYNQ之FPGA 片内ROM读写测试实验


五、分配管脚

本实验中需要分配管脚的只有时钟信号clk(管脚为U18)和复位信号rst_n(管脚为N15),按照下图中的数字顺序即可完成管脚的分配。
ZYNQ之FPGA 片内ROM读写测试实验
管脚分配完成后Ctrl+S保存,名称与工程名保持一致。
ZYNQ之FPGA 片内ROM读写测试实验
管脚分配的信息在rom_test.xdc文件中。
ZYNQ之FPGA 片内ROM读写测试实验


六、Simulator仿真

Simulator仿真创建文件的过程可参见:Vivado中Simulator仿真软件的使用。
右击Simulation Sources选择Add Source按照下图中序号依次新建TB文件。
ZYNQ之FPGA 片内ROM读写测试实验
在tb_rom_test.v文件中写入如下代码。

//该代码来自正点原子
`timescale 1ns / 1ps

module vtf_rom_tb;
// Inputs
reg sys_clk;
reg rst_n;

// Instantiate the Unit Under Test (UUT)
rom_test uut (
	.sys_clk	(sys_clk), 		
	.rst_n		(rst_n)
);

initial 
begin
	// Initialize Inputs
	sys_clk = 0;
	rst_n = 0;

	// Wait 100 ns for global reset to finish
	#100;
      rst_n = 1;       

 end

always #10 sys_clk = ~ sys_clk;   //20ns一个周期,产生50MHz时钟源
   
endmodule

保存代码后选择SIMULATION下的Run Simulation,选择第一个行为仿真。
将所有代码中定义的信号拖入到波形仿真窗口,设置仿真时间为1000ns,运行后结果如下图所示。
ZYNQ之FPGA 片内ROM读写测试实验
由上图可知,该仿真结果与RAM读取数据一样,数据滞后于地址一个周期。


七、硬件调试

连接开发板,点击Generate Bitstream生成比特流文件,并将其下载到开发板上。
ZYNQ之FPGA 片内ROM读写测试实验
下载后弹出如下窗口,设置rom_addr的初始数值为00,然后点击运行按钮,得到如下波形,将游标移动到红线所在位置并放大得到下图。
ZYNQ之FPGA 片内ROM读写测试实验
由上图可以知道,硬件调试的结果与仿真的结果一致。


总结

以上就是ZYNQ之FPGA 片内ROM读写测试实验的所有内容了,该实验过程与ZYNQ之FPGA 片内RAM读写测试实验非常相似,大的不同就是该实验需要创建ROM初始化文件,然后在添加ROM IP核时选上该文件。
本文参考资料:正点原子–course_s1_ZYNQ那些事儿-FPGA实验篇V1.06.pdf文章来源地址https://www.toymoban.com/news/detail-466954.html

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

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

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

相关文章

  • 【正点原子FPGA连载】第三十一章DDR4读写测试实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html DDR4 SDRAM(Double-Data-Rate Fourth Generation Synchronous Dynamic Random Access Memory,简称为DDR4 SDRAM),是一种高速动态随机

    2024年01月16日
    浏览(65)
  • FPGA原理与结构——ROM IP的使用与测试

    系列文章目录:FPGA原理与结构(0)——目录与传送门         本文介绍 Block Memory Generator v8.4 IP核 实现ROM,在学习一个IP核的使用之前,首先需要对于IP核的具体参数和原理有一个基本的了解,具体可以参考: FPGA原理与结构——块RAM(Block RAM,BRAM) https://blog.csdn.net/appl

    2024年02月11日
    浏览(38)
  • 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日
    浏览(57)
  • 【正点原子FPGA连载】第十五章eMMC读写测试实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html eMMC是一种嵌入式多媒体存储卡,它具有存储容量大、传输速度快、易于使用等优点,主要应用于对存储容量有

    2024年02月06日
    浏览(66)
  • 基于紫光同创 FPGA 的 DDR3 读写实验

    此篇为专栏 《紫光同创FPGA开发笔记》 的第二篇,记录我的学习FPGA的一些开发过程和心得感悟,刚接触FPGA的朋友们可以先去此专栏置顶 《FPGA零基础入门学习路线》来做最基础的扫盲。 本篇内容基于笔者实际开发过程和正点原子资料撰写,将会详细讲解此 FPGA 实验的全流程

    2024年01月20日
    浏览(49)
  • FPGA解码MIPI视频:Xilinx Zynq7000中端FPGA,基于MIPI CSI-2 RX Subsystem架构实现,提供工程源码和技术支持

    FPGA解码MIPI视频:Xilinx Zynq7000高端FPGA,基于MIPI CSI-2 RX Subsystem架构实现,提供工程源码和技术支持 FPGA图像采集领域目前协议最复杂、技术难度最高的应该就是MIPI协议了,MIPI解码难度之高,令无数英雄竞折腰,以至于Xilinx官方不得不推出专用的IP核供开发者使用,不然太高端

    2024年02月22日
    浏览(42)
  • Quartus 平台 FPGA 片内 RAM 使用

    本文将以 Quartus 自带的 RAM:2-PORT 为例,介绍 EP4CE6E22C8 On Chip Memory 的使用 位于 On Chip Memory 下有两个 RAM IP 核 分别是单端口 RAM 和双端口 RAM: 单端口RAM只有一组地址线,这组地址线控制着写数据端口和读数据端口, 而双端口RAM具有两组地址线,这两组地址线分别控制着写数据

    2024年02月03日
    浏览(42)
  • 【FPGA】MIG DDR3读写逻辑测试

            笔者在之前通过microblaze软核的方式实现了DDR3芯片的读写测试,当时对于Xilinx MIG DDR控制器的理解还比较肤浅。还是想通过控制用户接口时序的方式来读写DDR,扩展和加深自己对DDR的理解。 MIG IP核配置请看我的前一篇文章 【FPGA测试】Microblaze测试DDR读写_microblaze

    2024年01月22日
    浏览(43)
  • 【Quartus FPGA】EMIF DDR3 读写带宽测试

    在通信原理中,通信系统的有效性用带宽来衡量,带宽定义为每秒传输的比特数,单位 b/s,或 bps。在 DDR3 接口的产品设计中,DDR3 读/写带宽是设计者必须考虑的指标。本文主要介绍了 Quartus FPGA 平台 EMIF 参数配置,以及测试 DDR3 读写带宽的过程,FPGA 器件型号是 Cyclone 10 GX

    2024年02月13日
    浏览(45)
  • 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、

    2024年02月05日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包