Zynq FPGA UART程序固化完整流程文档

一、概述

本文档详细记录了将UART循环打印程序固化到Zynq FPGA开发板的完整流程。通过FSBL(First Stage Boot Loader)引导程序,实现上电后自动运行UART打印程序。

二、固化前准备

2.1 硬件准备

  • Zynq开发板(如ZedBoard、ZCU102等)
  • USB-JTAG下载器
  • USB转串口线
  • 存储介质(SD卡或QSPI Flash)
  • 电源适配器

2.2 软件准备

  • Vivado Design Suite(包含Vitis)
  • 串口调试助手(如Putty、SecureCRT)
  • 硬件描述文件(.xsa文件)

三、文件系统结构

3.1 所需文件清单

text

固化项目/ ├── fsbl_platform/ # FSBL平台工程 ├── uart_app/ # UART应用程序工程 ├── hardware/ │ └── system.bit # 硬件比特流文件 └── output/ ├── fsbl.elf # FSBL引导程序 ├── uart_app.elf # UART应用程序 ├── system.bit # 硬件比特流 ├── boot.bif # 引导镜像描述文件 └── boot.bin # 最终固化文件

3.2 文件说明

文件名后缀作用来源
fsbl.elf.elf第一阶段引导程序Vitis生成
uart_app.elf.elfUART应用程序Vitis编译
system.bit.bit硬件配置比特流Vivado导出
boot.bif.bif引导镜像描述文件手工创建
boot.bin.bin最终固化文件bootgen生成

四、详细操作步骤

4.1 步骤1:创建FSBL引导程序

4.1.1 在Vitis中创建Platform Project
  1. 打开Vitis软件
  2. File → New → Platform Project
  3. 输入项目名称:fsbl_platform
  4. 选择硬件描述文件(.xsa文件)
  5. 点击Finish
4.1.2 编译FSBL
  1. 在Project Explorer中右键点击fsbl_platform
  2. 选择Build Project
  3. 等待编译完成
4.1.3 获取fsbl.elf文件

编译完成后,文件位于:

text

fsbl_platform/export/fsbl_platform/sw/fsbl_platform/boot/fsbl.elf

4.2 步骤2:创建UART应用程序

4.2.1 创建Application Project
  1. File → New → Application Project
  2. 项目名称:uart_app
  3. 选择平台:fsbl_platform
  4. 选择模板:Hello World(自动生成main.c)
  5. 点击Finish
4.2.2 替换代码
  1. 打开 uart_app/src/main.c
  2. 删除原有代码,粘贴以下UART测试代码:

c

#include <stdio.h> #include "xil_printf.h" #include "xil_types.h" #include "xparameters.h" #include "xuartps.h" // 全局变量 XUartPs UartInst; u8 data_buffer[64]; u32 counter = 0; // 初始化UART int init_uart() { XUartPs_Config *Config; int Status; // 查找UART配置 Config = XUartPs_LookupConfig(XPAR_PS7_UART_0_DEVICE_ID); if (Config == NULL) { return XST_FAILURE; } // 初始化UART Status = XUartPs_CfgInitialize(&UartInst, Config, Config->BaseAddress); if (Status != XST_SUCCESS) { return XST_FAILURE; } // 设置波特率115200 XUartPs_SetBaudRate(&UartInst, 115200); // 自检 Status = XUartPs_SelfTest(&UartInst); if (Status != XST_SUCCESS) { return XST_FAILURE; } return XST_SUCCESS; } // 主函数 int main() { int i; // 初始化UART if (init_uart() != XST_SUCCESS) { return -1; } // 发送启动信息 XUartPs_Send(&UartInst, (u8*)"\r\n=== UART Test Application ===\r\n", 34); XUartPs_Send(&UartInst, (u8*)"Starting continuous transmission...\r\n", 39); // 主循环 while (1) { // 填充数据 for (i = 0; i < 64; i++) { data_buffer[i] = (counter + i) & 0xFF; } counter++; // 发送数据 XUartPs_Send(&UartInst, data_buffer, 64); // 发送换行 XUartPs_Send(&UartInst, (u8*)"\r\n", 2); // 延时约1秒 for (i = 0; i < 10000000; i++); } return 0; }

4.2.3 验证链接地址
  1. 打开 uart_app/lscript.ld 链接脚本
  2. 确认关键配置:ldMEMORY { ps7_ddr_0 : ORIGIN = 0x00100000, LENGTH = 0x1FF00000 /* ... */ } .text : { *(.text) } > ps7_ddr_0 /* 确保.text段在DDR中 */
  3. 关键点:应用程序起始地址必须是 0x00100000
4.2.4 编译应用程序
  1. 右键点击 uart_app 项目
  2. 选择 Build Project
  3. 验证编译成功(无错误)

4.3 步骤3:验证应用程序地址

4.3.1 方法一:使用objdump命令

bash

# 在Vitis Terminal中执行 arm-none-eabi-objdump -h uart_app.elf | grep ".text"

正确输出示例

text

.text 00000500 00100000 00100000 00001000 2**2

关键检查:第三列(VMA)必须是 00100000

4.3.2 方法二:查看.map文件
  1. 打开 uart_app/Debug/uart_app.map
  2. 搜索 .text 查看地址

4.4 步骤4:生成BOOT.BIN文件

4.4.1 准备三个必需文件
  1. fsbl.elf - 从FSBL项目复制
  2. system.bit - 从Vivado硬件工程导出
  3. uart_app.elf - 从UART项目编译得到

将三个文件复制到同一目录(如 output/

4.4.2 创建BIF描述文件

在 output/ 目录下创建 boot.bif 文件,内容:

text

the_ROM_image: { [bootloader] fsbl.elf system.bit uart_app.elf }

4.4.3 生成BOOT.BIN

方法A:使用Vitis GUI

  1. 菜单栏:Xilinx → Create Boot Image
  2. 点击 Add 依次添加:
    • fsbl.elf(类型选择 bootloader
    • system.bit
    • uart_app.elf
  3. 设置输出路径
  4. 点击 Create Image

方法B:使用命令行

bash

cd output bootgen -image boot.bif -arch zynq -o boot.bin -w on

4.4.4 验证生成结果
  • 生成的文件:boot.bin
  • 文件大小:约3-5MB
  • 如果失败,检查文件顺序和类型设置

4.5 步骤5:烧写到存储设备

4.5.1 方法一:SD卡启动(测试用)
  1. 格式化SD卡为FAT32格式
  2. 复制boot.bin到SD卡根目录
  3. 设置开发板为SD卡启动模式(跳线设置)
  4. 插入SD卡,连接串口线
  5. 上电启动
4.5.2 方法二:QSPI Flash固化(永久)
  1. 连接JTAG和串口线
  2. 打开Vivado → Hardware Manager
  3. Open Target → Auto Connect
  4. 右键开发板 → Add Configuration Memory Device
  5. 选择Flash型号(常见:mt25ql256aba
  6. 选择 boot.bin 文件
  7. 点击 Program,等待完成
  8. 重要:烧写完成后
    • 断开JTAG
    • 关闭电源
    • 设置为QSPI启动模式
    • 重新上电

4.6 步骤6:测试验证

4.6.1 串口设置
  • 串口软件:Putty/SecureCRT
  • 波特率:115200
  • 数据位:8
  • 停止位:1
  • 校验位:None
  • 流控制:None
4.6.2 预期输出

上电后串口应输出:

text

=== UART Test Application === Starting continuous transmission... [然后是连续的十六进制数据]

4.6.3 成功标志
  • 上电后自动运行,无需JTAG
  • 串口连续输出数据
  • 断电重启后仍然正常运行

五、故障排除

5.1 常见问题及解决

问题现象可能原因解决方案
无串口输出波特率不匹配检查串口设置为115200
卡在FSBL阶段应用程序地址错误验证.elf文件起始地址为0x00100000
程序不运行BIN文件生成顺序错误确保顺序:fsbl → bit → app
启动失败启动模式设置错误检查开发板跳线设置
部分运行后停止堆栈大小不足修改链接脚本增加堆栈空间

5.2 调试技巧

5.2.1 添加调试信息

在应用程序开头添加:

c

// 在main函数开始处 XUartPs_Send(&UartInst, (u8*)"App Started!\r\n", 14);

5.2.2 验证硬件连接

c

// 强制发送测试字符 volatile u32 *uart = (u32*)0xE0001000; *uart = 'A';

5.3 关键检查点清单

  • FSBL编译成功(fsbl.elf存在)
  • 应用程序编译成功(uart_app.elf存在)
  • 应用程序起始地址为0x00100000
  • boot.bif文件顺序正确
  • boot.bin生成成功
  • SD卡为FAT32格式
  • boot.bin在SD卡根目录
  • 开发板启动模式正确
  • 串口波特率115200
  • 串口线TX/RX连接正确

六、进阶配置

6.1 修改启动延时

在FSBL中可修改启动延时,给用户中断引导的机会:

c

// 在fsbl_main.c中添加 int timeout = 3; // 3秒延时 while (timeout-- > 0 && !CheckUartInput()) { fsbl_printf("Booting in %d seconds...\r\n", timeout); Delay(1000); }

6.2 多应用程序支持

可通过修改FSBL实现多应用程序选择:

c

// 根据按键选择不同应用 if (ReadBootPin() == 0) { // 启动UART测试程序 HandoffAddress = 0x00100000; } else { // 启动其他应用程序 HandoffAddress = 0x00200000; }

6.3 安全性增强

  • 添加应用程序校验和验证
  • 实现安全启动流程
  • 加密固件保护

七、注意事项

7.1 重要提醒

  1. 不要修改FSBL的跳转逻辑,除非你完全理解其工作原理
  2. 应用程序不能使用地址0x00000000-0x000FFFFF区域(FSBL使用)
  3. 固化前务必先用SD卡测试,确认程序能正常运行
  4. QSPI Flash烧写后必须断电重启,不能热复位

7.2 文件管理建议

  1. 保留每个版本的.elf和.bin文件
  2. 记录每次固化的配置参数
  3. 使用版本控制系统管理源码

7.3 性能优化

  1. 减少启动时间:优化应用程序初始化代码
  2. 减小固件大小:移除不必要的库和代码
  3. 提高可靠性:添加看门狗和错误恢复机制

八、附录

8.1 相关命令参考

bash

# 查看ELF文件信息 arm-none-eabi-objdump -h file.elf arm-none-eabi-readelf -a file.elf # 生成反汇编代码 arm-none-eabi-objdump -d file.elf > disassembly.txt # 查看文件大小 arm-none-eabi-size file.elf

8.2 常用内存地址

地址范围用途说明
0x00000000-0x0003FFFFFSBL区域引导程序使用
0x00100000-0x001FFFFF应用程序区主程序放置位置
0xE0000000-0xE00FFFFF外设寄存器UART、GPIO等

8.3 开发板启动模式设置

开发板SD卡模式QSPI模式JTAG模式
ZedBoardMIO5-0: 111010MIO5-0: 000010MIO5-0: 111111
ZCU102SW6: 000010SW6: 001010SW6: 111111
PYNQ-Z2J12: SD模式J12: QSPI模式J12: JTAG模式

文档版本: 1.0
最后更新: 2026年01月
适用平台: Xilinx Zynq-7000系列
注意事项: 本流程基于Vitis 2019.2版本,其他版本可能略有差异

Read more

LM Studio模型加载全攻略:从格式识别到本地部署(支持LLaMA/Mistral等主流模型)

LM Studio模型加载全攻略:从格式识别到本地部署(支持LLaMA/Mistral等主流模型) 在开源大模型生态中,本地部署已成为开发者探索AI能力的重要方式。LM Studio作为一款轻量级模型运行环境,以其简洁的交互界面和对多种架构的支持,逐渐成为个人开发者的首选工具。本文将深入剖析模型加载的全流程,从文件格式解析到实战部署技巧,帮助您避开常见陷阱,高效运行各类主流大模型。 1. 模型格式深度解析 LM Studio对模型格式的支持并非一刀切,不同格式在性能、兼容性和功能完整性上存在显著差异。当前主流格式可分为三类: GGUF格式 作为llama.cpp生态的专有格式,GGUF已成为LM Studio的黄金标准。其优势体现在: * 量化支持:内置从2bit到8bit的多级量化方案(如q4_K_M表示4bit中精度量化) * 跨平台一致性:同一模型文件可在Windows/macOS/Linux无缝运行 * 内存映射:支持部分加载,降低内存占用 GPTQ格式 基于TensorRT的量化方案,特点包括: * 仅部分架构支持(如LLaMA-1/2、Mistral

Stable Diffusion XL 1.0开源大模型实战:灵感画廊GPU显存友好型部署指南

Stable Diffusion XL 1.0开源大模型实战:灵感画廊GPU显存友好型部署指南 "见微知著,凝光成影。将梦境的碎片,凝结为永恒的视觉诗篇。" 你是否曾经梦想过拥有一个属于自己的艺术创作空间?一个不需要复杂技术背景,只需轻轻描述心中所想,就能让AI帮你将梦境转化为精美画作的地方?今天我要介绍的"灵感画廊"就是这样一个神奇的工具。 基于Stable Diffusion XL 1.0打造,这个创作终端不仅技术强大,更重要的是它极其友好——无论是对创作者还是对你的电脑硬件。即使只有8GB显存的GPU,也能流畅运行,生成1024x1024高清画质。接下来,我将手把手带你搭建这个艺术创作空间。 1. 环境准备与快速部署 在开始之前,我们先来看看需要准备什么。整个过程比想象中简单很多,不需要复杂的配置,只需要几个简单的步骤。 1.1 系统要求与依赖安装 首先确保你的环境满足以下要求: * NVIDIA显卡(建议8GB以上显存) * Python 3.8或更高版本

深度解析 GitHub Copilot Agent Skills:如何打造可跨项目的 AI 专属“工具箱”

前言 随着 GitHub Copilot 从单纯的“代码补全”工具向 Copilot Agent(AI 代理) 进化,开发者们迎来了更高的定制化需求。我们不仅希望 AI 能写代码,更希望它能理解团队的特殊规范、掌握内部工具的使用方法,甚至在不同的项目中复用这些经验。 Agent Skills(代理技能) 正是解决这一痛点的核心机制。本文将深入解析 Copilot Skills 的工作原理,并分享如何通过软链接(Symbolic Link)与自动化工作流,构建一套高效的个人及团队知识库。 一、 什么是 Agent Skills? 如果说 Copilot 是一个通用的“AI 程序员”,那么 Skill(技能) 就是你为它配备的专用工具箱。 它不仅仅是一段简单的提示词(Prompt),而是一个包含元数据、指令和执行资源的标准文件夹结构。当

【AIGC实战】蓝耘元生代部署通义万相2.1文生视频,up主亲测好用~

【AIGC实战】蓝耘元生代部署通义万相2.1文生视频,up主亲测好用~

文章目录 * 👏什么是文生视频? * 👏通义万相2.1文生视频 * 👏开源仓库代码 * 👏蓝耘元生代部署通义万相2.1文生视频 * 👏平台注册 * 👏部署通义万相2.1文生视频 * 👏使用通义万相2.1文生视频 * 👏总结 👏什么是文生视频? 文生视频(Text-to-Video)是利用人工智能技术,通过文本描述生成视频内容的一种创新技术。类似于图像生成技术,文生视频允许用户通过输入简单的文本描述,AI模型会自动将其转化为动态视频。这种技术广泛应用于创作、广告、教育等领域,为内容创作者提供了新的创作方式和灵感。 👏通义万相2.1文生视频 IT之家 1 月 10 日消息,阿里旗下通义万相宣布推出 2.1 版本模型升级,视频生成、图像生成两大能力均有显著提升。 在视频生成方面,通义万相 2.1 通过自研的高效 VAE 和 DiT 架构增强了时空上下文建模能力,支持无限长 1080P 视频的高效编解码,