给ZYNQ新手的第一个工程:用Vivado 2020.2和Vitis搞定串口打印Hello World
从零玩转ZYNQVivadoVitis串口通信全流程实战第一次接触ZYNQ平台时面对Vivado和Vitis这两大工具链很多嵌入式开发者都会感到无从下手。本文将手把手带你完成第一个可运行的ZYNQ工程——通过PS端UART实现Hello World打印。不同于简单的步骤罗列我们会深入每个操作背后的原理并标注新手容易踩坑的细节。无论你是刚接触FPGA-SoC的在校学生还是需要快速上手的工程师跟着这份指南操作90分钟内就能看到串口终端上跳出的第一个字符。1. 环境准备与工程创建工欲善其事必先利其器。在开始之前请确保你的开发环境满足以下要求硬件准备Xilinx ZYNQ系列开发板如ZC702、Zybo等USB转串口模块需确认兼容性配套电源和下载器软件版本Vivado Design Suite 2020.2内置Vitis串口终端工具Putty、Tera Term等提示虽然Vivado 2020.2不是最新版本但其稳定性和兼容性经过验证特别适合初学者。安装时注意勾选Vitis组件。创建新工程的步骤如下启动Vivado 2020.2点击Create Project项目类型选择RTL Project暂不添加源文件选择对应的ZYNQ芯片型号可在开发板手册中找到完成创建后进入主界面准备Block Design设计# 如需通过TCL命令创建工程可使用以下脚本 create_project hello_world ./hello_world -part xc7z020clg400-1 set_property board_part digilentinc.com:zybo-z7-20:part0:1.0 [current_project]2. ZYNQ处理器系统配置ZYNQ的核心优势在于PS处理系统和PL可编程逻辑的协同设计。本例中我们仅使用PS资源通过以下步骤完成基础配置2.1 添加并配置ZYNQ IP核在Block Design中点击Add IP搜索并添加ZYNQ7 Processing System双击IP核进入配置界面主要设置三个关键部分配置项参数说明典型值Clock Configuration设置CPU和总线时钟ARM PLL: 666.666MHzDDR Configuration选择开发板搭载的DDR型号MT41K256M16 RE-125MIO Configuration配置UART等外设的物理引脚MIO48/49 for UART1在Peripheral I/O Pins中启用UART1并确认MIO引脚与开发板原理图一致关闭未使用的外设如USB、以太网等以减少功耗2.2 硬件连接验证完成IP核配置后需要执行以下关键操作# 在Vivado TCL控制台可依次执行这些命令 validate_bd_design # 检查设计连接 generate_target all [get_files *.bd] # 生成输出产品 create_hdl_wrapper -force # 创建HDL包装文件注意如果仅使用PS端资源可以跳过管脚约束和比特流生成步骤直接导出硬件平台。3. Vitis软件开发环境搭建硬件设计完成后需要切换到Vitis进行软件开发。这个过渡环节往往是新手最容易困惑的地方。3.1 硬件平台导出在Vivado中选择File → Export → Export Hardware勾选Include bitstream本例中不需要指定XSA文件保存路径建议新建vitis文件夹存放3.2 创建应用工程启动Vitis后按以下步骤操作File → New → Application Project选择刚才导出的XSA文件作为硬件平台工程模板选择Empty Application在Board Support Package设置中确保包含以下驱动xilffs文件系统支持xilpm电源管理xilsecure安全功能// 检查BSP配置的常用TCL命令 setws [pwd] app create -name hello_world -hw [pwd]/system.xsa -proc ps7_cortexa9_0 -os standalone -template {Empty Application}4. UART通信代码实现在空工程中创建main.c文件实现串口打印功能。不同于标准C程序的printfZYNQ开发有特殊考量。4.1 基础代码结构#include xparameters.h // 硬件参数定义 #include xil_printf.h // Xilinx优化版打印函数 #include xil_io.h // 底层IO操作 int main() { // 初始化UART控制器BSP已自动配置 xil_printf(Hello World!\r\n); // 添加延时防止程序立即退出 volatile int delay; for(delay0; delay10000000; delay); return 0; }4.2 关键点解析xil_printf vs printfxil_printf是Xilinx提供的轻量级实现不依赖标准库更适合嵌入式环境若需使用标准printf需在BSP中启用stdout重定向到UART换行符处理\r\n是串口终端的标准换行格式仅使用\n可能导致显示错位4.3 调试技巧遇到问题时可以检查以下方面确认开发板UART引脚与MIO配置匹配检查串口终端波特率设置为115200确保USB转串口驱动已正确安装在Vitis中查看System Debugger输出5. 系统运行与结果验证完成代码编写后最后一步是上板验证。这个环节的小细节往往决定成败。5.1 程序烧录步骤右键工程选择Build Project连接开发板并上电在Run Configurations中创建新的硬件运行配置点击Run下载程序到DDR内存重要提示ZYNQ的PS端程序默认运行在DDR内存中断电后会丢失。如需固化程序需使用Flash编程器。5.2 串口终端设置推荐使用Vitis内置的串口终端工具点击Window → Show View → Serial Terminal选择正确的COM端口配置参数115200波特率8数据位无校验1停止位先打开串口连接再上电或复位开发板如果一切正常你将看到终端窗口不断打印Hello World!信息。第一次看到这行输出时那种成就感会让你觉得所有折腾都值得。6. 进阶扩展与性能优化完成基础功能后可以尝试以下增强实验添加PL端逻辑通过AXI GPIO控制LED闪烁使用中断机制实现串口数据接收启用双核处理在AMP模式下运行不同任务内存优化调整DDR控制器参数提升带宽// 双核通信示例需在BSP中启用OpenAMP #include openamp/open_amp.h void core0_entry() { xil_printf(Core 0 is running\r\n); } void core1_entry() { xil_printf(Core 1 is running\r\n); }记得保存工程所有文件良好的项目习惯从第一个工程就要养成。建议采用如下目录结构/hello_world /vivado # Vivado工程文件 /vitis # 软件开发目录 /doc # 设计文档 /constraints # 约束文件后续使用