免责声明:
本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下,作者不对因使用本文内容而导致的任何直接或间接损失承担责任,包括但不限于数据丢失、业务中断或其他经济损失。
读者在使用本文信息时,应自行验证其准确性和适用性,并对其使用结果负责。本文内容不构成专业技术咨询或建议,具体的技术实现和应用应根据实际情况和需要进行详细分析和验证。
本文所涉及的任何商标、版权或其他知识产权均属于其各自的所有者。若本文中引用了第三方的资料或信息,引用仅为学术交流目的,不构成对第三方内容的认可或保证。
若有任何疑问或需进一步信息,请联系本文作者或相关专业人士。
目录
2.创建 bram_controller_test APP 工程
前言
AXI BRAM Controller 通过 AXI4-FULL/LITE 接口与 ZYNQ 互联。本期将介绍该 BRAM Controller IP 核的功能及其在基于 FPGA 的图像处理中的应用。BRAM Controller 用于控制 BRAM 数据缓存,实现 BRAM 和 PL 之间的数据交互。通过 PS 将查找表植入 BRAM,PL 进行读取,从而规避图像处理中复杂的线性/非线性运算。
一、系统架构
DDR + ZYNQ + UART + AXI BRAM Controler + BRAM + PL_BRAM_RD_Controler+ILA
二、搭建 SOC 系统工程
1.设置 PS GP Master 接口:
由于AXI BRAM Controler为AXI-slave接口,需要主机接口控制。
2.设置 PL 的时钟
3.复位设置
4.BRAM存储大小设置
三、编译并导出平台文件
请回顾往期文章。
四、搭建 Vitis-sdk 工程
1.创建 SDK Platform 工程
2.创建 bram_controller_test APP 工程
3.程序解析
void XBram_WriteReg(u32 BaseAddress, u32 RegOffset, u32 Data)
/****************************************************************************/
* Write a value to a BRAM register. A 32 bit write is performed.
* @param BaseAddress is the base address of the BRAM device register.
* @param RegOffset is the register offset from the base to write to.
* @param Data is the data written to the register.
****************************************************************************/
BRAM读函数:u32 XBram_ReadReg(u32 BaseAddress, u32 RegOffset)
/****************************************************************************/
* Read a value from a BRAM register. A 32 bit read is performed.
* @param BaseAddress is the base address of the BRAM device registers.
* @param RegOffset is the register offset from the base to read from.
* @return Data read from the register.
****************************************************************************/
五、实例程序
#include <stdio.h> // 标准输入输出库
#include "platform.h" // 平台相关函数库
#include "xil_printf.h" // Xilinx 打印函数库
#include "xbram.h" // BRAM 控制器驱动头文件
#include "xparameters.h" // 参数定义头文件
#define BRAM_DEVICE_ID XPAR_BRAM_0_DEVICE_ID // 定义 BRAM 设备 ID 宏
int main()
{
// 初始化平台
init_platform();
print("Hello World\n\r"); // 输出 "Hello World" 到控制台
XBram Bram; // 定义 BRAM 设备实例
XBram_Config *ConfigPtr; // 定义指向 BRAM 配置结构的指针
// 获取 BRAM 配置
ConfigPtr = XBram_LookupConfig(BRAM_DEVICE_ID);
if (ConfigPtr == NULL) {
xil_printf("Failed to find BRAM configuration\n\r");
return XST_FAILURE; // 配置获取失败,返回错误状态
}
// 初始化 BRAM 设备
int status = XBram_CfgInitialize(&Bram, ConfigPtr, ConfigPtr->CtrlBaseAddress);
if (status != XST_SUCCESS) {
xil_printf("Failed to initialize BRAM\n\r");
return XST_FAILURE; // 初始化失败,返回错误状态
}
// 向 BRAM 地址 0 到 24 写入数据,数据为 0 到 24
for (int i = 0; i < 25; i++) {
XBram_WriteReg(XPAR_BRAM_0_BASEADDR, i * 4, i); // 每次写入地址偏移增加 4 字节
}
print("write finish\n\r"); // 输出 "write finish" 到控制台
// 清理平台资源
cleanup_platform();
return 0; // 返回 0 表示程序执行成功
}
注:
1. 数据宽度
AXI4-Lite接口是32位宽度,也就是说,每次读取或写入的数据块大小是32位(4字节)。因此,每个地址单元跨度为4字节。
2. 地址映射
在BRAM中,内存地址是字节地址。假设你要写入连续的整数(如0, 1, 2, ...),每个整数占用4个字节的空间。为了避免数据重叠,你需要确保每次写入的地址间隔为4字节。
例如:
- 写入第一个整数0到地址0(0x00)。
- 写入第二个整数1到地址4(0x04)。
- 写入第三个整数2到地址8(0x08)。
六、调试验证
ILA读取BRAM-B口,0-99号地址,数据与实例程序中写函数输入0-24一致,且连续4个地址组成一个32bit的AXI-LITE数据。
总结
本期课程将介绍如何使用PS将查找表植入BRAM,并由PL进行读取,为后续的图像处理奠定基础。