赞
踩
BRAM(Block RAM)是 PL 部分的存储器阵列,PS 和 PL 通过对 BRAM 进行读写操作,来实现数据的交互。在 PL 中,通过输出时钟、地址、读写控制等信号来对 BRAM 进行读写操作。而在 PS 中,处理器并不需要直接驱动 BRAM 的端口,而是通过 AXI BRAM 控制器来对 BRAM 进行读写操作。AXI BRAM 控制器是集成在 Vivado 设计软件中的软核,可以配置成 AXI4-lite 接口模式或者 AXI4 接口模式。
AXI4 接口模式的 BRAM 控制器支持的数据位宽为 32 位、64 位、128 位、512 位和 1024 位,而 AXI4-Lite接口仅支持 32 位数据位宽。PS 通过 AXI4-Lite 接口访问 BRAM,当使能 ECC 选项时,ECC 允许 AXI 主接口检测和纠正 BRAM 块中的单位和双位错误。AXI BRAM 控制器作为 AXI 总线的从接口,和 AXI 主接口实现互联,来对 BRAM 进行读写操作。针对不同的应用场合,该 IP 核支持单次传输和突发传输两种方式。
任务:
PS 将串口接收到的数据写入 BRAM,然后从 BRAM 中读出数据,并通过串口打印出来;与此同时,PL 从 BRAM 中同样读出数据,并通过 ILA 来观察读出的数据与串口打印的数据是否一致。下面是系统框图
PS 端的 M_AXI_GP0 作为主端口,与 PL 端的 AXI BRAM 控制器 IP 核和 PL 读 BRAM IP (pl_bram_rd)通过 AXI4 总线进行连接。其中,AXI 互联 IP(AXI Interconnect)用于连接 AXI 存储器映射(memory-mapped)的主器件和从器件;AXI BRAM 控制器作为 PS 端读写 BRAM 的 IP 核;PL 读BRAM IP 核是我们自定义的 IP 核,实现了 PL 端从 BRAM 中读出数据的功能,除此之外,PS 端通过 AXI总线来配置该 IP 核读取 BRAM 的起始地址和个数等。本实验中,我们将自定义的IP核替换成AXI BRAM IP核。
本次实验创建的BRAM是双端口RAM,两个端口均连接AXI BRAM控制器
接着我们调用一个双端口RAM
综合后的连线图
工程代码
- #include <stdio.h>
- #include "xil_io.h"
- #include "xparameters.h"
- #include "xbram.h"
-
- #define BRAM_CTRL_0_BASE XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR//用于写入数据,操作A端口的AXI总线基地址
- #define BRAM_CTRL_1_BASE XPAR_AXI_BRAM_CTRL_1_S_AXI_BASEADDR//用于读数据,操作B端口的AXI总线基地址
- char test_string[]="test ps pl bram string\n";
- int main()
- {
- int num,str_len;
- int str_rev;
- xil_printf("application start \n");
- str_len=strlen(test_string);//计算写入长度
- //通过控制axi_bram_ctrl_0像双端口ram写入test_string
- for( num=0; num<str_len; num++ )
- {
- XBram_WriteReg(BRAM_CTRL_0_BASE , num*4, test_string[num]);
- }
-
- //通过控制axi_bram_ctrl_1读出写入的数据
- for( num=0; num<str_len; num++ )
- {
- str_rev = XBram_ReadReg( BRAM_CTRL_1_BASE, num*4);
- xil_printf( "ADDR:%x DAT:%c\n",XPAR_AXI_BRAM_CTRL_1_S_AXI_BASEADDR + num*4,str_rev);
- }
-
- xil_printf("test over!\n");
-
- return 0;
- }
-
调试如下
地址高位是42开头的
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。