Zynq UltraScale+ ZCU102入门教程02-BRAM的读写

0.前言

上一章介绍了GPIO点亮了ZCU上的8个流水灯,今天介绍BRAM的读写。BRAM 是Block RAM的缩写,它的作用主要是作为数据的缓存,用于IP和内存之间的少量数据交互,CPU提前将数据存入BRAM,当IP需要BRAM中的数据时,可直接从BRAM里面读取。
上一章利用的是官方例程,细心的人可看到其实上一章已经生成了BRAM,所以这一章我们仍然基于上一章的工程来做。
掌握内容:

  1. 单口BRAM的读写;
  2. 内存数据的查看;
  3. ILA逻辑分析仪观测BRAM端口数据;

1.硬件工程的搭建

step1. 打开上一章的工程,双击Block Memory Generator 这个IP,可以看到这个IP的一些基本配置信息,这个BRAM配置是单口RAM,也即输入输出共用一个接口。
Zynq UltraScale+ ZCU102入门教程02-BRAM的读写_第1张图片
step2.对于硬件工程,可不做任何修改,在这里为了观察BRAM端口的数据,我们只用添加一个ILA:选中BRAM_PORTA和BRAM_PORTA之间的连线,右键点击Debug。
Zynq UltraScale+ ZCU102入门教程02-BRAM的读写_第2张图片

step3. 点击Run Connection Automation,vivado会帮我们自动例化一个ILA并连线:
Zynq UltraScale+ ZCU102入门教程02-BRAM的读写_第3张图片

step4. 连线图如下:
Zynq UltraScale+ ZCU102入门教程02-BRAM的读写_第4张图片

step5. 打开Sources目录 ,选中BD并右键,依次执行1、2、3:
Zynq UltraScale+ ZCU102入门教程02-BRAM的读写_第5张图片

step6. 完成后直接点击生成bit流文件;
step7. 生成bit流文件之后,和上一篇一样,导入到SDK中,然后加载SDK;

2.软件工程

step1. 新建一个新工程,然后建一个main.c文件,将下面代码复制到main.c文件中:

#include "xparameters.h"
#include "xgpio.h"
#include "xil_printf.h"
#include "sleep.h"
#include "xil_types.h"
#include "xil_io.h"
#include 

#define BRAM_ADDR	XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR

int main()
{
	u32 data;

	for(u32 i=0; i<1024; i++){
		Xil_Out32(BRAM_ADDR+i*4, i);
	}

	for(u32 j=0; j<1024; j++){
		data = Xil_In32(BRAM_ADDR+j*4);
		xil_printf("地址%x的数据是%d\n", BRAM_ADDR+j*4, data);
	}
}

代码虽然比较简单,但这里还是说明一下。首先第一个for循环是将0、1、2、3…1023一共1024个数据写入BRAM中,第二个for循环是将BRAM中的1024个数据读出来并通过串口打印。

step2. 选中SDK中的SDK Terminal ,然后点击“+”,这里是配置串口,打印的数据信息是通过串口从开发板上发送到电脑的,SDK Terminal类似一个串口调试软件,可接受串口信息。在这里注意要将开发板上的串口线连到电脑上。
在这里插入图片描述

step3. 设置端口号以及波特率等信息,然后点击OK;
Zynq UltraScale+ ZCU102入门教程02-BRAM的读写_第6张图片

step4. 完成之后,SDK Terminal 窗口显示连接成功信息:
Zynq UltraScale+ ZCU102入门教程02-BRAM的读写_第7张图片

step5. 接下来右键工程进行Debug,上一篇是直接Run,这一篇需要Debug:
Zynq UltraScale+ ZCU102入门教程02-BRAM的读写_第8张图片
step6. 双击最后一个,产生新的该工程Debug器:
Zynq UltraScale+ ZCU102入门教程02-BRAM的读写_第9张图片

step7. 勾选完下面选项后,点击Apply、Debug:
Zynq UltraScale+ ZCU102入门教程02-BRAM的读写_第10张图片
step8. 接下来等待程序烧写到板子上:
Zynq UltraScale+ ZCU102入门教程02-BRAM的读写_第11张图片

step9. 然后点击vivado工程中的Open Target,点击Auto Connect。
Zynq UltraScale+ ZCU102入门教程02-BRAM的读写_第12张图片

step10. 自动连接板子后,点击该窗口中的加号,把所以信号都添加窗口中:
Zynq UltraScale+ ZCU102入门教程02-BRAM的读写_第13张图片

step11. 然后点击下面窗口中的加号,这里我们只用添加一个BRAM使能信号作为触发信号即可:
Zynq UltraScale+ ZCU102入门教程02-BRAM的读写_第14张图片

step12. 添加完成后,我们选择触发值,把Value的值改为1即可。这个值得作用是当ILA等待触发信号时,只要该信号的值变为1就开始进行采样。
Zynq UltraScale+ ZCU102入门教程02-BRAM的读写_第15张图片

step13. 点击波形窗口上面的触发按钮,开始等待触发:
Zynq UltraScale+ ZCU102入门教程02-BRAM的读写_第16张图片

step14. 回到SDK中,选中Cortex-A53 #0这一项,因为这个是包含我们主程序的,然后点击运行按钮:
Zynq UltraScale+ ZCU102入门教程02-BRAM的读写_第17张图片

step15. 点击SDk Terminal 窗口,我们可以看到数据打印出来了:
Zynq UltraScale+ ZCU102入门教程02-BRAM的读写_第18张图片

step16. 接下我们看看内存中的数据。BRAM在内存中映射的首地址为0xB0000000,点击右下角Memory中的加号:
Zynq UltraScale+ ZCU102入门教程02-BRAM的读写_第19张图片

step17. 然后输入该地址,点击OK:
Zynq UltraScale+ ZCU102入门教程02-BRAM的读写_第20张图片

step18. 可以看到数据确实如此:
Zynq UltraScale+ ZCU102入门教程02-BRAM的读写_第21张图片

step19. 然后看vivado工程中的波形:
Zynq UltraScale+ ZCU102入门教程02-BRAM的读写_第22张图片

step20. 每当en使能信号有效时,进行数据写入,具体波形读者自行分析:
在这里插入图片描述

你可能感兴趣的:(ZYNQ,UltraScale+,ZCU102)