1. 开发环境准备搭建zc706与ad9361fmcomms5开发环境的第一步是准备好必要的软硬件工具。我建议从官方渠道获取最新资源这样可以避免很多兼容性问题。硬件方面需要准备Xilinx zc706开发板和ADI的fmcomms5射频模块这是整个系统的核心。软件工具链主要包含Vivado设计套件和SDK开发环境我这里用的是2018.3版本因为这个版本经过验证与ad9361驱动兼容性最好。在开始之前建议先检查下电脑配置是否满足要求。Vivado对系统资源消耗较大至少需要16GB内存和100GB可用磁盘空间。我遇到过不少初学者因为电脑配置不足导致编译失败的情况。另外记得安装USB转串口驱动这个在后面调试阶段会用到。操作系统推荐使用64位的Windows 10或者Ubuntu 16.04/18.04 LTS这两个系统我都实测过稳定性有保障。1.1 安装Vivado 2018.3Vivado的安装过程需要注意几个关键点。首先下载Xilinx Unified Installer 2018.3选择Vivado HL Design Edition就够用了没必要安装完整版。在组件选择页面一定要勾选Zynq-7000和Software Development Kit这两个选项。安装路径最好不要有中文和空格我习惯直接装在C:\Xilinx\Vivado\2018.3这样的路径下。安装完成后需要申请license。ADI官方提供了针对ad9361的定制license文件建议直接使用这个而不是Xilinx的评估版license。我曾经因为使用评估版license导致部分IP核无法正常使用耽误了不少调试时间。license文件下载后放到Vivado安装目录的\Vivado\2018.3\data\licenses文件夹即可。1.2 获取官方参考设计ADI官方提供了完整的参考设计包括HDL硬件描述文件和no_os驱动程序。HDL代码可以从Analog Devices的GitHub仓库下载建议选择hdl-hdl_2019_r1这个tag版本它与Vivado 2018.3配合最稳定。no_os代码则选择no-OS-2019_R1版本这两个版本是经过ADI官方测试验证的黄金组合。下载完成后建议将代码存放在英文路径下我通常会在D盘创建AD9361_Project这样的工作目录里面再分别建立hdl和no_os子文件夹存放对应代码。记得检查下载的文件完整性有时候网络问题会导致压缩包损坏。解压后可以对比下文件大小hdl完整包应该在500MB左右no_os大约50MB。2. Vivado工程配置有了基础环境后接下来就是创建Vivado工程。这里我推荐直接使用ADI提供的Makefile来自动生成工程这比手动创建要高效得多。打开命令提示符切换到hdl/projects/fmcomms5/zc706目录下运行make命令。这个过程可能需要10-30分钟取决于电脑性能。2.1 工程生成与检查Make执行完成后会在当前目录下生成vivado_proj文件夹里面包含了完整的工程文件。用Vivado 2018.3打开projects/fmcomms5/zc706/fmcomms5_zc706.xpr工程文件。第一次打开时Vivado会进行初始化这个过程可能会提示一些警告信息只要不是错误都可以暂时忽略。工程加载完成后我习惯先检查下IP核状态。在Flow Navigator面板点击IP Status确保所有IP核都显示Locked状态。如果有IP核显示Upgrade Available千万不要升级保持原有版本即可。我曾经因为手贱升级了某个IP核导致后续SDK编译失败不得不重新生成整个工程。2.2 硬件配置与生成确认IP核状态正常后接下来生成硬件描述文件。点击Generate Bitstream这个过程会执行综合、实现和比特流生成三个步骤。在低配电脑上可能需要2-3小时建议吃饭前开始。如果遇到时序违例警告可以先尝试重新运行Implementation有时候第二次跑就能通过。比特流生成完成后别忘了导出硬件描述文件。点击File → Export → Export Hardware勾选Include bitstream选项导出路径建议选择工程目录下的sdk文件夹。这个文件包含了Zynq处理器的硬件配置信息是后续SDK开发的基础。3. SDK工程创建有了硬件描述文件后就可以开始准备软件开发环境了。在Vivado界面点击Launch SDK这会自动启动Xilinx SDK 2018.3并加载刚才导出的硬件平台。3.1 创建应用工程在SDK中首先需要创建一个新的应用工程。点击File → New → Application Project工程名可以命名为AD9361_Test。在Target Hardware页面选择刚才导出的硬件平台在Templates页面选择Empty Application。我建议把工程创建在vivado_proj/fmcomms5_zc706.sdk目录下这样所有文件都在一个位置管理起来更方便。工程创建完成后需要将no_os驱动程序导入到工程中。解压之前下载的no_os代码将ad9361/sw文件夹下的所有文件复制到SDK工程的src目录下。这里有个小技巧先在SDK中删除自动生成的helloworld.c文件然后再粘贴新文件这样可以避免文件冲突。3.2 代码配置与编译接下来需要修改config.h文件来适配我们的硬件平台。打开src/config.h找到平台定义部分取消XILINX_PLATFORM和FMCOMMS5的注释其他平台的定义保持注释状态。同时根据实际需求启用相应的示例代码比如ADC_DMA_EXAMPLE和DAC_DMA_EXAMPLE。配置完成后点击Project → Build All开始编译。第一次编译可能会报缺少头文件的错误这是因为路径设置问题。右键点击工程选择Properties在C/C Build → Settings → Tool Settings中添加no_os代码的include路径。通常需要添加以下路径no_os/ad9361/swno_os/common/swno_os/platform/xilinx4. 固件生成与固化编译通过后就可以生成最终的可执行文件了。在SDK中右键点击工程选择Create Boot Image这会启动Boot Image生成向导。4.1 准备启动文件需要准备三个关键文件来生成boot.bin工程编译生成的AD9361.elf文件zynq_fsbl.elf在SDK的Create Boot Image向导中自动生成Vivado生成的system_top.bit文件建议新建一个boot_img文件夹专门存放这些文件。在Boot Image向导中依次添加上述三个文件注意添加顺序必须是zynq_fsbl.elf → system_top.bit → AD9361.elf。输出格式选择bin输出路径选择刚才创建的boot_img文件夹。4.2 Flash固化步骤最后一步是将生成的boot.bin文件固化到开发板的QSPI Flash中。将zc706开发板通过USB线与电脑连接确保跳线设置为QSPI启动模式具体跳线位置参考zc706用户手册。在SDK中选择Xilinx Tools → Program Flash在配置界面需要注意几个关键参数Flash Type选择qspi-x8-dual_parallelImage File选择刚才生成的boot.binFSBL File选择zynq_fsbl.elf点击Program开始烧写这个过程大约需要2-3分钟。烧写完成后将开发板断电再重新上电程序就会从Flash自动加载运行了。可以通过串口终端查看启动日志正常应该能看到AD9361初始化的相关信息。5. 常见问题排查在实际操作过程中可能会遇到各种问题。这里分享几个我遇到过的典型问题及解决方法。5.1 比特流生成失败最常见的问题是时序违例导致比特流生成失败。这种情况下可以尝试以下步骤在Vivado中打开Implemented Design查看时序报告如果只有少量违例可以尝试放宽时序约束检查时钟设置是否正确特别是ad9361的参考时钟实在不行就重新运行Implementation有时候第二次就能通过5.2 SDK编译错误SDK编译时可能会遇到各种头文件找不到的问题。除了前面提到的路径设置外还需要注意确保所有文件使用UTF-8编码特别是从GitHub下载的代码检查文件名大小写Linux环境下对大小写敏感清理工程后重新编译有时候中间文件会导致奇怪的问题5.3 硬件连接问题如果程序烧写后开发板没有反应首先检查硬件连接确认电源指示灯正常检查JTAG和UART连接是否可靠测量板上各路电源电压是否正常尝试用SDK直接调试运行排除Flash问题6. 进阶调试技巧当基础功能调通后可能需要更深入的调试。这里介绍几个实用的调试方法。6.1 使用ILA抓取信号Vivado集成了ILAIntegrated Logic Analyzer工具可以实时抓取FPGA内部信号。使用方法在Vivado中打开网表设计标记需要观察的信号插入ILA IP核并重新生成比特流在硬件管理器中设置触发条件并捕获波形这个功能在调试AD9361的SPI接口时特别有用可以直观地看到配置寄存器的读写过程。6.2 利用串口调试no_os代码中内置了丰富的调试信息输出功能。通过修改config.h中的宏定义可以控制不同级别的调试信息输出。建议开发阶段启用所有调试信息量产时再关闭。串口终端配置参数通常是波特率115200数据位8停止位1无校验6.3 性能优化建议当系统运行稳定后可以考虑进行性能优化优化DMA缓冲区大小减少中断频率调整SPI时钟速率提高配置速度启用ARM核的缓存功能优化数据搬运流程减少内存拷贝这些优化措施可以让射频性能提升10%-30%具体效果取决于应用场景。