来源:Fisher Yang,来源:FPGA FAE技术分享选集
RF Data Converters驱动API是AMD Xilinx为RFSoC提供的一套软件接口,用于控制Data Converters(RF-ADC和RF-DAC)的硬件功能。它作为用户应用程序与底层硬件寄存器之间的抽象层,封装了复杂的配置流程和时序控制,使开发者能够通过函数调用直接管理射频信号链的关键参数。
RF Data Converters驱动API在绝大多数实际应用场景中是必须的,尤其是在需要动态控制、多设备同步或复杂校准的场景。虽然理论上系统参数完全静态不变(例如仅需一次初始化且无需动态调整)或者通过直接寄存器操作可以不用API,但缺点是代码可维护性差、无法适应需求变更、且同步功能难以实现,显著增加开发难度、调试风险和后期维护成本。对于基于RFSoC的射频系统开发,掌握并合理使用驱动API是高效、可靠实现设计目标的必要前提。
一、RFDC API介绍
驱动程序由以下文件组成:
• API
xrfdc.c : 此文件中实现了用户接口API函数。
xrfdc.h : 此文件中提供了用户接口API原型。该文件提供了驱动程序实例结构的原型,以及 API中使用的所有其他结构的原型。该文件实现了实用的内联函数用于访问驱动程序和IP中的各种数据。
xrfdc_mts.c : 该文件实现了多Tile同步API函数。
xrfdc_mixer.c : 该文件实现了混频器API函数。
xrfdc_clock.c : 该文件实现了与时钟相关的API函数。
xrfdc_mb.c : 该文件实现了多频段API函数。
xrfdc_dp.c : 该文件实现了数字路径API函数。
xrfdc_sinit.c : 该文件实现了初始化API函数。
•硬件寄存器映射
xrfdc_hw.h : 该文件提供了硬件寄存器映射的定义。同时,该文件还
提供了Zynq UltraScale+ RFSoC寄存器接口中各相关字段的掩码。
• 中断处理
xrfdc_intr.c : 实现了处理 IP 核各类中断和错误的函数。
关于RFDC的API函数、数据结构等详细介绍可以参考Xilinx的PG269文档。
在大规模MIMO通信、相控阵雷达、多芯片级联扩展等应用中需要多Tile的ADC、DAC严格对齐同步。在RF Data Converters启动时,同一Tile内的转换器始终是对齐的,但不能保证确定的延时。在多Tile系统中,不能保证具有确定的延时,甚至不能保证跨Tile的延时对齐。这需要我们必须提供一种机制来对齐这些Tile。RFSoC多Tile同步通过硬件时钟信号SYSREF与驱动API共同实现,确保跨Tile/芯片的时钟与数据严格对齐。这里我们以实现多个Tile之间的同步为例来介绍RFDC API的使用。
1. 参照前面RFDC IP设计文章,在Vivado里配置好RFDC IP后生成bit文件,然后导出xsa文件;
2. 在Vitis里选择Vivado设计生成的xsa新建一个平台项目,选择standalone,处理器选cortexa53,然后单击完成;
3. 修改平台BSP的设置,勾选libmetal库,然后单击OK;
4. 选择刚刚创建的平台新建一个空的应用程序;
5. 将Vitis安装路径data/embeddedsw
/XilinxProcessorIPLib/drivers/rfdc_v11_1/examples文件夹下的xrfdc_mts_example.c导入到应用程序中;
6. 由于是裸机工程,在刚刚导入的xrfdc_mts_example.c中添加宏定义:#define __BAREMETAL_;
7. Build工程,连接板子加载程序调试看是否打印了Successfully ran MTS Example,打印了说明多tile同步成功。然后可以去观察硬件adc、dac的延时对齐效果了。
Petalinux操作系统中RFDC API使用跟裸机步骤差不多,但是要注意的是在进行debug时要是出现SDK hangs when it attempts to run metal_init时,网上有通过加驱动库的方式来解决,但是还会出现如下报错:
其实只要不勾选Auto-attach Process children就能解决该问题。