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

article/2025/9/24 18:42:07

文章目录

  • 前言
  • 一、添加RAM IP核
  • 二、编写测试程序
  • 三、添加ILA
  • 四、分配管脚
  • 五、Simulator仿真
  • 六、硬件调试
  • 总结


前言

本实验的主要内容是介绍如何使用 FPGA内部的RAM以及程序对该RAM数据的读写操作。Vivado软件中提供了RAM的IP核 , 我们只需通过IP核例化一个RAM,根据RAM的读写时序来写入和读取RAM中存储的数据。


一、添加RAM IP核

首先创建一个名为ram_test的工程,具体的步骤可以参见:Vivado软件的使用——以led的交替闪烁为例。
新工程到下图所示的界面后点击Finish即可完成工程的创建。
在这里插入图片描述
工程创建完成后依次按照下图中的序号找到Block Memory Generator双击打开。
在这里插入图片描述
弹出如下对话框,在该界面中修改部分参数。
在这里插入图片描述
需要修改Component Name和Memory Type这两个部分,修改后如下图所示。
在这里插入图片描述
其中 Memory Type 选择的Simple Dual Prot RAM是伪双口RAM,它是最常用的,因为它有两个端口,输入和输出信号是独立的。
Simple Dual Prot RAM模块端口说明如下表。
在这里插入图片描述
RAM 的数据写入和读出都是按时钟的上升沿操作的,端口 A 数据写入的时候需要置高wea信号,同时提供地址和要写入的数据。而端口B是不能写入数据的,只能从 RAM 中读出数据,只要提供地址就可以了,一般情况下在下一个周期就可采集到有效的数据。
切换到Port A Options下依次修改数据宽度、深度以及使能管脚,修改后如下图所示。
在这里插入图片描述
接着切换到 Port B Options下,将使能管脚 Enable PortType 改为 Always Enable ,也可不修改保持默认Use ENB Pin ,相当于读使能信号,再把 Primitives Output Register取消勾选,其功能是在输出数据上加寄存器,这可以有效改善时序 ,但读出的数据会落后地址两个周期,因此在很多情况下,不用这项功能,保持读出的数据落后地址一个周期即可。
在这里插入图片描述
到这里,需要修改的部分已经完成了,其他各选项下的参数保持默认即可,点击OK按钮,弹出如下对话框。
在这里插入图片描述
点击Generate就可以生成RAM IP。


二、编写测试程序

编写测试程序来测试RAM的功能,我们向RAM的端口A写入一串连续的数据,且只写一次,并从端口B中读出,使用逻辑分析仪查看数据。
新建名为ram_test的Verilog文件,依次按照下图中标注的序号进行即可。
在这里插入图片描述
在新建好的ram_test.v中写入如下代码。

//该代码由正点原子提供
`timescale 1ns / 1psmodule ram_test(input clk,		          	//50MHz时钟input rst_n	             	//复位信号,低电平有效	);reg		[8:0]  		w_addr;	   		//RAM PORTA写地址
reg		[15:0] 		w_data;	   		//RAM PORTA写数据
reg 	      		wea;	    	//RAM PORTA使能
reg		[8:0]  		r_addr;	  	 	//RAM PORTB读地址
wire	[15:0] 		r_data;			//RAM PORTB读数据//产生RAM PORTB读地址
always @(posedge clk or negedge rst_n)
beginif(!rst_n) r_addr <= 9'd0;else if (|w_addr)			//w_addr位或,不等于0r_addr <= r_addr+1'b1;elser_addr <= 9'd0;	
end//产生RAM PORTA写使能信号
always@(posedge clk or negedge rst_n)
begin	if(!rst_n) wea <= 1'b0;else beginif(&w_addr) 			//w_addr的bit位全为1,共写入512个数据,写入完成wea <= 1'b0;                 else               wea	<= 1'b1;        //ram写使能end 
end //产生RAM PORTA写入的地址及数据
always@(posedge clk or negedge rst_n)
begin	if(!rst_n) beginw_addr <= 9'd0;w_data <= 16'd1;endelse beginif(wea) 					//ram写使能有效begin        if (&w_addr)			//w_addr的bit位全为1,共写入512个数据,写入完成beginw_addr <= w_addr ;	//将地址和数据的值保持住,只写一次RAMw_data <= w_data ;endelsebeginw_addr <= w_addr + 1'b1;w_data <= w_data + 1'b1;endendend 
end //实例化RAM	
ram_ip ram_ip_inst (.clka      (clk),         // input clka.wea       (wea),        // input [0 : 0] wea.addra     (w_addr),     // input [8 : 0] addra.dina      (w_data),     // input [15 : 0] dina.clkb      (clk),        // input clkb.addrb     (r_addr),     // input [8 : 0] addrb.doutb     (r_data)      // output [15 : 0] doutb
);//实例化ila逻辑分析仪
ila_0 ila_0_inst (.clk	(clk), .probe0	(r_data), .probe1	(r_addr) 
);endmodule

其中实例化RAM部分的代码来自ram_ip中的ram_ip.veo文件,不过需要将括号内的参数做一修改。
在这里插入图片描述


三、添加ILA

我们还需要添加ILA,其添加过程可参见:使用Vivado软件进行硬件调试。
探针的数量这里设置为2,即数据和地址两个探针。
在这里插入图片描述
这里每个探针的位数按照代码中的分配,r_data是16位,r_addr是9位。
在这里插入图片描述
对应的代码如下。

reg		[8:0]  		r_addr;	  	 	//RAM PORTB读地址
wire	[15:0] 		r_data;			//RAM PORTB读数据

点击OK后在弹出的对话框中生成IP,耐心等待其完成!
在这里插入图片描述
实例化ila逻辑分析仪部分的代码来自ila_0中的ila_0.veo文件,不过需要将括号内的参数做一修改。
在这里插入图片描述


四、分配管脚

本实验中需要分配管脚的只有时钟信号clk(管脚为U18)和复位信号rst_n(管脚为N15),按照下图中的数字顺序即可完成管脚的分配。
在这里插入图片描述
管脚分配完成后Ctrl+S保存,名称与工程名保持一致。
在这里插入图片描述
管脚分配的信息在下图圈中的文件中。
在这里插入图片描述


五、Simulator仿真

Simulator仿真创建文件的过程可参见:Vivado中Simulator仿真软件的使用。
按照下图中的顺序新建TB文件。
在这里插入图片描述
在tb_ram_test.v文件中写入如下代码。

//该代码由正点原子提供
`timescale 1ns / 1psmodule vtf_ram_tb;
// Inputs
reg clk;
reg rst_n;// Instantiate the Unit Under Test (UUT)
ram_test uut (.clk	(clk), 		.rst_n	(rst_n)
);initial 
begin// Initialize Inputsclk = 0;rst_n = 0;// Wait 100 ns for global reset to finish#100;rst_n = 1;       endalways #10 clk = ~ clk;   //20ns一个周期,产生50MHz时钟源endmodule

保存代码后选择SIMULATION下的Run Simulation,选择第一个行为仿真。
将所有代码中定义的信号拖入到波形仿真窗口,设置仿真时间为1000ns,运行后结果如下图所示。
在这里插入图片描述
由仿真结果可知,RAM 的数据写入和读出都是按时钟的上升沿操作的,数据写入的时候需要置高wea信号,在下一个周期就可采集到有效的数据。


六、硬件调试

连接开发板,点击Generate Bitstream生成比特流文件,将其下载到开发板上。
在这里插入图片描述
下载后弹出如下窗口,设置r_addr的初始数值为000,然后点击运行按钮,得到如下波形,将游标移动到红线附近并放大得到下图。
在这里插入图片描述
由上图可以看到 r_addr 不断地从0 累加到 1f f,随着 r_addr 的变化,r_data 也在变化,而r_data的数据正是我们写入到RAM中的 512个数据。
这里需要注意 r_addr出现新地址时, r_data对应的数据要延时两个时钟周期才会出现,数据比地址晚两个时钟周期出现,这与仿真的结果是一致的。


总结

以上就是ZYNQ之FPGA 片内RAM读写测试实验的所有内容了,本实验较为综合,包括了前面介绍过的建工程、编写Verilog代码、例化IP核、仿真和硬件调试等内容,注意这些部分在该流程中的顺序和作用。
本文参考资料:正点原子–course_s1_ZYNQ那些事儿-FPGA实验篇V1.06.pdf


http://chatgpt.dhexx.cn/article/FD61diiR.shtml

相关文章

ZYNQ-XADC使用

学习内容 本文首先介绍了ZYNQ的XADC的相关内容&#xff0c;并学习使用ZYNQ芯片中的XADC测量芯片内部的温度电压等参数&#xff0c;然后进行串口打印输出。 开发环境 vivado 18.3&SDK&#xff0c;PYNQ-Z2开发板。 XADC介绍 简介 Xilinx模拟信号转换模块&#xff0c;称…

ZYNQ SDK开发调试踩坑指南

关注星标公众号&#xff0c;及时获取更多技术分享~ 作者 | 冰茶奥利奥 微信公众号 | 嵌入式电子创客街 目录 坑1&#xff1a;裸机Ps串口收数问题 坑2&#xff1a;多个中断不能同时使用问题 坑3&#xff1a;block design中DDR3的选择 坑4&#xff1a;新板子能够检测到芯片&…

万变不离其宗之ZYNQ启动介绍

1、概述 ZYNQ 的详细介绍参考 XILINX 官方文档 UG585&#xff0c;在了解了 ZYNQ 的基本架构组成和丰富的资源后&#xff0c;下一步便是分析他的启动流程&#xff0c;以便更好的认识 ZYNQ 并开始开发工作&#xff1b; 关于 ZYNQ 启动方面的描述&#xff0c;这里我觉得涉及到几个…

ZYNQ入门

目录 一、ZYNQ简介 二、vivado工程 ①创建工程 ②添加设计文件 ③生产顶层HDL模块 ④生成 Bitstream 文件并导 三、vitis工程 ①启动vitis ②创建工程 ③编译与下载 一、ZYNQ简介 ZYNQ 是赛灵思公司&#xff08;Xilinx&#xff09;推出的新一代全可编程片上系统&#x…

ZYNQ架构

ZYNQ 首先&#xff0c;我们来了解传统的SOC架构&#xff0c;一般使用 ARM 作为主控&#xff0c;通过 ARM 的外设并行 RAM 类总线外挂 FPGA &#xff0c;使用 FPGA 来做高速的数据采集或者运算&#xff0c;因为FPGA 有灵活性好&#xff0c;资源丰富&#xff0c;可反复编程&#…

zynqmp soc 移植vxWorks 7

1.使用worksbench4创建vsb工程&#xff1b; 2.使用worksbench4创建vip工程&#xff1b; 3.修改设备树文件&#xff0c;根据硬件电路选择对应的UART&#xff1b; 4.tftp引导启动&#xff1b;

ZYNQ开发系列——ZYNQ系统的搭建

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ZYNQ开发系列——ZYNQ系统的搭建 DDR设置FLASH设置UART设置网口设置当我们有一个要用ZYNQ做的项目时,首先当然是把其最小系统搭建起来。这个最小系统可以交付给开发PS的同事开发裸机程序/RTOS实时操作系统/…

ZYNQ之高速AD/DA验证实验

文章目录 前言一、ADDA模块介绍二、添加ROM IP核三、添加ILA IP核四、编写测试程序五、管脚分配六、连接开发板测试总结 前言 本实验是高速AD/DA验证实验&#xff0c;将使用高速DA芯片实现数模转换&#xff0c;产生正弦波模拟电压信号&#xff0c;并通过高速AD芯片将模拟信号转…

ZYNQ - 嵌入式Linux开发 -10- ZYNQ启动流程分析

FSBL启动准备工作 在静态情况下&#xff0c;Boot.BIN启动文件存放在SD卡或QSPI等存储介质中&#xff0c;然后Boot.BIN文件中已经包含了FSBL代码&#xff0c;也就是说FSBL代码已经集成在了Boot.BIN文件中&#xff0c;所以FSBL代码也是存放在Boot .BIN文件中。 如果要启动FSBL代…

初识ZYNQ结构

本文介绍了zynq的结构&#xff0c;简述了PS中的APU。 处理器系统 所有的 Zynq 芯片都有相同的基本架构。作为处理器系统的基础&#xff0c;所有的芯片都包含了一颗双核 ARM Cortex-A9 处理器。这是一颗 “ 硬 ” 处理器 —— 它是芯片上专用而且优化过的硅片元件。 作为比较…

zynq中断

在zynq中选择中断信号后&#xff1a; 只能看到一个[0:0]的向量&#xff0c;完全无法对应中断号&#xff1a; 且属性栏目没有配置选项&#xff0c;一般可以看到有些连接图如下&#xff1a; 如果看成最低位的话就是61,那么其它中断号怎么使用呢&#xff1a;查到的资料如下&#x…

ZYNQ基础知识

1.ZYNQ介绍 全称为Zynq-7000 All Programmable Soc 1.Zynq是赛灵思&#xff08;Xilinx&#xff09;推出的新一代全可编程片上系统&#xff0c;将处理器的软件可编程性和FPGA的硬件可编程性完美结合。具有较强的系统性能、灵活性与可扩展性。 2.旨在为视频监控、汽车驾驶员辅助…

一、ZYNQ简介

1 ZYNQ简介 &#xff08;1&#xff09;ZYNQ简介 ​ ZYNQ全称Zynq-7000 All Programmable SoC&#xff0c;是赛灵思公司&#xff08;Xilinx&#xff09;推出的新一代全可编程片上系统&#xff08;&#xff08;APSoC&#xff09;&#xff08;全可编程指的是硬件和软件都可以编程…

ZYNQ简介

目录 1.ZYNQ简介 2.片上系统&#xff0c;板上系统&#xff0c;可编程片上系统&#xff0c;全可编程上系统 &#xff08;1&#xff09;板上系统 &#xff08;2&#xff09;片上系统&#xff08;SOC&#xff09; &#xff08;3&#xff09;可编程片上系统&#xff08;SOPC&a…

【ZYNQ】从入门到秃头01 初识ZYNQ(PS和PL之间连接)

文章目录 从嵌入式Linux到ZYNQZYNQ简介PL简介常用的可编程逻辑器件&#xff1a;PL结构 PS简介AXIAXI4 StreamAXI4 ZYNQ芯片开发流程的简介学习ZYNQ要具备哪些技能 从嵌入式Linux到ZYNQ 之前的学习领域一直是ARM&#xff0c;从STM32到NXP iMX6&#xff0c; 从裸机开发到Linux操…

css-输入框和文本域样式调整

输入框去掉选中后的边框变化效果 选中后边框变化&#xff1a; 去掉变化效果方法&#xff1a;添加css属性- - - outline: none; 文本域去掉右下角拖拽图样 默认文本域右下角有个拖拽的图样&#xff0c;将鼠标移动到右下角可以进行拖拽实现放大缩小&#xff1a; 代码示例&#x…

HTML5-列表框、文本域和文件域

<!--下拉框&#xff0c;列表框selected 默认选择--><p>国家&#xff1a;<select name"列表名称" ><option value"china">中国</option><option value"us">美国</option><option value"eth&qu…

【多行文本输入框--文本域】(html,css)

<style>textarea{width: 300px;height: 300px;resize: none;/* resize:重新设置大小&#xff0c;vertical,horizontal,both,none */} </style> <body><div>多行文本输入框--文本域</div><div><!-- placeholder--提示文字 --><!--…

JTextArea:文本域组件

文本域与文本框的最大区别就是文本域允许用户输入多行文本信息。在 Swing 中使用 JTextArea 类实现一个文本域&#xff0c;其常用构造方法如下。 JTextArea()&#xff1a;创建一个默认的文本域。JTextArea(int rows,int columns)&#xff1a;创建一个具有指定行数和列数的文本…

html文本域

<!DOCTYPE <!DOCTYPE html><html><head><meta charset"utf-8"/><title>文本域</title></head><body>用户留言:<br/><form action"mailto:minriqq.com" name"invest" method"p…