上一章介绍了GPIO点亮了ZCU上的8个流水灯,今天介绍BRAM的读写。BRAM 是Block RAM的缩写,它的作用主要是作为数据的缓存,用于IP和内存之间的少量数据交互,CPU提前将数据存入BRAM,当IP需要BRAM中的数据时,可直接从BRAM里面读取。
上一章利用的是官方例程,细心的人可看到其实上一章已经生成了BRAM,所以这一章我们仍然基于上一章的工程来做。
掌握内容:
step1. 打开上一章的工程,双击Block Memory Generator 这个IP,可以看到这个IP的一些基本配置信息,这个BRAM配置是单口RAM,也即输入输出共用一个接口。
step2.对于硬件工程,可不做任何修改,在这里为了观察BRAM端口的数据,我们只用添加一个ILA:选中BRAM_PORTA和BRAM_PORTA之间的连线,右键点击Debug。
step3. 点击Run Connection Automation,vivado会帮我们自动例化一个ILA并连线:
step5. 打开Sources目录 ,选中BD并右键,依次执行1、2、3:
step6. 完成后直接点击生成bit流文件;
step7. 生成bit流文件之后,和上一篇一样,导入到SDK中,然后加载SDK;
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类似一个串口调试软件,可接受串口信息。在这里注意要将开发板上的串口线连到电脑上。
step4. 完成之后,SDK Terminal 窗口显示连接成功信息:
step5. 接下来右键工程进行Debug,上一篇是直接Run,这一篇需要Debug:
step6. 双击最后一个,产生新的该工程Debug器:
step7. 勾选完下面选项后,点击Apply、Debug:
step8. 接下来等待程序烧写到板子上:
step9. 然后点击vivado工程中的Open Target,点击Auto Connect。
step10. 自动连接板子后,点击该窗口中的加号,把所以信号都添加窗口中:
step11. 然后点击下面窗口中的加号,这里我们只用添加一个BRAM使能信号作为触发信号即可:
step12. 添加完成后,我们选择触发值,把Value的值改为1即可。这个值得作用是当ILA等待触发信号时,只要该信号的值变为1就开始进行采样。
step14. 回到SDK中,选中Cortex-A53 #0这一项,因为这个是包含我们主程序的,然后点击运行按钮:
step15. 点击SDk Terminal 窗口,我们可以看到数据打印出来了:
step16. 接下我们看看内存中的数据。BRAM在内存中映射的首地址为0xB0000000,点击右下角Memory中的加号: