ZYNQ系列教程 之 AXI BRAM Controler

免责声明:

本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下,作者不对因使用本文内容而导致的任何直接或间接损失承担责任,包括但不限于数据丢失、业务中断或其他经济损失。

读者在使用本文信息时,应自行验证其准确性和适用性,并对其使用结果负责。本文内容不构成专业技术咨询或建议,具体的技术实现和应用应根据实际情况和需要进行详细分析和验证。

本文所涉及的任何商标、版权或其他知识产权均属于其各自的所有者。若本文中引用了第三方的资料或信息,引用仅为学术交流目的,不构成对第三方内容的认可或保证。

若有任何疑问或需进一步信息,请联系本文作者或相关专业人士。

目录

前言

一、系统架构

二、搭建 SOC 系统工程

1.设置 PS GP Master 接口:

2.设置 PL 的时钟

3.复位设置

三、编译并导出平台文件

四、搭建 Vitis-sdk 工程

1.创建 SDK Platform 工程

2.创建 bram_controller_test APP 工程

3.程序解析

五、实例程序

注:

1. 数据宽度

2. 地址映射

六、调试验证

总结



前言

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进行读取,为后续的图像处理奠定基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值