前言
ZYNQ 系列芯片作为 Xilinx(现 AMD)推出的异构可编程片上系统(SoC),将 ARM 架构的处理系统(PS)与 FPGA 的可编程逻辑(PL)无缝融合,在工业控制、图像处理、人工智能、航空航天等领域具有不可替代的优势。本学习计划结合 20 年嵌入式与导引头系统研发经验,以国内视频网站资源为核心,构建 "单片机基础→ZYNQ 核心知识→硬件系统设计→项目实战" 的阶梯式学习体系,涵盖从零基础到工程应用的全流程,配套详细的学习内容、资源链接与实操要求,总字数超 10 万字,助力学习者系统性掌握 ZYNQ 技术栈。
学习总纲
核心目标
- 掌握单片机(51/STM32)底层原理与编程方法,建立嵌入式开发思维
- 精通 ZYNQ-7000/UltraScale + 系列芯片架构,实现 PS 与 PL 协同开发
- 掌握嵌入式 Linux 系统(PetaLinux)定制、驱动开发与应用编程
- 具备 ZYNQ 硬件系统设计能力,包括原理图绘制、PCB 布局与信号完整性优化
- 能够独立完成工业级 ZYNQ 项目开发,涵盖图像处理、工业控制、AI 加速等场景
学习周期
总计 12 个月,分为 4 个阶段:
- 入门阶段(第 1-2 月):单片机基础与数字电路复习
- 基础阶段(第 3-5 月):ZYNQ 架构与裸机开发、硬件基础
- 进阶阶段(第 6-9 月):嵌入式 Linux 开发、PL 高级编程与硬件设计
- 实战阶段(第 10-12 月):综合项目开发与工程优化
必备工具与硬件
- 硬件平台
- 入门:STC89C52 开发板(51 单片机)、STM32F103 开发板(如正点原子 Mini 板)
- 进阶:ZYNQ-7020 开发板(如正点原子 ZYNQ 开发板、ALINX AX7020)
- 实战:ZYNQ UltraScale + 开发板(如 KV260)、外设模块(OV5640 摄像头、HDMI 显示器、DDR3 模块)
- 软件工具
- 单片机开发:Keil uVision5、STM32CubeMX
- ZYNQ 开发:Vivado 2022.2/Vitis 2025、Petalinux 2022.2
- 硬件设计:Altium Designer 22、Cadence Allegro、PSPICE
- 辅助工具:MATLAB(算法仿真)、VS Code(代码编辑)、串口调试助手
核心学习资源平台
- B 站(哔哩哔哩):免费视频课程与项目实战教程
- 正点原子在线平台:https://www.yuanzige.com(ZYNQ 系统教程)
- 达尔闻:https://darwinlearns.com(ZYNQ 入门到实战)
- 电子发烧友网:https://www.elecfans.com(硬件设计与调试资源)
- CSDN/EEWorld:技术博客与文档补充
第一阶段:入门阶段(第 1-2 月)------ 单片机基础与数字电路复习
第 1 月:51 单片机基础(嵌入式入门基石)
第 1 周:51 单片机核心概念与开发环境搭建
周一:嵌入式系统与 51 单片机概述
- 学习内容:
- 嵌入式系统定义、组成与应用场景(工业控制、消费电子、航空航天)
- 51 单片机发展历程与核心优势(结构简单、成本低、资料丰富)
- STC89C52RC 芯片引脚功能(VCC、GND、I/O 口、复位引脚、晶振引脚)
- 视频资源:
- B 站《51 单片机入门到精通》(金沙滩电子)P1-P3:https://www.bilibili.com/video/BV1Mb411e7re/
- 郭天祥《新概念 51 单片机 C 语言教程》P1-P2:https://www.bilibili.com/video/BV1Ks411579J/
- 实操任务:
- 查阅 STC89C52RC 数据手册(中文),绘制引脚功能表
- 识别开发板上的核心元件(单片机、晶振、复位电路、LED)
周二:开发环境搭建与 Hello World 实现
- 学习内容:
- Keil uVision5 安装与配置(器件选择、编译选项设置)
- 单片机程序下载流程(STC-ISP 烧录工具使用)
- 第一个 C 语言程序结构(main 函数、头文件包含、关键字说明)
- 视频资源:
- B 站《51 单片机入门到精通》(金沙滩电子)P4-P5:https://www.bilibili.com/video/BV1Mb411e7re/
- 正点原子《51 单片机基础教程》P6:https://space.bilibili.com/394620890/video
- 实操任务:
- 安装 Keil uVision5 与 STC-ISP,配置 STC89C52RC 编译环境
- 编写程序实现串口打印 "Hello 51 MCU",通过串口助手查看结果
周三:51 单片机最小系统设计原理
- 学习内容:
- 最小系统组成(电源电路、时钟电路、复位电路)
- 电源电路设计:3.3V/5V 供电方案与滤波电容选型
- 时钟电路:11.0592MHz 晶振与 22pF 匹配电容作用
- 复位电路:上电复位与手动复位原理
- 视频资源:
- B 站《51 单片机最小系统详解》:https://www.bilibili.com/video/BV1jt411g73X/
- 电子发烧友网《51 单片机硬件基础》P3:https://www.elecfans.com/video/1005441.html
- 实操任务:
- 绘制 51 单片机最小系统原理图(使用 Altium Designer)
- 测量开发板复位引脚电压波形,验证复位功能
周四:GPIO 端口原理与 LED 控制
- 学习内容:
- GPIO 端口内部结构(准双向口、推挽输出、开漏输出)
- 寄存器操作:P0-P3 端口寄存器(P0、P0_0、P1 等)
- 位操作与字节操作的区别(sbit 定义与直接赋值)
- 视频资源:
- B 站《51 单片机 GPIO 原理与 LED 控制》:https://www.bilibili.com/video/BV1c441187cM/
- 郭天祥《十天学会 51 单片机》P3:https://www.bilibili.com/video/BV1Ws411b75N/
- 实操任务:
- 编写程序实现 LED 闪烁(周期 1 秒),使用循环延时函数
- 实现 LED 流水灯效果,从左到右依次点亮(8 个 LED)
周五:延时函数与按键输入
- 学习内容:
- 循环延时原理(机器周期、指令周期计算)
- 按键输入电路设计(上拉电阻的作用)
- 按键消抖方法(软件消抖与硬件消抖)
- 视频资源:
- B 站《51 单片机延时函数与按键控制》:https://www.bilibili.com/video/BV1q4411D7dD/
- 金沙滩电子《按键消抖实战》P7:https://www.bilibili.com/video/BV1Mb411e7re/
- 实操任务:
- 编写精确延时函数(1ms、10ms、1s),通过示波器验证
- 实现按键控制 LED:按一次点亮,再按一次熄灭(消抖处理)
周六:数码管显示原理
- 学习内容:
- 数码管结构(共阴极与共阳极区别)
- 静态显示与动态扫描显示原理
- 段码表与位码表设计(0-9 数字显示)
- 视频资源:
- B 站《51 单片机数码管显示教程》:https://www.bilibili.com/video/BV1W4411y7gw/
- 正点原子《51 单片机外设教程》P9:https://space.bilibili.com/394620890/video
- 实操任务:
- 实现数码管静态显示 "5"
- 实现动态扫描显示 "1234"(4 位数码管)
周日:周总结与知识梳理
- 复习内容:
- 51 单片机最小系统组成与原理
- GPIO 输入输出操作与寄存器配置
- 延时函数、按键控制与数码管显示
- 测试任务:
- 设计综合程序:按键控制数码管计数(按一次加 1,满 10 归 0)
- 撰写学习笔记,整理核心知识点与问题
第 2 周:51 单片机中断系统与定时器
周一:中断系统基础概念
- 学习内容:
- 中断定义与优势(提高 CPU 效率、实时响应事件)
- 51 单片机中断源(外部中断 0/1、定时器 0/1 中断、串口中断)
- 中断优先级与中断嵌套原理
- 视频资源:
- B 站《51 单片机中断系统详解》:https://www.bilibili.com/video/BV1x4411J7aM/
- 郭天祥《中断原理与应用》P12:https://www.bilibili.com/video/BV1Ks411579J/
- 实操任务:
- 绘制 51 单片机中断系统结构图
- 整理中断源对应的中断号与入口地址
周二:外部中断编程实战
- 学习内容:
- 外部中断配置寄存器(TCON、IE、IP)
- 触发方式:电平触发与边沿触发区别
- 中断服务函数编写规范(无返回值、无参数)
- 视频资源:
- B 站《51 单片机外部中断实战》:https://www.bilibili.com/video/BV1b4411i7LZ/
- 金沙滩电子《外部中断控制 LED》P10:https://www.bilibili.com/video/BV1Mb411e7re/
- 实操任务:
- 实现外部中断 0 控制 LED 翻转(按键触发)
- 实现外部中断 0 与 1 优先级控制(中断 0 优先)
周三:定时器原理与配置
- 学习内容:
- 定时器工作原理(计数功能、时钟源选择)
- 定时器模式寄存器(TMOD):模式 0-3 配置
- 初值计算方法(1ms 定时为例)
- 视频资源:
- B 站《51 单片机定时器原理与配置》:https://www.bilibili.com/video/BV1W4411q7i5/
- 正点原子《定时器基础教程》P12:https://space.bilibili.com/394620890/video
- 实操任务:
- 计算定时器 0 在 11.0592MHz 晶振下,1ms 定时的初值
- 配置定时器 0 为模式 1,实现 1ms 定时中断
周四:定时器中断应用(电子时钟)
- 学习内容:
- 定时器中断服务函数设计(计数溢出处理)
- 多任务调度思路(基于定时器中断)
- 电子时钟逻辑设计(时、分、秒计数)
- 视频资源:
- B 站《51 单片机电子时钟设计》:https://www.bilibili.com/video/BV1d4411b7c5/
- 郭天祥《定时器中断实战》P14:https://www.bilibili.com/video/BV1Ks411579J/
- 实操任务:
- 实现基于定时器 0 的电子时钟(秒计数)
- 数码管显示秒数(0-59 循环)
周五:串口通信原理
- 学习内容:
- 串口通信基础:异步通信、波特率、数据位、停止位、校验位
- 51 单片机串口结构(SBUF 寄存器、SCON 寄存器)
- 波特率计算与定时器 1 配置
- 视频资源:
- B 站《51 单片机串口通信原理》:https://www.bilibili.com/video/BV1 FE411b7n3/
- 电子发烧友网《串口通信实战》P15:https://www.elecfans.com/video/1005441.html
- 实操任务:
- 配置串口波特率为 9600,8 位数据位,1 位停止位,无校验
- 实现单片机向电脑发送字符串 "Serial Test OK"
周六:串口收发与指令控制
- 学习内容:
- 串口接收中断配置(RI 标志位处理)
- 指令解析思路(接收特定字符执行对应操作)
- 字符串收发实现方法
- 视频资源:
- B 站《51 单片机串口收发实战》:https://www.bilibili.com/video/BV1zt411g7UQ/
- 金沙滩电子《串口指令控制 LED》P16:https://www.bilibili.com/video/BV1Mb411e7re/
- 实操任务:
- 实现电脑向单片机发送指令:发送 "ON" 点亮 LED,发送 "OFF" 熄灭 LED
- 实现单片机接收字符并回传(echo 功能)
周日:周总结与综合项目(智能小车基础)
- 复习内容:
- 中断系统与定时器配置
- 串口通信协议与编程
- 项目任务:
- 设计智能小车控制模块:通过串口发送指令控制电机正转 / 反转
- 撰写项目报告,包含原理图、程序代码与测试结果
第 3-4 周:51 单片机进阶与实战(I2C/SPI 通信与传感器应用)
- 核心内容:
- I2C 通信协议与 AT24C02 存储芯片应用
- SPI 通信协议与 W25Q64Flash 应用
- 温度传感器 DS18B20 原理与数据采集
- 综合项目:温湿度监测系统(DS18B20 + 数码管显示 + 串口上传)
- 视频资源:
- B 站《51 单片机 I2C 通信教程》:https://www.bilibili.com/video/BV1Z4411v7cR/
- B 站《DS18B20 温度采集实战》:https://www.bilibili.com/video/BV1LE411x7eP/
- 实操任务:
- 实现 AT24C02 数据读写(存储温度值)
- 设计温湿度监测系统,每 1 秒采集一次温度并显示
第 2 月:STM32 单片机进阶与数字电路复习
第 1-2 周:STM32 基础(从 51 到 ARM 的过渡)
周一:STM32 芯片架构与选型
- 学习内容:
- ARM Cortex-M3 内核特性(流水线、寄存器组、中断控制器)
- STM32F103 系列芯片分类(容量、封装、外设差异)
- STM32 与 51 单片机的核心区别(32 位 vs8 位、外设丰富度、运行速度)
- 视频资源:
- 尚硅谷《STM32 教程基础篇》P1-P3:http://m.atguigu.com/video/detail/311/
- B 站《STM32 入门到精通》P1-P2:https://www.bilibili.com/video/BV1th411z7sn/
- 实操任务:
- 查阅 STM32F103C8T6 数据手册,整理核心参数(主频、Flash、SRAM)
- 对比 STM32 与 51 单片机的外设资源差异
周二:STM32CubeMX 工具使用
- 学习内容:
- STM32CubeMX 安装与配置(固件包下载、工程创建)
- 引脚配置方法(GPIO、时钟、外设模式)
- 工程生成选项(IDE 选择、代码风格)
- 视频资源:
- 尚硅谷《STM32CubeMX 教程》P4-P5:http://m.atguigu.com/video/detail/311/
- B 站《STM32CubeMX 快速入门》:https://www.bilibili.com/video/BV17E411x7yC/
- 实操任务:
- 使用 CubeMX 创建 STM32F103C8T6 工程,配置 LED 引脚(PA0)
- 生成 Keil 工程并编译
周三:STM32 GPIO 原理与 HAL 库
- 学习内容:
- GPIO 端口结构(输出模式、输入模式、复用功能)
- HAL 库函数使用(HAL_GPIO_Init、HAL_GPIO_WritePin、HAL_GPIO_TogglePin)
- 时钟树配置(HSE、HSI、PLL)
- 视频资源:
- 尚硅谷《STM32 GPIO 教程》P6-P7:http://m.atguigu.com/video/detail/311/
- B 站《STM32 HAL 库 GPIO 实战》:https://www.bilibili.com/video/BV1QE411h7eQ/
- 实操任务:
- 编写程序实现 LED 闪烁(使用 HAL 库,周期 500ms)
- 配置不同 GPIO 模式(推挽输出、上拉输入)并测试
周四:STM32 中断系统(NVIC)
- 学习内容:
- NVIC 中断控制器特性(优先级分组、中断使能)
- 外部中断配置(EXTI 线、触发方式)
- HAL 库中断服务函数与回调函数
- 视频资源:
- 尚硅谷《STM32 中断系统教程》P12-P13:http://m.atguigu.com/video/detail/311/
- B 站《STM32 NVIC 与外部中断》:https://www.bilibili.com/video/BV1Z7411d71h/
- 实操任务:
- 实现外部中断控制 LED 翻转(PA0 触发)
- 配置两个外部中断,实现优先级控制
周五:STM32 定时器与 PWM 输出
- 学习内容:
- 通用定时器功能(定时、计数、PWM)
- PWM 原理与应用(电机控制、LED 调光)
- HAL 库定时器配置函数(HAL_TIM_Base_Init、HAL_TIM_PWM_Start)
- 视频资源:
- 尚硅谷《STM32 定时器教程》P14-P16:http://m.atguigu.com/video/detail/311/
- B 站《STM32 PWM 输出实战》:https://www.bilibili.com/video/BV1p7411t7RV/
- 实操任务:
- 实现定时器 3 生成 1kHz PWM 信号,占空比 50%
- 通过按键调节 PWM 占空比(0-100%),控制 LED 亮度
周六:STM32 串口通信(USART)
- 学习内容:
- USART 外设特性(同步 / 异步模式、多机通信)
- HAL 库串口函数(HAL_UART_Transmit、HAL_UART_Receive_IT)
- 串口中断接收与数据处理
- 视频资源:
- 尚硅谷《STM32 USART 教程》P17-P18:http://m.atguigu.com/video/detail/311/
- B 站《STM32 串口中断实战》:https://www.bilibili.com/video/BV1CE411x7vR/
- 实操任务:
- 实现串口 1(PA9/PA10)发送字符串 "STM32 UART Test"
- 实现串口中断接收,接收数据后回传
周日:周总结与综合练习
- 复习内容:
- STM32CubeMX 配置流程
- GPIO、中断、定时器、串口的 HAL 库编程
- 实操任务:
- 设计 PWM 调光系统:通过串口指令设置 LED 亮度(0-100%)
- 撰写学习笔记,对比 STM32 与 51 单片机的编程差异
第 3-4 周:数字电路复习与 STM32 进阶(I2C/SPI/DMA)
周一:数字电路基础(逻辑门与组合逻辑)
- 学习内容:
- 基本逻辑门(与、或、非、与非、或非)真值表
- 组合逻辑电路(编码器、译码器、多路选择器)
- 逻辑函数化简(卡诺图方法)
- 视频资源:
- B 站《数字电子技术基础》(清华大学)P1-P5:https://www.bilibili.com/video/BV1zW411t7YE/
- 电子发烧友网《组合逻辑电路详解》:https://www.elecfans.com/video/1005441.html
- 实操任务:
- 用卡诺图化简逻辑函数 Y=AB+AC+BC
- 绘制 3-8 译码器原理图并仿真(Multisim)
周二:时序逻辑电路(触发器与寄存器)
- 学习内容:
- 基本触发器(RS、JK、D 触发器)
- 寄存器与移位寄存器工作原理
- 计数器设计(同步计数器、异步计数器)
- 视频资源:
- B 站《时序逻辑电路教程》P6-P8:https://www.bilibili.com/video/BV1zW411t7YE/
- CSDN《触发器与寄存器原理》:https://blog.csdn.net/weixin_48995270/article/details/117295520
- 实操任务:
- 绘制 D 触发器时序图
- 设计 4 位二进制计数器逻辑图
周三:STM32 I2C 通信与 OLED 显示
- 学习内容:
- I2C 通信协议详解(起始位、停止位、应答位)
- STM32 I2C 外设配置(HAL_I2C_Init)
- OLED 显示屏驱动原理(SSD1306 芯片)
- 视频资源:
- 尚硅谷《STM32 I2C 教程》P20-P22:http://m.atguigu.com/video/detail/311/
- B 站《STM32 OLED 显示实战》:https://www.bilibili.com/video/BV1JE411x7eF/
- 实操任务:
- 配置 I2C1(PB6/PB7),实现 OLED 显示 "STM32 I2C Test"
- 显示实时温度值(模拟数据)
周四:STM32 SPI 通信与 Flash 读写
- 学习内容:
- SPI 通信协议(四线制、主从模式、时钟极性)
- STM32 SPI 外设配置(HAL_SPI_Init)
- W25Q64 Flash 芯片读写操作
- 视频资源:
- 尚硅谷《STM32 SPI 教程》P23-P25:http://m.atguigu.com/video/detail/311/
- B 站《STM32 SPI Flash 实战》:https://www.bilibili.com/video/BV1s7411T75o/
- 实操任务:
- 配置 SPI1(PA5/PA6/PA7),实现 W25Q64 数据读写
- 存储温度数据到 Flash,断电后读取显示
周五:STM32 DMA 原理与应用
- 学习内容:
- DMA 功能与优势(直接内存访问,减轻 CPU 负担)
- DMA 通道与请求映射
- HAL 库 DMA 配置函数(HAL_DMA_Init、HAL_UART_Transmit_DMA)
- 视频资源:
- 尚硅谷《STM32 DMA 教程》P26-P28:http://m.atguigu.com/video/detail/311/
- B 站《STM32 DMA 串口传输实战》:https://www.bilibili.com/video/BV1BE411h7W5/
- 实操任务:
- 实现 DMA 方式串口发送(发送 1024 字节数据)
- 对比 DMA 与普通串口发送的效率差异
周六:STM32 ADC 采集与数据处理
- 学习内容:
- ADC 原理(逐次逼近型、分辨率、采样率)
- STM32 ADC 配置(单通道、多通道、中断模式)
- 模拟信号采集与数字化处理
- 视频资源:
- 尚硅谷《STM32 ADC 教程》P29-P31:http://m.atguigu.com/video/detail/311/
- B 站《STM32 ADC 温度采集》:https://www.bilibili.com/video/BV1QE411h7eQ/
- 实操任务:
- 配置 ADC1 通道 1(PA1),采集电位器电压(0-3.3V)
- 将采集值转换为温度(模拟公式),OLED 显示
周日:阶段总结与综合项目(环境监测终端)
- 项目任务:
- 设计环境监测终端:ADC 采集温度(模拟)、I2C OLED 显示、SPI Flash 存储、串口上传数据
- 编写完整代码,实现数据采集、存储、显示、传输全流程
- 文档输出:
- 项目原理图(Altium Designer 绘制)
- 程序流程图与核心代码注释
- 测试报告(功能验证与性能分析)
第二阶段:基础阶段(第 3-5 月)------ ZYNQ 架构与裸机开发、硬件基础
第 3 月:ZYNQ 芯片架构与开发环境搭建
第 1 周:ZYNQ 系列芯片概述与硬件架构
周一:ZYNQ 芯片家族与应用场景
- 学习内容:
- ZYNQ 系列分类:ZYNQ-7000、ZYNQ UltraScale+ MPSoC
- ZYNQ-7000 核心特性:28nm 工艺、双核 Cortex-A9、PL 资源(逻辑单元、DSP48E1)
- 典型应用场景:工业控制、图像处理、航空航天、AI 边缘计算
- 视频资源:
- 正点原子《手把手教你学 ZYNQ》P1-P3:https://space.bilibili.com/394620890/video
- 达尔闻《ZYNQ 入门到实战》P1-P2:https://darwinlearns.com/productinfo/957951.html
- 资料链接:
- ZYNQ-7000 数据手册(中文摘要):https://xilinx.eetrend.com/document/detail/100008767
- 实操任务:
- 整理 ZYNQ-7020 与 ZYNQ UltraScale+ ZU5 的参数对比表
- 调研 ZYNQ 在导引头系统中的应用案例
周二:ZYNQ 异构架构详解(PS 与 PL)
- 学习内容:
- 处理系统(PS)组成:Cortex-A9 内核、内存控制器、外设(UART、SPI、I2C)
- 可编程逻辑(PL)组成:逻辑单元、BRAM、DSP 切片、时钟资源
- PS 与 PL 互连:AXI4 总线(AXI4-Lite、AXI4、AXI4-Stream)
- 视频资源:
- 正点原子《ZYNQ 架构详解》P4-P6:https://space.bilibili.com/394620890/video
- B 站《ZYNQ PS 与 PL 互连原理》:https://www.bilibili.com/video/BV1QZ4y1M7nE/
- 资料链接:
- ZYNQ-7000 架构手册(UG585)中文解读:https://blog.csdn.net/weixin_45825101/article/details/120500795
- 实操任务:
- 绘制 ZYNQ-7020 架构框图,标注 PS 与 PL 核心组件
- 整理 AXI4 三种总线的应用场景差异
周三:ZYNQ 最小系统设计原理
- 学习内容:
- PS 部分最小系统:电源电路(1.0V 核压、1.8V/3.3V 外设压)、时钟电路(50MHz 晶振)、复位电路
- PL 部分最小系统:配置电路(QSPI Flash)、电源电路
- 关键信号:JTAG 接口、UART 接口、DDR3 接口
- 视频资源:
- 凡亿教育《ZYNQ 硬件设计》P12-P14:https://m.fanyedu.com/drill/cq/details/146
- B 站《ZYNQ 最小系统设计》:https://www.bilibili.com/opus/747623368271855704
- 资料链接:
- 正点原子 ZYNQ 开发板原理图:http://www.openedv.com/docs/build/html/boards/fpga/zdyz_zynqxtb.html
- 实操任务:
- 分析正点原子 ZYNQ 开发板电源电路,整理电源树
- 绘制 ZYNQ 最小系统原理图(核心部分)
周四:Vivado 开发环境搭建
- 学习内容:
- Vivado 2022.2 安装步骤(Windows/Linux)
- 许可证配置与常见问题解决
- Vivado 界面介绍:Project Manager、Flow Navigator、Diagram
- 视频资源:
- 正点原子《Vivado 安装与使用》P7-P8:https://space.bilibili.com/394620890/video
- B 站《Vivado 2022 入门教程》:https://www.bilibili.com/video/BV1F34y167a8/
- 实操任务:
- 在 Windows 系统安装 Vivado 2022.2,配置许可证
- 熟悉 Vivado 各模块功能,创建空白工程
周五:Vitis 开发环境搭建与配置
- 学习内容:
- Vitis 2025 安装与关联 Vivado
- 工作空间配置与工具链选择
- Vitis 界面介绍:Project Explorer、Console、Debug 视图
- 视频资源:
- CSDN《Vitis 2025 入门教程》:https://blog.csdn.net/m0_37816922/article/details/150000186
- B 站《Vitis 与 Vivado 联动配置》:https://www.bilibili.com/video/BV1Zv4y1o7eR/
- 实操任务:
- 安装 Vitis 2025,关联已安装的 Vivado
- 创建第一个 Vitis 工程,配置目标器件(xc7z020clg400-2)
周六:ZYNQ 开发流程概述
- 学习内容:
- 全流程:需求分析→硬件设计→Vivado 工程创建→PL 逻辑设计→PS 配置→比特流生成→Vitis 软件开发→下载调试
- 关键步骤:Block Design 创建、IP 核配置、硬件导出
- 调试工具:ILA(集成逻辑分析仪)、VIO(虚拟 IO)
- 视频资源:
- 达尔闻《ZYNQ 开发全流程》P3-P5:https://darwinlearns.com/productinfo/957951.html
- ALINX《ZYNQ 开发流程实战》:https://blog.csdn.net/zhenaxin/article/details/128421659
- 实操任务:
- 绘制 ZYNQ 开发流程图,标注关键步骤与工具
- 了解 ILA 与 VIO 的使用场景,整理调试方法
周日:周总结与环境验证
- 复习内容:
- ZYNQ 架构核心组件与互连方式
- Vivado 与 Vitis 环境搭建步骤
- 实操任务:
- 验证 Vivado 与 Vitis 联动:创建空白 Block Design,导出到 Vitis
- 撰写环境搭建笔记,记录遇到的问题与解决方法
第 2-4 周:ZYNQ PS 裸机开发(GPIO、UART、定时器)
周一:PS GPIO 原理与配置
- 学习内容:
- PS GPIO 分类:MIO(多功能 IO)与 EMIO(扩展 IO)
- MIO 引脚分配:Bank0(3.3V)、Bank1(1.8V)
- GPIO 配置寄存器:DATA、DIR、OEN
- 视频资源:
- 正点原子《ZYNQ PS GPIO 教程》P9-P11:https://space.bilibili.com/394620890/video
- B 站《MIO 与 EMIO 区别与配置》:https://www.bilibili.com/video/BV1qZ4y1M7nE/
- 实操任务:
- 在 Vivado 中配置 MIO0 为输出(LED 控制)
- 编写 Vitis 程序,实现 LED 闪烁(HAL 库)
周二:PS UART 通信实现
- 学习内容:
- PS UART 外设特性:波特率、数据位、停止位、校验位
- UART 配置步骤:时钟使能→引脚配置→参数设置→中断配置
- HAL 库函数:XUartPs_Init、XUartPs_Send、XUartPs_Recv
- 视频资源:
- 达尔闻《ZYNQ PS UART 实战》P4-P6:https://darwinlearns.com/productinfo/957951.html
- B 站《ZYNQ UART 中断接收》:https://www.bilibili.com/video/BV1Zv4y1o7eR/
- 实操任务:
- 配置 UART0(MIO14/MIO15),波特率 115200
- 实现串口发送字符串 "ZYNQ UART Test",接收数据并回传
周三:PS 定时器与中断
- 学习内容:
- PS 定时器类型:私有定时器(Private Timer)、全局定时器(Global Timer)
- 定时器配置:加载值、预分频、中断使能
- 中断控制器:GIC(通用中断控制器)配置
- 视频资源:
- 正点原子《ZYNQ PS 定时器教程》P12-P14:https://space.bilibili.com/394620890/video
- CSDN《ZYNQ GIC 中断配置》:https://blog.csdn.net/weixin_45825101/article/details/120500795
- 实操任务:
- 配置私有定时器,实现 1ms 定时中断
- 基于定时器中断实现电子时钟(秒计数),串口打印时间
周四:PS I2C 通信与外设控制
- 学习内容:
- PS I2C 外设特性:主从模式、速率控制(100kHz/400kHz)
- I2C 配置步骤:引脚配置→时钟配置→参数初始化
- 与 OLED 通信:SSD1306 驱动函数调用
- 视频资源:
- 尚硅谷《ZYNQ I2C 教程》:http://m.atguigu.com/video/detail/311/
- B 站《ZYNQ I2C 控制 OLED》:https://www.bilibili.com/video/BV1JE411x7eF/
- 实操任务:
- 配置 I2C0(MIO12/MIO13),实现 OLED 显示
- 显示定时器计数的秒数
周五:PS SPI 通信与 Flash 读写
- 学习内容:
- PS SPI 外设特性:四线制、主模式、时钟极性 / 相位
- SPI 配置步骤:引脚分配→模式设置→速率配置
- QSPI Flash 读写:XQspiPs 库函数使用
- 视频资源:
- 正点原子《ZYNQ PS SPI 教程》P15-P17:https://space.bilibili.com/394620890/video
- B 站《ZYNQ SPI Flash 操作》:https://www.bilibili.com/video/BV1s7411T75o/
- 实操任务:
- 配置 SPI0(MIO10/MIO11/MIO16/MIO17),实现 QSPI Flash 读写
- 存储当前时间到 Flash,断电后读取并显示
周六:PS DMA 原理与应用
- 学习内容:
- PS DMA 控制器特性:8 个通道、AXI4 接口、 scatter-gather 模式
- DMA 配置步骤:通道初始化→传输参数设置→启动传输
- 与 UART 结合:DMA 方式串口数据传输
- 视频资源:
- CSDN《ZYNQ PS DMA 教程》:https://blog.csdn.net/qq_41667729/article/details/134624480
- B 站《ZYNQ DMA 串口传输实战》:https://www.bilibili.com/video/BV1BE411h7W5/
- 实操任务:
- 配置 DMA 通道,实现 UART DMA 发送(1024 字节数据)
- 对比 DMA 与普通发送的 CPU 占用率
周日:PS 裸机综合项目(环境监测节点)
- 项目任务:
- 设计基于 PS 的环境监测节点:定时器中断计数、I2C OLED 显示、SPI Flash 存储、UART DMA 上传数据
- 实现功能:每 1 秒采集模拟温度,显示、存储、上传
- 文档输出:
- Vivado Block Design 截图
- Vitis 程序流程图与核心代码
- 测试报告(功能验证与性能分析)
第 4 月:ZYNQ PL 开发基础(Verilog 与 IP 核)
第 1-2 周:Verilog HDL 基础与 PL 逻辑设计
周一:Verilog 语言基础(语法与数据类型)
- 学习内容:
- Verilog 程序结构:模块定义(module/endmodule)、端口声明、内部信号
- 数据类型:wire、reg、integer、parameter
- 基本操作符:算术、逻辑、关系、位操作符
- 视频资源:
- B 站《Verilog 入门到精通》P1-P5:https://www.bilibili.com/video/BV1zW411t7YE/
- 正点原子《Verilog 基础教程》P1-P3:https://space.bilibili.com/394620890/video
- 实操任务:
- 编写 Verilog 模块,定义一个 4 位加法器
- 仿真验证加法器功能(使用 Vivado Simulator)
周二:组合逻辑电路设计
- 学习内容:
- 组合逻辑特点:无记忆、输出仅取决于当前输入
- 常用电路:多路选择器、译码器、加法器
- 赋值语句:assign 连续赋值(wire 型)
- 视频资源:
- B 站《Verilog 组合逻辑设计》P6-P8:https://www.bilibili.com/video/BV1zW411t7YE/
- CSDN《组合逻辑与时序逻辑区别》:https://blog.csdn.net/qq_40011737/article/details/118892914
- 实操任务:
- 设计 8 选 1 多路选择器(Verilog 实现)
- 仿真验证多路选择器功能,绘制时序图
周三:时序逻辑电路设计
- 学习内容:
- 时序逻辑特点:有记忆、输出取决于输入与状态
- 触发器:D 触发器、JK 触发器(Verilog 实现)
- 时序语句:always 块、posedge/negedge 时钟触发
- 视频资源:
- B 站《Verilog 时序逻辑设计》P9-P11:https://www.bilibili.com/video/BV1zW411t7YE/
- 正点原子《时序逻辑实战》P4-P6:https://space.bilibili.com/394620890/video
- 实操任务:
- 设计 D 触发器(带异步复位)
- 基于 D 触发器设计 4 位计数器(0-15 循环)
周四:有限状态机(FSM)设计
- 学习内容:
- FSM 组成:状态寄存器、次态逻辑、输出逻辑
- 状态编码:二进制编码、格雷码、独热码
- 一段式、两段式、三段式 FSM 实现
- 视频资源:
- B 站《Verilog FSM 设计》P12-P14:https://www.bilibili.com/video/BV1zW411t7YE/
- CSDN《三段式 FSM 实战》:https://blog.csdn.net/weixin_48995270/article/details/117295520
- 实操任务:
- 设计交通灯控制器 FSM(红→黄→绿→黄→红)
- 仿真验证 FSM 状态转换
周五:PL GPIO 与 LED 控制
- 学习内容:
- PL 引脚约束:XDC 文件编写(set_property、create_port)
- PL 逻辑设计:LED 闪烁电路(计数器 + 分频)
- Vivado 综合与实现流程
- 视频资源:
- ALINX《PL LED 控制实战》:https://blog.csdn.net/zhenaxin/article/details/128421659
- B 站《ZYNQ PL GPIO 教程》:https://www.bilibili.com/video/BV1QZ4y1M7nE/
- 实操任务:
- 编写 Verilog 代码实现 PL 控制 LED 闪烁(周期 1 秒)
- 编写 XDC 约束文件,下载比特流验证功能
周六:PL UART 收发器设计
- 学习内容:
- UART 协议时序:起始位、数据位、停止位
- 波特率发生器设计(分频器)
- 发送器与接收器逻辑实现
- 视频资源:
- B 站《Verilog UART 设计》P15-P17:https://www.bilibili.com/video/BV1zW411t7YE/
- 达尔闻《PL UART 实战》P7-P9:https://darwinlearns.com/productinfo/957951.html
- 实操任务:
- 设计 PL UART 发送器(9600 波特率)
- 与 PS UART 通信,实现数据收发
周日:周总结与 PL 逻辑仿真
- 复习内容:
- Verilog 核心语法与电路设计方法
- PL 逻辑实现与约束文件编写
- 实操任务:
- 仿真验证 PL UART 发送器功能
- 撰写 Verilog 学习笔记,整理常见语法错误
第 3-4 周:Vivado IP 核使用与 PL-PS 互连
周一:Vivado IP 核概述与使用流程
- 学习内容:
- IP 核分类:Xilinx 官方 IP、自定义 IP、第三方 IP
- IP 核使用步骤:搜索→配置→例化→连接
- 常用 IP 核:Clock Wizard、AXI GPIO、UART Lite
- 视频资源:
- 正点原子《Vivado IP 核教程》P18-P20:https://space.bilibili.com/394620890/video
- B 站《Vivado IP 核使用实战》:https://www.bilibili.com/video/BV1F34y167a8/
- 实操任务:
- 调用 Clock Wizard IP 核,生成 100MHz 时钟
- 仿真验证时钟输出功能
周二:AXI4-Lite 总线基础
- 学习内容:
- AXI4-Lite 协议特点:轻量级、地址对齐、单次传输
- 信号组成:地址信号、数据信号、控制信号、响应信号
- 传输时序:地址阶段、数据阶段
- 视频资源:
- 达尔闻《AXI4-Lite 协议详解》P10-P12:https://darwinlearns.com/productinfo/957951.html
- CSDN《AXI4 总线时序分析》:https://blog.csdn.net/qq_41667729/article/details/134624480
- 实操任务:
- 绘制 AXI4-Lite 总线传输时序图
- 理解 PS 与 PL 的 AXI4-Lite 互连原理
周三:PS 与 PL 通过 AXI4-Lite 互连
- 学习内容:
- Block Design 创建:添加 ZYNQ7 Processing System IP
- PS 配置:DDR3、UART、AXI GPIO
- AXI 互连:使用 AXI Interconnect IP 核
- 视频资源:
- 正点原子《PS-PL 互连教程》P21-P23:https://space.bilibili.com/394620890/video
- B 站《ZYNQ AXI4-Lite 互连实战》:https://www.bilibili.com/video/BV1QZ4y1M7nE/
- 实操任务:
- 在 Block Design 中配置 PS 与 PL 的 AXI4-Lite 连接
- 生成比特流,导出硬件到 Vitis
周四:AXI GPIO IP 核使用(PL 外设控制)
- 学习内容:
- AXI GPIO IP 核配置:输入 / 输出端口宽度、中断使能
- PS 通过 AXI4-Lite 控制 PL GPIO
- Xilinx 驱动库:XGpioPs 库函数使用
- 视频资源:
- ALINX《AXI GPIO 实战》:https://blog.csdn.net/zhenaxin/article/details/128421659
- B 站《ZYNQ AXI GPIO 控制 LED》:https://www.bilibili.com/video/BV1Zv4y1o7eR/
- 实操任务:
- 配置 AXI GPIO IP 核(8 位输出),连接 PL LED
- 编写 Vitis 程序,通过 PS 控制 PL LED 流水灯
周五:自定义 IP 核设计与集成
- 学习内容:
- 自定义 IP 核流程:创建 IP→编写逻辑→封装→集成
- AXI4-Lite 从机接口设计:地址解码、寄存器访问
- IP Packager 工具使用
- 视频资源:
- 达尔闻《自定义 IP 核教程》P13-P15:https://darwinlearns.com/productinfo/957951.html
- CSDN《ZYNQ 自定义 IP 核实战》:https://blog.csdn.net/m0_37816922/article/details/150000186
- 实操任务:
- 设计自定义 IP 核(含 2 个寄存器:控制寄存器、状态寄存器)
- 集成到 Block Design,PS 通过 AXI4-Lite 访问 IP 核
周六:PL 中断与 PS 中断处理
- 学习内容:
- PL 到 PS 中断路径:AXI GPIO 中断→IRQ_F2P→GIC
- 中断配置:PL 端中断信号生成、PS 端中断使能
- 中断服务函数编写:XScuGic 库函数使用
- 视频资源:
- 正点原子《ZYNQ 中断教程》P24-P26:https://space.bilibili.com/394620890/video
- B 站《PL-PS 中断实战》:https://www.bilibili.com/video/BV1Zv4y1o7eR/
- 实操任务:
- 配置 AXI GPIO 中断(PL 按键触发)
- 编写中断服务函数,实现按键控制 LED 翻转
周日:PL-PS 协同综合项目(数据采集模块)
- 项目任务:
- 设计 PL-PS 协同数据采集模块:PL 实现计数器(0-255),通过 AXI4-Lite 上传到 PS,PS 通过 UART 打印数据
- 实现 PL 中断:计数到 255 时触发中断,PS 处理并清零计数器
- 文档输出:
- Block Design 框图与 IP 配置截图
- 自定义 IP 核 Verilog 代码与封装步骤
- 测试报告(功能验证与中断响应时间测试)
第 5 月:ZYNQ 硬件系统设计基础(原理图与 PCB)
第 1-2 周:ZYNQ 硬件系统组成与原理图设计
周一:ZYNQ 硬件系统架构
- 学习内容:
- 硬件系统组成:核心电路、电源电路、存储电路、外设接口
- 核心电路:ZYNQ 芯片、晶振、复位电路
- 外设接口:UART、USB、HDMI、以太网
- 视频资源:
- 凡亿教育《ZYNQ 硬件系统设计》P1-P3:https://m.fanyedu.com/drill/cq/details/146
- B 站《ZYNQ 硬件架构详解》:https://www.bilibili.com/video/BV1QZ4y1M7nE/
- 资料链接:
- ZYNQ-7020 硬件设计指南:https://xilinx.eetrend.com/document/detail/100008767
- 实操任务:
- 绘制 ZYNQ 硬件系统框图,标注各模块
- 整理核心电路设计要点
周二:电源电路设计
- 学习内容:
- ZYNQ 电源需求:VCC_INT(1.0V)、VCC_IO_BANK0(3.3V)、VCC_IO_BANK1(1.8V)、VCC_PLL(1.0V)
- 电源方案:DC-DC(高效)、LDO(低噪声)选型
- 滤波电路:去耦电容配置(0.1uF+10uF)、电源树设计
- 视频资源:
- 凡亿教育《ZYNQ 电源设计》P4-P6:https://m.fanyedu.com/drill/cq/details/146
- CSDN《ZYNQ 电源树设计实战》:https://wenku.csdn.net/doc/87khdqqztr
- 实操任务:
- 设计 ZYNQ 电源电路(使用 MP2307 DC-DC 和 AMS1117 LDO)
- 绘制电源树框图,标注各电源轨电流需求
周三:时钟电路设计
- 学习内容:
- ZYNQ 时钟需求:PS 主时钟(50MHz/100MHz)、PL 时钟(可配置)
- 晶振选型:无源晶振(成本低)vs 有源晶振(稳定性高)
- 时钟电路设计:匹配电容(22pF)、布局注意事项(远离噪声源)
- 视频资源:
- 凡亿教育《时钟电路设计》P7-P9:https://m.fanyedu.com/drill/cq/details/146
- B 站《ZYNQ 时钟系统详解》:https://www.bilibili.com/video/BV1F34y167a8/
- 实操任务:
- 设计 ZYNQ 时钟电路(50MHz 无源晶振)
- 分析时钟抖动对系统的影响,整理布局要点
周四:存储电路设计(DDR3 与 Flash)
- 学习内容:
- DDR3 SDRAM 设计:引脚连接(地址线、数据线、控制线)、阻抗匹配
- QSPI Flash 设计:存储配置文件、用户数据,引脚连接(CS、SCK、MOSI、MISO)
- 时序约束:DDR3 时序参数(tCK、tCAS、tRCD)
- 视频资源:
- 凡亿教育《存储电路设计》P10-P12:https://m.fanyedu.com/drill/cq/details/146
- CSDN《ZYNQ DDR3 设计指南》:https://blog.csdn.net/weixin_45825101/article/details/120500795
- 实操任务:
- 设计 DDR3 电路(MT41J128M16JT-125)
- 设计 QSPI Flash 电路(W25Q128JV)
周五:外设接口电路设计(UART、USB、HDMI)
- 学习内容:
- UART 接口:电平转换(MAX3232)、ESD 保护(TPD4E05U03)
- USB 接口:USB 2.0 OTG(VL610 芯片)、供电设计
- HDMI 接口:TMDS 信号传输、ESD 保护、电源滤波
- 视频资源:
- 凡亿教育《外设接口设计》P13-P15:https://m.fanyedu.com/drill/cq/details/146
- B 站《ZYNQ HDMI 接口设计》:https://www.bilibili.com/video/BV1QZ4y1M7nE/
- 实操任务:
- 设计 UART 接口电路(含电平转换与 ESD 保护)
- 设计 HDMI 发送接口电路(SN75DP159 芯片)
周六:原理图设计工具使用(Altium Designer)
- 学习内容:
- Altium Designer 22 安装与配置
- 原理图库创建:ZYNQ-7020、电源芯片、存储芯片符号
- 原理图绘制:导线连接、网络标签、注释
- 视频资源:
- B 站《Altium Designer 入门教程》P1-P5:https://www.bilibili.com/video/BV1YE41177aM/
- 凡亿教育《Altium 原理图设计》P29-P31:https://m.fanyedu.com/drill/cq/details/146
- 实操任务:
- 创建 ZYNQ-7020 原理图符号库
- 绘制 ZYNQ 核心电路原理图(电源、时钟、复位)
周日:周总结与原理图审核
- 复习内容:
- ZYNQ 硬件各模块设计要点
- Altium Designer 原理图绘制步骤
- 实操任务:
- 审核绘制的原理图,检查引脚连接错误
- 撰写硬件设计笔记,整理常见设计错误
第 3-4 周:PCB 设计基础与信号完整性
周一:PCB 设计流程与层叠规划
- 学习内容:
- PCB 设计流程:原理图导入→封装库创建→布局→布线→敷铜→输出 Gerber
- 层叠规划:4 层板(顶层、GND、VCC、底层)设计
- 板框与定位孔设计:机械尺寸、安装孔位置
- 视频资源:
- 凡亿教育《PCB 设计流程》P39-P41:https://m.fanyedu.com/drill/cq/details/146
- B 站《4 层 PCB 层叠设计》:https://www.bilibili.com/video/BV17E411x7eC/
- 实操任务:
- 创建 ZYNQ 开发板 PCB 板框(100x80mm)
- 规划 4 层板层叠结构,设置层厚与介质参数
周二:封装库创建与元件布局
- 学习内容:
- 封装类型:BGA(ZYNQ-7020)、QFP、SOP、0402/0603 贴片
- 封装库创建:焊盘尺寸、丝印、 courtyard 设置
- 元件布局原则:核心元件优先、功能分区、散热考虑
- 视频资源:
- 凡亿教育《PCB 封装设计》P708-P710:https://m.fanyedu.com/drill/cq/details/146
- CSDN《ZYNQ BGA 封装布局要点》:https://wenku.csdn.net/doc/87khdqqztr
- 实操任务:
- 创建 ZYNQ-7020 BGA 封装(xc7z020clg400-2)
- 进行元件布局:核心芯片、电源芯片、存储芯片
周三:PCB 布线基础与规则设置
- 学习内容:
- 布线规则:线宽(电源 30mil、信号 10mil)、线距(8mil)、过孔大小
- 布线策略:优先布高速信号、差分对布线、避免绕线
- Altium Designer 布线工具使用:自动布线、手动布线
- 视频资源:
- 凡亿教育《PCB 布线教程》P728-P730:https://m.fanyedu.com/drill/cq/details/146
- B 站《PCB 布线实战》:https://www.bilibili.com/video/BV1YE41177aM/
- 实操任务:
- 设置 PCB 布线规则(线宽、线距、过孔)
- 完成核心电路布线(电源、时钟、复位)
周四:高速信号布线与阻抗控制
- 学习内容:
- 高速信号定义:频率 > 100MHz 或上升沿 < 1ns
- 阻抗控制:微带线、带状线阻抗计算(50Ω/100Ω)
- 差分对布线:等长、等距、屏蔽
- 视频资源:
- 凡亿教育《高速信号布线》P732-P734:https://m.fanyedu.com/drill/cq/details/146
- CSDN《高速电路阻抗控制》:https://wenku.csdn.net/doc/87khdqqztr
- 实操任务:
- 计算微带线阻抗(线宽 10mil,介质厚度 1.6mm,介电常数 4.4)
- 完成 DDR3 差分对布线(CLK、DQS)
周五:电源完整性设计
- 学习内容:
- 电源完整性问题:纹波、噪声、压降
- 去耦电容布局:靠近芯片电源引脚、多容值组合
- 电源平面分割:不同电压域隔离、避免跨分割
- 视频资源:
- 凡亿教育《电源完整性设计》P1383-P1385:https://m.fanyedu.com/drill/cq/details/146
- B 站《PCB 电源完整性实战》:https://www.bilibili.com/video/BV17E411x7eC/
- 实操任务:
- 布局去耦电容(ZYNQ 电源引脚附近)
- 进行电源平面分割(1.0V、1.8V、3.3V)
周六:EMC 设计与 PCB 优化
- 学习内容:
- EMC 设计原则:接地策略、屏蔽、滤波
- 常见 EMC 问题:辐射干扰、传导干扰
- PCB 优化:减少过孔、优化绕线、增加接地过孔
- 视频资源:
- CSDN《PCB EMC 设计实战》:https://wenku.csdn.net/doc/87khdqqztr
- B 站《ZYNQ PCB EMC 优化》:https://www.bilibili.com/video/BV1QZ4y1M7nE/
- 实操任务:
- 优化 PCB 布线,减少跨分割与过长绕线
- 添加滤波电容与接地过孔,提升 EMC 性能
周日:PCB 设计综合项目与输出
- 项目任务:
- 完成 ZYNQ 核心板 PCB 设计(4 层板):包含核心电路、电源电路、存储电路、UART 接口
- 输出 Gerber 文件与 BOM 清单
- 文档输出:
- PCB 布局布线截图(顶层、底层、内层)
- 阻抗控制计算报告
- Gerber 文件输出步骤与检查清单
第三阶段:进阶阶段(第 6-9 月)------ 嵌入式 Linux 开发、PL 高级编程与硬件设计
第 6 月:ZYNQ 嵌入式 Linux 开发基础(Petalinux)
第 1-2 周:Linux 系统基础与 Petalinux 环境搭建
周一:嵌入式 Linux 系统概述
- 学习内容:
- 嵌入式 Linux 组成:内核、根文件系统、应用程序、引导程序
- ZYNQ Linux 开发特点:PS 运行 Linux、PL 作为外设或加速器
- 常用 Linux 发行版:Petalinux(Xilinx 定制)、Buildroot、Yocto
- 视频资源:
- 韦东山《嵌入式 Linux 入门》P1-P3:https://www.bilibili.com/video/BV1Vy4y1B7ta/
- EEWorld《Petalinux 介绍》:https://en.eeworld.com.cn/training/video/41816
- 资料链接:
- 实操任务:
- 绘制嵌入式 Linux 系统架构图
- 调研 Petalinux 与 Buildroot 的差异,整理适用场景
周二:Ubuntu 虚拟机安装与配置
- 学习内容:
- VMware Workstation 安装与 Ubuntu 20.04 镜像部署
- Ubuntu 基础配置:更新源、安装依赖包、配置 SSH
- 共享文件夹设置(Windows 与 Ubuntu 文件共享)
- 视频资源:
- B 站《Ubuntu 20.04 安装教程》:https://www.bilibili.com/video/BV1hv4y1o7E2/
- CSDN《Petalinux 环境配置》:https://blog.csdn.net/weixin_45825





12 篇资料
继续生成
已完成思考
ZYNQ 系列芯片嵌入式与硬件系统知识学习全计划(基于国内视频资源)(续)
第三阶段:进阶阶段(第 6-9 月)------ 嵌入式 Linux 开发、PL 高级编程与硬件设计
第 6 月:ZYNQ 嵌入式 Linux 开发基础(Petalinux)
第 1-2 周:Linux 系统基础与 Petalinux 环境搭建(续)
周三:Petalinux 工具安装与验证
- 学习内容:
- Petalinux 2022.2 版本兼容性:需与 Vivado 2022.2 版本匹配,避免版本冲突。
- 安装步骤:解压安装包(
./petalinux-v2022.2-final-installer.run)、接受许可协议、指定安装路径(建议无中文空格)。 - 环境变量配置:执行
source <安装路径>/settings.sh,永久配置需添加到~/.bashrc文件。 - 安装验证:运行
petalinux-version查看版本,petalinux-util --version检查工具完整性。
- 视频资源:
- B 站《Petalinux 2022.2 安装教程》:https://www.bilibili.com/video/BV1884y1Q7fR/
- 正点原子《ZYNQ Petalinux 环境搭建》P3-P4:https://space.bilibili.com/394620890/video
- 实操任务:
- 在 Ubuntu 20.04 中安装 Petalinux 2022.2,解决依赖包缺失问题(如
libtinfo5、zlib1g-dev)。 - 配置环境变量,验证安装结果,截图保存
petalinux-version输出信息。
- 在 Ubuntu 20.04 中安装 Petalinux 2022.2,解决依赖包缺失问题(如
周四:Petalinux 工程创建与硬件关联
- 学习内容:
- 硬件描述文件(XSA)准备:在 Vivado 中完成 Block Design(需包含 PS 核心、AXI 外设),生成并导出 XSA 文件(需勾选 "Include Bitstream")。
- 工程创建命令:
petalinux-create -t project --template zynq --name <工程名>,指定 ZYNQ 模板。 - 关联硬件:
cd <工程名>后执行petalinux-config --get-hw-description=<XSA文件路径>,加载硬件信息。 - 工程结构解析:
components(内核、根文件系统组件)、project-spec(用户定制配置)、build(编译输出)。
- 视频资源:
- 达尔闻《Petalinux 工程创建实战》P5-P6:https://darwinlearns.com/productinfo/957951.html
- B 站《ZYNQ Petalinux 关联 XSA 文件》:https://www.bilibili.com/video/BV1sM4y1u7bH/
- 实操任务:
- 使用前序阶段创建的 "PS-PL AXI GPIO 互连" 硬件工程,导出 XSA 文件。
- 创建 Petalinux 工程,关联该 XSA 文件,进入图形配置界面,查看 "Hardware Setup" 确认硬件信息无误。
周五:U-Boot 配置与编译
- 学习内容:
- U-Boot 作用:初始化硬件(DDR、串口)、引导 Linux 内核、提供命令行交互(如
printenv、setenv)。 - 配置命令:
petalinux-config -c u-boot,核心配置项包括:- "Serial Port Configuration":指定调试串口(如
ttyPS0,对应 PS UART0)。 - "Boot Options":设置默认引导参数(如
bootcmd、bootargs)。 - "Memory Configuration":确认 DDR 容量(如
512MB,需与硬件匹配)。
- "Serial Port Configuration":指定调试串口(如
- 编译命令:
petalinux-build -c u-boot,生成images/linux/u-boot.elf。
- U-Boot 作用:初始化硬件(DDR、串口)、引导 Linux 内核、提供命令行交互(如
- 视频资源:
- EEWorld《ZYNQ U-Boot 配置与编译》:https://en.eeworld.com.cn/training/video/41818
- B 站《Petalinux U-Boot 定制》:https://www.bilibili.com/video/BV1dG4y1a7aF/
- 实操任务:
- 配置 U-Boot,将调试串口设为
ttyPS0(波特率 115200),关闭无关功能(如 USB HID)。 - 编译 U-Boot,在
build/tmp/work/zynq-generic-xilinx-linux-gnueabi/u-boot-xlnx/路径下查看编译日志,确认无错误。
- 配置 U-Boot,将调试串口设为
周六:Linux 内核配置与编译
- 学习内容:
- 内核配置命令:
petalinux-config -c kernel,图形界面基于menuconfig,核心配置项包括:- "Device Drivers":启用 AXI GPIO 驱动(
Xilinx AXI GPIO driver)、串口驱动(Serial drivers -> Xilinx UART Lite)。 - "File systems":支持 EXT4(根文件系统)、FAT32(SD 卡 boot 分区)。
- "Kernel Features":启用内核调试(如
Kernel debugging)、抢占式调度(Preemptible Kernel)。
- "Device Drivers":启用 AXI GPIO 驱动(
- 编译命令:
petalinux-build -c kernel,生成images/linux/zImage(内核镜像)和images/linux/system.dtb(设备树)。 - 设备树作用:描述硬件资源(如 GPIO 地址、中断号),替代传统板级文件(
board.c)。
- 内核配置命令:
- 视频资源:
- 韦东山《嵌入式 Linux 内核配置实战》P8-P9:https://www.bilibili.com/video/BV1Vy4y1B7ta/
- B 站《ZYNQ Linux 内核启用 AXI GPIO 驱动》:https://www.bilibili.com/video/BV1KG4y1o7bX/
- 实操任务:
- 配置 Linux 内核,启用 AXI GPIO 驱动和 EXT4 文件系统支持,保存配置(自动生成
project-spec/meta-user/recipes-kernel/linux/linux-xlnx/%/defconfig)。 - 编译内核,查看
images/linux目录下是否生成zImage和system.dtb,记录文件大小。
- 配置 Linux 内核,启用 AXI GPIO 驱动和 EXT4 文件系统支持,保存配置(自动生成
周日:周总结与 U-Boot 内核验证
- 复习内容:
- Petalinux 工程创建、硬件关联、U-Boot / 内核配置编译流程。
- U-Boot 与内核的核心作用及配置要点。
- 实操任务:
- 通过 JTAG 将编译好的
u-boot.elf下载到开发板,打开串口助手(波特率 115200),确认 U-Boot 启动正常(显示 "U-Boot>" 命令行)。 - 执行
bdinfo命令查看硬件信息,printenv查看引导参数,截图保存关键输出;整理本周常见问题(如 XSA 文件缺失、依赖包错误)及解决方法。
- 通过 JTAG 将编译好的
第 3-4 周:根文件系统与 Linux 启动
周一:根文件系统组成与定制
- 学习内容:
- 根文件系统(RootFS)作用:提供 Linux 运行所需的目录(
/bin命令、/etc配置、/lib库、/home用户目录)和初始化程序(/sbin/init)。 - Petalinux 根文件系统类型:
ramdisk(内存根文件系统,适合调试)、ext4(SD 卡 / EMMC,适合量产)。 - 定制命令:
petalinux-config -c rootfs,核心配置项包括:- "User Packages":添加常用工具(
bash、vim、telnet-server、gcc)。 - "Filesystem Packages":启用
ssh-server(远程登录)、ntp(时间同步)。 - "Base Filesystem":选择根文件系统格式(如
ext4)。
- "User Packages":添加常用工具(
- 编译命令:
petalinux-build -c rootfs,生成images/linux/rootfs.ext4。
- 根文件系统(RootFS)作用:提供 Linux 运行所需的目录(
- 视频资源:
- B 站《Petalinux 根文件系统定制》:https://www.bilibili.com/video/BV1uM4y1u7qE/
- 正点原子《ZYNQ RootFS 配置与编译》P10-P11:https://space.bilibili.com/394620890/video
- 实操任务:
- 配置根文件系统,添加
bash、vim、openssh-server,禁用busybox的简化命令(如ash)。 - 编译根文件系统,生成
rootfs.ext4,使用ls -lh查看文件大小(约 200MB 以上)。
- 配置根文件系统,添加
周二:Linux 启动流程解析
- 学习内容:
- ZYNQ Linux 完整启动流程:
- 上电后执行 BootROM(固化在芯片内),初始化 PS 最小系统,加载第一阶段引导程序(FSBL)。
- FSBL 初始化 PL(加载比特流)、DDR,加载 U-Boot 到 DDR。
- U-Boot 初始化外设,解析
bootcmd(如fatload mmc 0 0x8000 zImage; fatload mmc 0 0x1000000 system.dtb; bootz 0x8000 - 0x1000000),引导内核。 - 内核初始化(设备树解析、驱动加载),挂载根文件系统(
root=/dev/mmcblk0p2 rw)。 - 启动
systemd(或sysvinit),运行/etc/rc.local中的初始化脚本,进入命令行。
- 关键参数:
bootargs(内核启动参数,指定根文件系统位置、串口)、dtb(设备树路径)。
- ZYNQ Linux 完整启动流程:
- 视频资源:
- 达尔闻《ZYNQ Linux 启动流程深度解析》P12-P13:https://darwinlearns.com/productinfo/957951.html
- B 站《嵌入式 Linux 启动阶段拆解》:https://www.bilibili.com/video/BV1aG4y1a7eX/
- 实操任务:
- 在 U-Boot 命令行执行
printenv bootcmd和printenv bootargs,记录默认引导参数。 - 手动输入引导命令(
fatload+bootz),观察串口输出,标记每个启动阶段的关键日志(如 "Uncompressing Linux..."、"Mounted root filesystem")。
- 在 U-Boot 命令行执行
周三:SD 卡启动镜像制作
- 学习内容:
- SD 卡分区规划:
- 第 1 分区(boot):FAT32 格式,容量 512MB,存放
FSBL.elf、u-boot.elf、zImage、system.dtb、bitstream.bit(PL 比特流)。 - 第 2 分区(root):EXT4 格式,容量剩余空间,存放根文件系统(
rootfs.ext4)。
- 第 1 分区(boot):FAT32 格式,容量 512MB,存放
- 分区工具:Ubuntu 下使用
gparted(图形化)或fdisk(命令行),Windows 下使用 DiskGenius。 - 镜像烧录步骤:
- 格式化第 1 分区为 FAT32,第 2 分区为 EXT4。
- 复制
FSBL.elf、u-boot.elf、zImage、system.dtb到 boot 分区;若需自动加载 PL 比特流,将bitstream.bit改名为system.bit放入 boot 分区。 - 烧录根文件系统:
sudo dd if=rootfs.ext4 of=/dev/sdb2 bs=4M(/dev/sdb2为 root 分区设备名,需确认无误)。
- 启动设置:开发板拨码开关设为 "SD 卡启动"(参考开发板手册,如正点原子 ZYNQ 开发板拨码为 "0011")。
- SD 卡分区规划:
- 视频资源:
- B 站《ZYNQ SD 卡启动镜像制作完整教程》:https://www.bilibili.com/video/BV1sM4y1u7bH/
- 凡亿教育《SD 卡分区与镜像烧录》P14-P15:https://m.fanyedu.com/drill/cq/details/146
- 实操任务:
- 使用 16GB SD 卡,通过
gparted完成分区(boot:512MB FAT32,root:剩余 EXT4)。 - 烧录所有启动文件和根文件系统,将 SD 卡插入开发板,设置 SD 卡启动,上电后确认 Linux 正常启动(进入
root@zynq:~#命令行)。
- 使用 16GB SD 卡,通过
周四:Linux 命令行与网络配置
- 学习内容:
- 常用 Linux 命令:
- 文件操作:
ls(列表)、cd(切换目录)、mkdir(创建目录)、cp(复制)、rm(删除)、vi(编辑)。 - 系统信息:
uname -r(内核版本)、df -h(磁盘占用)、free -h(内存占用)、ifconfig(网络信息)。 - 用户管理:
adduser <用户名>(创建用户)、passwd <用户名>(设置密码)、su <用户名>(切换用户)。
- 文件操作:
- 网络配置:
-
动态 IP(DHCP):
dhclient eth0(eth0为网口名,ZYNQ 通常为eth0)。 -
静态 IP:编辑
/etc/network/interfaces,添加:plaintext
auto eth0 iface eth0 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1 -
验证网络:
ping 192.168.1.1(网关)、ping www.baidu.com(需配置 DNS,编辑/etc/resolv.conf添加nameserver 8.8.8.8)。
-
- 常用 Linux 命令:
- 视频资源:
- B 站《嵌入式 Linux 命令行基础》:https://www.bilibili.com/video/BV1kg411c7Lt/
- 韦东山《Linux 网络配置实战》P16-P17:https://www.bilibili.com/video/BV1Vy4y1B7ta/
- 实操任务:
- 在开发板 Linux 命令行执行
uname -r、df -h、free -h,截图保存输出。 - 配置静态 IP(如 192.168.1.100),设置 DNS,通过
ping验证与 PC 的网络连通性;通过 SSH 工具(如 Putty、MobaXterm)远程登录开发板。
- 在开发板 Linux 命令行执行
周五:Linux 应用程序交叉编译
- 学习内容:
- 交叉编译概念:在 PC(x86 架构)编译能在开发板(ARM 架构)运行的程序,需使用 ARM 架构交叉编译器。
- Petalinux 交叉编译器路径:
/<Petalinux安装路径>/tools/linux-i386/gcc-arm-linux-gnueabi/bin/arm-linux-gnueabihf-gcc。 - 交叉编译流程:
- 编写 C 程序(如
hello_zynq.c,实现打印 "Hello ZYNQ Linux!" 并控制 AXI GPIO 点亮 LED)。 - 编译命令:
arm-linux-gnueabihf-gcc hello_zynq.c -o hello_zynq。 - 文件传输:通过
scp(scp hello_zynq root@192.168.1.100:/home)或 U 盘复制到开发板。 - 运行程序:
chmod +x hello_zynq(添加执行权限)、./hello_zynq。
- 编写 C 程序(如
- 依赖库问题:若程序依赖第三方库(如
libgpio.so),需将库文件一同复制到开发板/lib目录。
- 视频资源:
- B 站《ZYNQ Linux 交叉编译实战》:https://www.bilibili.com/video/BV1KG4y1o7bX/
- 正点原子《交叉编译器使用教程》P18-P19:https://space.bilibili.com/394620890/video
- 实操任务:
- 编写
led_control.c程序:通过操作/sys/class/gpio目录下的文件(export、direction、value)控制 AXI GPIO 连接的 LED(如 GPIO128)。 - 使用 Petalinux 交叉编译器编译程序,传输到开发板并运行,验证 LED 是否按程序逻辑闪烁(如每隔 1 秒翻转一次)。
- 编写
周六:Linux 调试工具使用
- 学习内容:
- 串口调试:通过
minicom或screen工具连接开发板串口,捕获启动日志(screen /dev/ttyUSB0 115200)。 - 远程调试(GDB):
- 交叉编译时添加调试信息:
arm-linux-gnueabihf-gcc -g hello_zynq.c -o hello_zynq。 - 开发板运行 GDB 服务器:
gdbserver 192.168.1.100:1234 ./hello_zynq(1234 为端口号)。 - PC 端启动交叉 GDB:
arm-linux-gnueabihf-gdb hello_zynq,执行target remote 192.168.1.100:1234连接服务器,使用break(设断点)、run(运行)、step(单步)调试。
- 交叉编译时添加调试信息:
- 性能分析工具:
top(进程 CPU 占用)、vmstat(内存 / IO 统计)、perf(内核性能分析,需内核启用PERF_EVENTS)。
- 串口调试:通过
- 视频资源:
- B 站《嵌入式 Linux GDB 远程调试教程》:https://www.bilibili.com/video/BV1aG4y1a7eX/
- EEWorld《Linux 性能分析工具实战》:https://en.eeworld.com.cn/training/video/41819
- 实操任务:
- 使用 GDB 远程调试
led_control.c程序,在 LED 翻转逻辑处设置断点,单步执行观察变量变化。 - 运行
top命令,观察led_control进程的 CPU 占用率;运行free -h,记录内存使用情况,截图保存。
- 使用 GDB 远程调试
周日:综合项目(Linux 下 LED 控制与网络监控)
- 项目任务:
- 功能需求:开发板 Linux 系统运行 LED 控制程序,支持通过网络(SSH)发送指令(如 "ON""OFF""TOGGLE")控制 LED 状态;程序将 LED 状态实时写入
/tmp/led_status.txt文件,支持远程读取。 - 开发步骤:
- 编写
net_led_control.c:使用socket实现 TCP 服务端,监听端口 8888;解析客户端指令,控制 GPIO;定时更新led_status.txt。 - 交叉编译程序,传输到开发板
/usr/bin目录,添加执行权限。 - 编写
/etc/rc.local脚本,实现程序开机自启动(添加/usr/bin/net_led_control &)。 - PC 端通过
telnet 192.168.1.100 8888连接开发板,发送指令测试 LED 控制;通过scp root@192.168.1.100:/tmp/led_status.txt .读取 LED 状态。
- 编写
- 功能需求:开发板 Linux 系统运行 LED 控制程序,支持通过网络(SSH)发送指令(如 "ON""OFF""TOGGLE")控制 LED 状态;程序将 LED 状态实时写入
- 文档输出:
- 程序代码(含注释),说明
socket通信、GPIO 控制、文件写入逻辑。 - 测试报告:记录 TCP 连接成功率、LED 控制响应时间、开机自启动验证结果。
- 问题记录:如端口占用、GPIO 权限不足(需
chmod 666 /sys/class/gpio/*)的解决方法。
- 程序代码(含注释),说明
第 7 月:ZYNQ Linux 驱动开发与设备树
第 1-2 周:Linux 驱动基础与字符设备驱动
周一:Linux 驱动概述与分类
- 学习内容:
- 驱动作用:作为内核与硬件的中间层,屏蔽硬件差异,为应用程序提供统一接口(如
open/read/write)。 - 驱动分类:
- 字符设备驱动:按字节流访问(如 GPIO、UART、LED),最常用,需注册设备号、实现
file_operations结构体。 - 块设备驱动:按块访问(如 SD 卡、EMMC),支持随机读写,需实现
block_device_operations。 - 网络设备驱动:处理网络数据包(如以太网、WiFi),需实现
net_device_ops,无设备号。
- 字符设备驱动:按字节流访问(如 GPIO、UART、LED),最常用,需注册设备号、实现
- 驱动运行空间:内核空间(与用户空间隔离,需通过系统调用
syscall通信),不能直接调用用户空间函数(如printf,需用printk)。
- 驱动作用:作为内核与硬件的中间层,屏蔽硬件差异,为应用程序提供统一接口(如
- 视频资源:
- 韦东山《Linux 驱动开发入门》P1-P2:https://www.bilibili.com/video/BV19K411K7X3/
- B 站《ZYNQ Linux 驱动分类与内核空间》:https://www.bilibili.com/video/BV1sM4y1u7bH/
- 实操任务:
- 查看开发板 Linux 内核已加载的驱动:
lsmod(显示内核模块)、cat /proc/devices(显示已注册的字符 / 块设备号)。 - 查找 AXI GPIO 驱动对应的设备号(字符设备,通常在
240-255区间),记录设备名(如gpiochip0)。
- 查看开发板 Linux 内核已加载的驱动:
周二:字符设备驱动核心结构
- 学习内容:
- 核心数据结构:
file_operations,定义驱动对外提供的接口函数,关键成员包括:open:打开设备(如初始化 GPIO 方向)。read:从设备读取数据(如读取 GPIO 电平)。write:向设备写入数据(如设置 GPIO 电平)。release:关闭设备(如释放资源)。owner:通常设为THIS_MODULE,标记驱动所属模块。
- 设备号管理:
- 静态申请:
register_chrdev_region(dev_t from, unsigned count, const char *name),需提前确定设备号(如MKDEV(240, 0))。 - 动态申请:
alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name),内核自动分配,推荐使用。 - 释放设备号:
unregister_chrdev_region(dev_t from, unsigned count)。
- 静态申请:
- 设备文件创建:驱动注册后,需在
/dev目录创建设备文件(mknod /dev/led_drv c 240 0,c表示字符设备),或通过udev自动创建。
- 核心数据结构:
- 视频资源:
- 正点原子《Linux 字符设备驱动结构》P3-P4:https://space.bilibili.com/394620890/video
- B 站《file_operations 结构体详解》:https://www.bilibili.com/video/BV1KG4y1o7bX/
- 实操任务:
- 编写最简字符设备驱动框架(
led_drv.c):包含module_init(驱动初始化,申请设备号、注册file_operations)、module_exit(驱动卸载,释放设备号)、空实现的open/release函数。 - 编写
Makefile(指定内核源码路径、交叉编译器),编译生成驱动模块(led_drv.ko)。
- 编写最简字符设备驱动框架(
周三:驱动编译与加载
- 学习内容:
-
驱动 Makefile 编写:需指定内核源码路径(Petalinux 工程的内核源码在
build/tmp/work/zynq-generic-xilinx-linux-gnueabi/linux-xlnx/)、交叉编译器,核心内容:makefile
KERNELDIR := /home/user/petalinux_project/build/tmp/work/zynq-generic-xilinx-linux-gnueabi/linux-xlnx/5.15.74-xilinx-v2022.2+gitAUTOINC+xxxxxx-r0/linux-xlnx-5.15.74-xilinx-v2022.2 PWD := $(shell pwd) ARCH := arm CROSS_COMPILE := arm-linux-gnueabihf- obj-m += led_drv.o default: $(MAKE) -C $(KERNELDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules clean: $(MAKE) -C $(KERNELDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) clean -
编译命令:
make,生成led_drv.ko(内核模块文件)、led_drv.mod.c(模块依赖信息)。 -
模块加载 / 卸载:
- 加载:
insmod led_drv.ko(需 root 权限),通过dmesg查看驱动初始化日志。 - 查看:
lsmod | grep led_drv,确认模块已加载。 - 卸载:
rmmod led_drv,通过dmesg查看驱动卸载日志。
- 加载:
-
常见错误:内核版本不匹配(
version magic错误,需确保驱动编译用内核源码与开发板运行内核版本一致)、依赖模块缺失。
-
- 视频资源:
- 达尔闻《Linux 驱动 Makefile 编写与编译》P5-P6:https://darwinlearns.com/productinfo/957951.html
- B 站《ZYNQ Linux 驱动加载与卸载实战》:https://www.bilibili.com/video/BV1aG4y1a7eX/
- 实操任务:
- 完善
led_drv.c的module_init和module_exit函数,添加printk日志(如 "led_drv init success!")。 - 编写 Makefile,编译驱动模块;将
led_drv.ko传输到开发板,执行insmod加载,dmesg | tail查看日志;执行rmmod卸载,验证驱动加载 / 卸载正常。
- 完善
周四:GPIO 驱动实战(基于寄存器操作)
- 学习内容:
- ZYNQ AXI GPIO 寄存器映射:AXI GPIO 的基地址可从设备树获取(如
0x41200000),核心寄存器包括:DATA(偏移 0x00):GPIO 数据寄存器,读写 GPIO 电平。DIR(偏移 0x04):GPIO 方向寄存器,1 为输出,0 为输入。OEN(偏移 0x08):GPIO 输出使能寄存器,1 为使能输出。
- 内核空间地址映射:用户空间不能直接访问物理地址,需通过
ioremap将物理地址映射为内核虚拟地址(void __iomem *gpio_base = ioremap(0x41200000, 0x10);),卸载时用iounmap释放。 - 寄存器操作函数:内核推荐使用
readl/writel(而非直接指针操作),避免字节序问题,如:u32 dir = readl(gpio_base + 0x04);(读取方向寄存器)。writel(dir | (1 << 0), gpio_base + 0x04);(设置 GPIO0 为输出)。
- ZYNQ AXI GPIO 寄存器映射:AXI GPIO 的基地址可从设备树获取(如
- 视频资源:
- B 站《ZYNQ AXI GPIO 寄存器驱动实战》:https://www.bilibili.com/video/BV1sM4y1u7bH/
- 凡亿教育《Linux GPIO 驱动寄存器操作》P7-P8:https://m.fanyedu.com/drill/cq/details/146
- 实操任务:
- 完善
led_drv.c:在open函数中映射 AXI GPIO 基地址,配置 GPIO0 为输出;在write函数中根据传入数据(如 1 为点亮,0 为熄灭)设置DATA寄存器;在release函数中iounmap释放地址。 - 编译驱动,加载到开发板;创建设备文件(
mknod /dev/led_drv c 240 0);编写用户程序led_app.c(调用open/write控制 LED),交叉编译后运行,验证 LED 是否正常控制。
- 完善
周五:中断驱动开发(PL 到 PS 中断)
- 学习内容:
- ZYNQ 中断控制器(GIC):PS 的 GIC 支持 128 个中断,PL 中断通过
IRQ_F2P(PL 到 PS 中断)引脚接入,中断号可从设备树获取(如61)。 - 中断驱动核心步骤:
- 申请中断:
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev_id),handler为中断服务函数(ISR),flags如IRQF_TRIGGER_RISING(上升沿触发)。 - 中断服务函数:
irqreturn_t irq_handler(int irq, void *dev_id),需快速执行,避免阻塞;返回IRQ_HANDLED(中断已处理)或IRQ_NONE(未处理)。 - 释放中断:
free_irq(unsigned int irq, void *dev_id),需在驱动卸载时调用。
- 申请中断:
- 中断下半部:若中断处理逻辑复杂,可通过
tasklet或workqueue将非紧急任务放到下半部执行,避免占用中断上下文(如tasklet_schedule(&my_tasklet);)。
- ZYNQ 中断控制器(GIC):PS 的 GIC 支持 128 个中断,PL 中断通过
- 视频资源:
- 韦东山《Linux 中断驱动开发实战》P9-P10:https://www.bilibili.com/video/BV19K411K7X3/
- B 站《ZYNQ PL-PS 中断驱动实现》:https://www.bilibili.com/video/BV1KG4y1o7bX/
- 实操任务:
- 硬件准备:在 PL 中设计按键电路,按键按下时产生上升沿信号,连接到 AXI GPIO 的中断引脚(如 GPIO1 的中断),设备树中配置中断号为 61。
- 编写
key_irq_drv.c:申请中断 61(上升沿触发),中断服务函数中翻转 LED 状态;编译驱动,加载到开发板;按下按键,观察 LED 是否翻转,dmesg查看中断日志。
周六:DMA 驱动开发(PS DMA 数据传输)
- 学习内容:
- ZYNQ PS DMA 控制器:PS 内置 8 通道 DMA,支持内存到内存、内存到外设、外设到内存的高速数据传输,不占用 CPU 资源;核心特性包括
scatter-gather(分散 - 聚集)模式、中断通知。 - Linux DMA 框架:基于
dmaengine子系统,核心 API 包括:dma_request_chan:申请 DMA 通道。dma_prep_slave_single:准备单块数据传输(指定源地址、目的地址、长度、方向)。dma_submit/dma_async_issue_pending:提交并启动 DMA 传输。dma_async_wait_for_completion:等待传输完成。
- DMA 传输流程:
- 申请 DMA 通道,配置传输参数(源 / 目的地址、长度)。
- 准备传输描述符,启动 DMA。
- 传输完成后,DMA 触发中断,通知 CPU 处理数据。
- ZYNQ PS DMA 控制器:PS 内置 8 通道 DMA,支持内存到内存、内存到外设、外设到内存的高速数据传输,不占用 CPU 资源;核心特性包括
- 视频资源:
- B 站《ZYNQ PS DMA 驱动开发教程》:https://www.bilibili.com/video/BV1aG4y1a7eX/
- 达尔闻《Linux DMA 引擎框架实战》P11-P12:https://darwinlearns.com/productinfo/957951.html
- 实操任务:
- 编写
dma_mem2mem_drv.c:实现内存到内存的 DMA 传输(如从src_buf传输 1024 字节到dst_buf);在驱动中申请 DMA 通道,启动传输,等待完成后对比src_buf和dst_buf数据是否一致。 - 编译驱动,加载到开发板;运行用户程序触发 DMA 传输,
dmesg查看传输结果(如 "DMA transfer success, data match!");测试不同传输长度(1KB、1MB),记录传输时间,计算带宽。
- 编写
周日:综合驱动项目(GPIO + 中断 + DMA 协同)
- 项目任务:
- 功能需求:PL 中设计 ADC 采集模块(模拟电压采集),通过 AXI4-Stream 接口连接 PS DMA;按键按下时(中断触发),启动 DMA 传输,将 ADC 采集的 1024 字节数据从 PL 传输到 PS 内存;驱动将数据保存到
/tmp/ad_data.bin,支持用户程序读取并打印。 - 开发步骤:
- 硬件设计:在 Vivado 中添加 AXI ADC IP 核、AXI Stream Data FIFO、PS DMA,配置中断(ADC 数据就绪中断),导出 XSA 文件。
- 驱动开发(
adc_dma_irq_drv.c):申请 ADC 中断和 DMA 通道;中断触发时启动 DMA 传输;DMA 完成后读取数据,写入/tmp/ad_data.bin。 - 测试验证:编译驱动和用户程序(
read_adc.c,读取ad_data.bin并打印数据);加载驱动,按下按键,验证数据传输和保存功能。
- 功能需求:PL 中设计 ADC 采集模块(模拟电压采集),通过 AXI4-Stream 接口连接 PS DMA;按键按下时(中断触发),启动 DMA 传输,将 ADC 采集的 1024 字节数据从 PL 传输到 PS 内存;驱动将数据保存到
- 文档输出:
- 硬件 Block Design 截图,标注 ADC、FIFO、DMA 的连接关系。
- 驱动代码(含注释),说明中断处理、DMA 配置、数据保存逻辑。
- 测试报告:记录 ADC 采集精度(对比实际电压与采集值)、DMA 传输速率、中断响应时间。
第 3-4 周:设备树开发与驱动匹配
周一:设备树概述与结构
- 学习内容:
- 设备树(Device Tree)作用:替代传统 Linux 的板级文件(
board.c),用文本文件描述硬件资源(如 CPU、内存、外设地址、中断号),实现 "硬件描述与驱动代码分离"。 - 设备树文件格式:
- 后缀:
.dts(设备树源文件,针对特定板卡)、.dtsi(设备树头文件,通用硬件描述,可被多个.dts包含)。 - 编译:通过
dtc(Device Tree Compiler)编译为.dtb(设备树二进制文件),内核启动时加载。
- 后缀:
- 核心结构:
- 根节点:
/,包含compatible属性(指定板卡型号,如xlnx,zynq-7000)。 - 子节点:描述具体外设(如
/soc/gpio@41200000,@后为外设基地址)。 - 属性:键值对,如
compatible(驱动匹配标识)、reg(外设地址范围)、interrupts(中断号和触发方式)。
- 根节点:
- 设备树(Device Tree)作用:替代传统 Linux 的板级文件(
- 视频资源:
- B 站《Linux 设备树入门教程》:https://www.bilibili.com/video/BV1sM4y1u7bH/
- 正点原子《ZYNQ 设备树结构详解》P13-P14:https://space.bilibili.com/394620890/video
- 实操任务:
- 查看开发板 Linux 的设备树:
cat /proc/device-tree/compatible(查看根节点compatible属性)、ls /proc/device-tree/soc/(查看 SOC 子节点)。 - 从 Petalinux 工程
images/linux目录获取system.dts(可通过dtc -I dtb -O dts system.dtb > system.dts反编译.dtb),分析/soc/gpio@41200000节点的reg、interrupts属性。
- 查看开发板 Linux 的设备树:
周二:设备树语法与常用属性
- 学习内容:
- 基本语法:
- 节点定义:
node-name@address { ... };,node-name为节点名,address为基地址(可选)。 - 属性格式:
- 字符串:
compatible = "xlnx,axi-gpio-1.0";。 - 32 位整数:
reg = <0x41200000 0x1000>;(基地址 + 地址长度)。 - 中断属性:
interrupts = <0 61 1>;(0为中断控制器编号,61为中断号,1为上升沿触发)。 - 引用其他节点:
interrupt-parent = <&gic>;(引用 GIC 中断控制器节点)。
- 字符串:
- 节点定义:
- 常用属性:
compatible:驱动与设备匹配的关键,驱动通过of_match_table匹配该属性。reg:描述外设的物理地址范围,内核通过of_address_to_resource解析。interrupts:描述中断信息,内核通过of_irq_get获取中断号。status:设备状态,"okay"表示启用,"disabled"表示禁用。
- 基本语法:
- 视频资源:
- 韦东山《Linux 设备树语法详解》P15-P16:https://www.bilibili.com/video/BV19K411K7X3/
- B 站《ZYNQ 设备树常用属性实战》:https://www.bilibili.com/video/BV1KG4y1o7bX/
- 实操任务:
- 编写自定义设备树片段(
my_adc.dtsi):添加adc@43c00000节点,包含compatible = "my,adc-1.0"、reg = <0x43c00000 0x1000>、interrupts = <0 62 1>、interrupt-parent = <&gic>属性。 - 将
my_adc.dtsi包含到system.dts(添加#include "my_adc.dtsi"),重新编译设备树(petalinux-build -c device-tree),生成新的system.dtb;开发板加载新dtb,cat /proc/device-tree/soc/adc@43c00000/compatible验证属性。
- 编写自定义设备树片段(
周三:ZYNQ 设备树定制(基于 Petalinux)
- 学习内容:
- Petalinux 设备树目录结构:
- 默认设备树:
components/plnx_workspace/device-tree/device-tree/(包含zynq-7000.dtsi、zynq-zed.dts等)。 - 用户定制:
project-spec/meta-user/recipes-bsp/device-tree/files/,用户添加的.dtsi或.bbappend文件会覆盖默认配置。
- 默认设备树:
- 常用定制方法:
- 方法 1:添加
system-user.dtsi文件,在其中修改或添加节点(如启用 UART1、修改 GPIO 中断号)。 - 方法 2:使用
petalinux-config -c device-tree图形界面,配置硬件参数(如 DDR 容量、网口 PHY 地址)。 - 方法 3:编写
.bbappend文件,修改设备树编译选项(如添加宏定义)。
- 方法 1:添加
- 设备树编译:
petalinux-build -c device-tree,编译结果输出到images/linux/system.dtb。
- Petalinux 设备树目录结构:
- 视频资源:
- B 站《Petalinux 设备树定制实战》:https://www.bilibili.com/video/BV1aG4y1a7eX/
- 达尔闻《ZYNQ 设备树修改与编译》P17-P18:https://darwinlearns.com/productinfo/957951.html
- 实操任务:
-
在
project-spec/meta-user/recipes-bsp/device-tree/files/目录创建system-user.dtsi,添加:dts
/include/ "system.dts" &gpio@41200000 { status = "okay"; interrupts = <0 61 1>; }; &uart1 { status = "okay"; reg = <0x40001000 0x1000>; }; -
编译设备树,生成新
system.dtb;开发板加载后,ls /dev/ttyPS1确认 UART1 设备文件已创建;cat /proc/device-tree/soc/gpio@41200000/interrupts验证中断属性。
-
周四:设备树与驱动匹配(platform 驱动)
- 学习内容:
- platform 驱动框架:Linux 为嵌入式设备设计的驱动框架,基于 "设备 - 驱动" 模型,通过设备树实现匹配,核心结构:
platform_driver:驱动结构体,包含probe(设备匹配成功时调用,初始化驱动)、remove(设备移除时调用,释放资源)、of_match_table(设备树匹配表)。- 匹配流程:内核遍历设备树节点,若节点
compatible属性与驱动of_match_table中的compatible一致,则调用probe函数。
- 核心 API:
platform_driver_register:注册 platform 驱动。platform_driver_unregister:注销 platform 驱动。of_address_to_resource:从设备树节点解析reg属性,获取资源(地址、长度)。of_irq_get:从设备树节点解析interrupts属性,获取中断号。
- platform 驱动框架:Linux 为嵌入式设备设计的驱动框架,基于 "设备 - 驱动" 模型,通过设备树实现匹配,核心结构:
- 视频资源:
- 正点原子《Linux platform 驱动与设备树匹配》P19-P20:https://space.bilibili.com/394620890/video
- B 站《ZYNQ platform 驱动实战》:https://www.bilibili.com/video/BV1sM4y1u7bH/
- 实操任务:
- 基于前序
adc@43c00000设备树节点,编写adc_platform_drv.c:- 定义
of_match_table:{.compatible = "my,adc-1.0", .data = NULL},。 probe函数:解析reg属性获取 ADC 基地址,解析interrupts属性获取中断号,初始化 GPIO 和中断。remove函数:释放中断和地址映射。
- 定义
- 编译驱动,加载到开发板;
dmesg查看是否打印 "adc platform driver probe success!",确认驱动与设备树匹配成功。
- 基于前序
周五:设备树中断与 DMA 配置实战
- 学习内容:
- 设备树中断配置细节:
- 中断控制器节点:ZYNQ 的 GIC 节点通常为
/soc/interrupt-controller@f8f01000,compatible为arm,cortex-a9-gic。 - 中断属性格式:
interrupts = <IRQ_TYPE_EDGE_RISING 61>(或显式指定控制器编号、中断号、触发方式:<0 61 1>)。 - 中断亲和性:
interrupts-affinity属性,指定中断绑定的 CPU 核心(如<&cpu0>)。
- 中断控制器节点:ZYNQ 的 GIC 节点通常为
- 设备树 DMA 配置:
- DMA 控制器节点:ZYNQ 的 PS DMA 节点为
/soc/dma@f8003000,compatible为xlnx,zynq-dma-1.0。 - DMA 属性:
dma-coherent(表示 DMA 支持缓存一致性)、dma-ranges(描述 DMA 地址范围)。 - 外设 DMA 配置:在外设节点中添加
dmas = <&dma 0>(引用 DMA 控制器节点和通道)、dma-names = "tx"(DMA 通道名称)。
- DMA 控制器节点:ZYNQ 的 PS DMA 节点为
- 设备树中断配置细节:
- 视频资源:
- B 站《ZYNQ 设备树中断与 DMA 配置详解》:https://www.bilibili.com/video/BV1KG4y1o7bX/
- 凡亿教育《设备树 DMA 属性实战》P21-P22:https://m.fanyedu.com/drill/cq/details/146
- 实操任务:
-
修改
system-user.dtsi,在adc@43c00000节点中添加 DMA 配置:dts
&adc@43c00000 { dmas = <&dma 0>; dma-names = "rx"; dma-coherent; }; -
修改
adc_platform_drv.c的probe函数:通过of_property_match_string获取 DMA 通道名称,通过dma_request_slave_channel申请 DMA 通道;编译驱动,加载后dmesg查看 DMA 通道申请结果。
-
周六:设备树工具与调试方法
- 学习内容:
- 常用设备树工具:
dtc:设备树编译 / 反编译,如dtc -I dts -O dtb system.dts -o system.dtb(编译)、dtc -I dtb -O dts system.dtb -o system.dts(反编译)。fdtdump:查看.dtb文件内容,如fdtdump system.dtb | grep adc(查找 adc 节点)。ofdtget:读取设备树属性,如ofdtget system.dtb /soc/adc@43c00000 compatible(读取 compatible 属性)。
- 设备树调试方法:
- 内核日志:
dmesg | grep -i dt(查看设备树解析日志,如 "DT: parsing of /soc/gpio@41200000 node complete")。 /proc/device-tree:内核将加载的设备树以目录结构形式导出到该路径,可直接查看节点和属性。of_node_dump:内核函数,在驱动中调用可打印节点信息(需开启内核调试)。
- 内核日志:
- 常用设备树工具:
- 视频资源:
- B 站《Linux 设备树工具使用教程》:https://www.bilibili.com/video/BV1aG4y1a7eX/
- EEWorld《设备树调试实战技巧》:https://en.eeworld.com.cn/training/video/41820
- 实操任务:
- 使用
dtc反编译开发板当前加载的system.dtb(可通过cat /proc/device-tree/base/name确认路径),生成system_dump.dts,对比与原始system.dts的差异。 - 使用
ofdtget读取/soc/uart1/compatible、/soc/dma@f8003000/status属性,记录输出结果;使用dmesg | grep -i "adc"查看 ADC 节点解析日志。
- 使用
周日:综合项目(设备树 + platform 驱动 + DMA 数据采集)
- 项目任务:
- 功能需求:基于 platform 驱动框架,通过设备树配置 ADC、中断、DMA 资源;驱动实现 "按键中断触发→DMA 采集 ADC 数据→数据保存到文件" 的全流程;用户程序通过
read系统调用读取 ADC 数据,在终端打印。 - 开发步骤:
- 设备树定制:完善
adc@43c00000节点,添加compatible、reg、interrupts、dmas、dma-names属性。 - 驱动开发:实现 platform 驱动的
probe(解析设备树资源、初始化中断和 DMA)、remove(释放资源)、file_operations(read函数读取 ADC 数据)。 - 测试验证:编译驱动和设备树,加载到开发板;运行用户程序,按下按键,观察是否打印 ADC 采集数据;记录采集速率和数据精度。
- 设备树定制:完善
- 功能需求:基于 platform 驱动框架,通过设备树配置 ADC、中断、DMA 资源;驱动实现 "按键中断触发→DMA 采集 ADC 数据→数据保存到文件" 的全流程;用户程序通过
- 文档输出:
- 设备树节点代码(含注释),说明各属性的作用。
- 驱动代码(含
probe、中断服务函数、DMA 处理函数),标注设备树资源解析过程。 - 测试报告:包含采集速率(如 100KB/s)、数据误差(如 ±5mV)、驱动加载 / 卸载稳定性测试结果。
第 8 月:PL 高级编程与 PS-PL 协同优化
第 1-2 周:PL 高级逻辑设计(流水线、BRAM、DSP)
周一:PL 流水线设计原理与实现
- 学习内容:
- 流水线技术作用:将复杂逻辑拆解为多个 "阶段(Stage)",每个阶段在一个时钟周期内完成,提高电路的时钟频率(时序性能),常见于高速数据处理(如乘法、滤波、FFT)。
- 流水线关键参数:
继续生成
已完成思考
ZYNQ 系列芯片嵌入式与硬件系统知识学习全计划(基于国内视频资源)(续)
第三阶段:进阶阶段(第 6-9 月)------ 嵌入式 Linux 开发、PL 高级编程与硬件设计
第 8 月:PL 高级逻辑设计与 PS-PL 协同优化
第 1-2 周:PL 高级逻辑设计(流水线、BRAM、DSP)
周一:PL 流水线设计原理与实现(续)
- 学习内容:
- 流水线关键参数:
- 吞吐率:单位时间内处理的数据量,流水线满负荷时等于时钟频率(如 100MHz 时钟对应 100M 数据 / 秒)。
- 延迟:数据从输入到输出的总时钟周期数(如 3 级流水线延迟为 3 个时钟周期)。
- 资源消耗:每增加一个阶段需额外添加寄存器,会增加 Flip-Flop(触发器)资源占用。
- Verilog 实现方法:
-
核心思路:用寄存器将长组合逻辑 "切割" 为多个短逻辑段,每个段在 1 个时钟周期内完成。
-
示例:32 位加法器的 3 级流水线实现,将加法拆分为 "低 11 位加法→中 11 位加法→高 10 位加法",每级后添加寄存器锁存结果。
-
代码结构: verilog
module pipe_adder_32( input clk, input rst_n, input [31:0] a, b, output reg [31:0] sum ); // 第一级流水线:低11位加法 reg [10:0] sum1; reg [31:11] a1, b1; always @(posedge clk or negedge rst_n) begin if(!rst_n) begin sum1 <= 0; a1 <= 0; b1 <= 0; end else begin sum1 <= a[10:0] + b[10:0]; a1 <= a[31:11]; b1 <= b[31:11]; end end // 第二级流水线:中11位加法(含进位) reg [10:0] sum2; reg [31:22] a2, b2; reg c1; // 第一级进位 always @(posedge clk or negedge rst_n) begin if(!rst_n) begin sum2 <= 0; a2 <= 0; b2 <= 0; c1 <= 0; end else begin {c1, sum2} <= a1[10:0] + b1[10:0] + (sum1 > 11'h7ff ? 1'b1 : 1'b0); a2
-
- 流水线关键参数: