在准备嵌入式大赛或进行FPGA项目开发时你是否遇到过这样的困境信号处理算法在MATLAB上仿真完美但移植到硬件上却时序不达标、资源爆满传感器数据采集、算法加速、结果显示分散在不同模块调试起来东奔西跑系统集成度低又或者想实现一个复杂的信号处理流程却发现FPGA逻辑设计、处理器软件、外设驱动之间的协同令人头疼本文将以一个获得2025年全国大学生嵌入式芯片与系统设计竞赛FPGA赛道全国三等奖的作品——“一站式信号处理平台”为例为你系统拆解如何从零构建一个高度集成、软硬协同的FPGA信号处理系统。该平台基于Xilinx ZYNQ-7000系列SoC实现了从模拟信号采集ADC、数字信号处理DSP加速到处理结果可视化显示的完整闭环。无论你是正在备战嵌入式大赛的学生还是希望深入掌握ZYNQ软硬件协同开发的工程师都能从本文中获得从架构设计、代码实现到调试部署的全流程实战经验。1. 项目背景与核心需求分析全国大学生嵌入式芯片与系统设计竞赛是国内嵌入式领域的高水平赛事其FPGA赛道尤其注重考察选手在可编程逻辑设计、处理器系统应用以及软硬件协同方面的综合能力。传统的信号处理系统往往由多个独立模块拼凑而成例如使用单独的ADC芯片、DSP芯片和显示模块导致系统复杂、调试困难、实时性难以保证。“一站式信号处理平台”的设计目标正是为了解决上述痛点。它旨在提供一个高度集成的开发框架使得开发者能够在一个统一的平台上快速完成信号采集、算法处理、控制决策和结果展示等一系列任务。其核心需求可分解为以下几点高集成度利用ZYNQ SoC的PS处理系统和PL可编程逻辑一体化优势将数据采集、预处理、核心算法、人机交互等功能集成于单芯片。实时性对于音频、振动等信号的处理需要低延迟、高确定性的响应。PL部分的硬件并行加速是保障实时性的关键。灵活性平台需要支持多种信号处理算法的快速部署与验证例如FFT快速傅里叶变换、FIR/IIR滤波、调制解调等。可扩展性预留标准接口如AXI、GPIO、I2C、SPI方便接入不同类型的传感器如麦克风、加速度计和输出设备如LCD、VGA。易用性提供清晰的软件驱动和硬件IP接口降低上层应用开发的难度让开发者更专注于算法本身。基于这些需求我们选择了Xilinx ZYNQ-7000作为核心。其双核Cortex-A9处理器PS负责运行Linux系统管理任务调度、文件系统和网络通信而FPGAPL部分则作为高性能协处理器实现数据采集接口和计算密集型算法的硬件加速。2. 系统整体架构与硬件平台选型一个稳健的架构是项目成功的基石。本平台的系统架构遵循“传感器→采集→处理→显示/输出”的经典信号链并充分利用ZYNQ的软硬件划分。2.1 系统架构框图整个系统可以划分为硬件层、硬件抽象层、算法库和应用层。[传感器/信号源] -- [ADC采集模块 (PL)] -- [AXI-Stream/DMA] -- [信号处理IP核 (PL)] | [用户输入/网络] -- [Linux系统 应用软件 (PS)] -- [AXI-Lite/GPIO] -- [显示/控制接口 (PL)] | [LCD/OLED/VGA显示]PL侧硬件加速与接口ADC采集控制器负责与外部ADC芯片如ADI的AD7606、TI的ADS127L01通信实现高速、高精度数据采样。通常通过SPI或并行接口实现。信号处理IP核根据需求实现的硬件加速模块如FFT、FIR滤波器、CORDIC用于计算三角函数、幅度相位等。这些模块以流水线方式工作吞吐量高。显示控制器驱动LCD或VGA用于实时显示波形、频谱图等。AXI互联总线连接PS和PL的“高速公路”。AXI-Stream用于高速数据流如ADC数据流AXI-Lite用于PS对PL寄存器的低速配置如设置滤波器系数。PS侧系统控制与交互Linux操作系统使用PetaLinux或手动构建的Linux系统提供文件系统、网络、多线程等支持。应用程序基于C/C开发负责通过/dev/mem或UIOUserspace I/O驱动与PL寄存器交互配置IP核。通过DMA直接内存访问从PL接收处理后的数据。实现图形界面如QT或命令行界面用于参数设置和结果显示。提供网络服务如Web服务器支持远程监控。2.2 核心硬件平台与器件选型主控芯片Xilinx ZYNQ-7010/7020。这是大赛常用且性价比极高的型号。7010逻辑资源较少适合算法较简单的项目7020资源更丰富可实现更复杂的处理流水线。ADC芯片ADI AD7606。这是一款8通道、16位、同步采样ADC支持并行和串行SPI接口采样率最高可达200kSPS非常适合多路信号采集场景。其与FPGA的接口设计是硬件关键之一。显示模块RGB接口LCD屏如4.3寸、800*480或VGA接口。RGB接口可直接由PL端的LCD控制器驱动性能好VGA则需要一个简单的RGB转VGA模块。存储ZYNQ板载的DDR3作为程序运行和数据处理的主内存QSPI Flash用于存储Bootloader、比特流和Linux内核镜像。其他按键、LED、UART转USB芯片用于调试。选型考量在竞赛中选择成熟、资料多的器件能极大降低硬件调试风险。AD7606和RGB LCD在开源社区有大量参考设计。同时需仔细阅读器件数据手册确保FPGA的IO电平如LVCMOS与外围器件匹配必要时需进行电平转换或端接处理。3. 开发环境搭建与工程创建“工欲善其事必先利其器”。搭建一个高效的开发环境是第一步。3.1 软件工具清单Vivado Design Suite (推荐2018.3或2020.1版本)用于ZYNQ硬件平台设计、IP集成、逻辑综合、布局布线和生成比特流文件。大赛环境通常较旧使用稳定版本兼容性更好。Vitis / Xilinx SDK用于PS端裸机或Linux应用软件的开发、编译和调试。Vitis是新一代统一软件平台但SDK在某些简单场景下更轻量。PetaLinux Tools用于构建定制化的Linux系统包括U-Boot、Linux内核、设备树和根文件系统。串口调试工具如Putty、MobaXterm或SecureCRT用于查看系统启动日志和应用打印信息。文本编辑器/IDE如VS Code用于编写Verilog/VHDL和C/C代码。3.2 创建Vivado硬件工程这是构建硬件系统的核心步骤。新建工程打开Vivado创建新工程选择对应的ZYNQ器件型号如xc7z020clg400-1。使用IP Integrator创建Block Design添加ZYNQ Processing System IP核并运行“Block Automation”和“Connection Automation”完成基本连接DDRFIXED_IO。在ZYNQ IP配置中根据板卡原理图使能所需的外设如UART、I2C、SPI、GPIO等并为PL部分分配时钟如FCLK_CLK0 100MHz。添加自定义IP核这是项目的核心。你需要将ADC控制器、信号处理模块等封装成AXI接口的IP。方法Vivado中创建或导入自定义IP。对于ADC控制器通常实现为AXI-Lite从机用于配置以及AXI-Stream主机用于输出数据。连接与地址分配将自定义IP的AXI接口连接到ZYNQ的AXI互联矩阵上。使用Run Connection Automation自动连接时钟、复位和中断。在Address Editor中为每个IP分配唯一的基地址PS端的软件将通过这些地址访问IP寄存器。生成输出产品与顶层封装在Block Design上右键选择Generate Output Products和Create HDL Wrapper让Vivado生成整个系统的网表文件。综合、实现与生成比特流点击Generate Bitstream。这个过程可能较长期间会完成综合、布局布线。如果遇到时序违例需要回头优化代码或添加约束。3.3 关键代码示例AD7606 SPI控制器Verilog核心AD7606支持并行和SPI模式。SPI模式节省IO口但速度稍慢。以下是SPI读取控制的状态机核心代码片段// 文件ad7606_spi_ctrl.v module ad7606_spi_ctrl ( input wire clk, // 主时钟如50MHz input wire rst_n, // 低电平复位 input wire start_conv, // 启动转换信号由定时器或外部触发 output reg convst, // AD7606转换开始引脚 output reg sclk, // SPI时钟 output reg sdata, // SPI数据输出配置AD7606时使用读取时通常为高阻 input wire [15:0] din, // 从AD7606并行数据口读取的数据SPI模式下此信号可能来自另一个模块 output reg [15:0] dout, // 读取到的ADC数据 output reg dout_vld, // 数据有效信号 // AXI-Stream Master接口信号简化 output reg [31:0] m_axis_tdata, output reg m_axis_tvalid, input wire m_axis_tready ); // 状态定义 localparam S_IDLE 3d0; localparam S_CONV_START 3d1; localparam S_CONV_WAIT 3d2; localparam S_READ_CH1 3d3; // ... 其他通道状态 localparam S_DONE 3d7; reg [2:0] state, next_state; reg [7:0] clk_cnt; reg [3:0] bit_cnt; reg [15:0] shift_reg; always (posedge clk or negedge rst_n) begin if (!rst_n) begin state S_IDLE; convst 1b1; // 默认高电平 sclk 1b0; dout_vld 1b0; clk_cnt 8d0; end else begin state next_state; case (state) S_IDLE: begin convst 1b1; if (start_conv) begin next_state S_CONV_START; clk_cnt 8d0; end end S_CONV_START: begin convst 1b0; // 拉低CONVST启动转换 clk_cnt clk_cnt 1; // 保持低电平至少25ns根据数据手册 if (clk_cnt 8d5) begin // 假设时钟50MHz5个周期100ns convst 1b1; next_state S_CONV_WAIT; clk_cnt 8d0; end end S_CONV_WAIT: begin // 等待转换完成BUSY信号变低此处需连接AD7606的BUSY引脚 // 为简化用固定延时模拟 clk_cnt clk_cnt 1; if (clk_cnt 8d100) begin // 等待约2us next_state S_READ_CH1; bit_cnt 4d15; // 准备读取16位数据 shift_reg 16d0; end end S_READ_CH1: begin // 模拟SPI读取每个sclk下降沿采样数据 if (bit_cnt 0) begin sclk ~sclk; if (sclk) begin // 下降沿 shift_reg[bit_cnt] din[15]; // 假设din是来自AD7606的串行数据 bit_cnt bit_cnt - 1; end end else begin // 读取完毕 dout shift_reg; dout_vld 1b1; // 将数据写入AXI-Stream接口 if (m_axis_tready) begin m_axis_tdata {16h0, shift_reg}; // 32位数据高16位补零或填充通道号 m_axis_tvalid 1b1; next_state S_DONE; end end end S_DONE: begin m_axis_tvalid 1b0; dout_vld 1b0; next_state S_IDLE; end default: next_state S_IDLE; endcase end end endmodule关键点实际项目中需要根据AD7606数据手册精确设计转换时序和SPI通信时序并处理好BUSY信号。数据通过AXI-Stream接口输出便于后续模块如DMA或FIFO接收。4. 信号处理算法硬件加速实现将算法从软件迁移到硬件是提升性能的关键。我们以实时FFT快速傅里叶变换和FIR滤波器为例。4.1 使用Xilinx FFT IP核实现频谱分析Vivado提供了高度优化的FFT IP核支持多种点数、数据格式和流水线结构。IP配置在Block Design中添加Fast Fourier Transform 9.1IP核。通道数1。变换长度1024点根据需求选择点数越多分辨率越高资源消耗越大。数据格式定点数Fixed Point根据ADC数据位宽设置如16位输入输出位宽可适当扩展。架构选择Pipelined, Streaming I/O以实现持续流水线计算吞吐量最高。缩放方式Scaled以在计算过程中进行缩放防止溢出。接口连接将ADC控制器输出的AXI-Stream数据连接到FFT IP的s_axis_data_tdata同时连接tvalid和tready信号。将FFT的输出连接到后续模块如DMA或幅值/相位计算模块。控制逻辑FFT IP需要ap_start信号触发。可以设计一个控制模块当收集够1024个ADC样本后启动一次FFT计算。4.2 自定义FIR滤波器IP核对于定制化的滤波需求可以自己编写FIR滤波器。下面是一个对称结构、节省资源的FIR滤波器Verilog示例。// 文件fir_filter.v module fir_filter #( parameter DATA_WIDTH 16, parameter COEF_WIDTH 16, parameter TAP_NUM 21, parameter COEF_FILE fir_coef.mif // 系数文件由MATLAB生成 )( input wire clk, input wire rst_n, input wire signed [DATA_WIDTH-1:0] data_in, input wire data_in_vld, output reg signed [DATA_WIDTHCOEF_WIDTH-1:0] data_out, output reg data_out_vld ); // 系数寄存器从ROM初始化 reg signed [COEF_WIDTH-1:0] coeff [0:TAP_NUM-1]; initial begin $readmemb(COEF_FILE, coeff); // 使用readmemh或readmemb加载系数 end // 数据移位寄存器链 reg signed [DATA_WIDTH-1:0] delay_line [0:TAP_NUM-1]; integer i; always (posedge clk or negedge rst_n) begin if (!rst_n) begin for (i0; iTAP_NUM; ii1) delay_line[i] 0; end else if (data_in_vld) begin // 移位 for (iTAP_NUM-1; i0; ii-1) delay_line[i] delay_line[i-1]; delay_line[0] data_in; end end // 乘累加计算利用对称性优化 reg [31:0] mac_result; // 位宽扩展防止溢出 reg calc_en; always (posedge clk or negedge rst_n) begin if (!rst_n) begin mac_result 0; calc_en 0; data_out 0; data_out_vld 0; end else begin if (data_in_vld) begin calc_en 1; mac_result 0; // 对称FIRh(n) h(N-1-n) for (i0; iTAP_NUM/2; ii1) begin mac_result mac_result (delay_line[i] delay_line[TAP_NUM-1-i]) * coeff[i]; end // 如果点数为奇数加上中间项 if (TAP_NUM % 2) begin mac_result mac_result delay_line[TAP_NUM/2] * coeff[TAP_NUM/2]; end end else if (calc_en) begin // 计算完成输出这里简化了流水线实际可能需要多个周期 data_out mac_result; // 可能需要截位或舍入 data_out_vld 1b1; calc_en 0; end else begin data_out_vld 1b0; end end end endmodule设计要点系数生成使用MATLAB的fir1或fdesign工具设计滤波器导出定点系数并保存为.coe或.mif文件供Vivado ROM IP使用。资源优化对称结构FIR可以减少近一半的乘法器。对于长阶滤波器还可以采用转置结构或使用DSP Slice。时序乘累加操作可能产生较长组合逻辑路径需要寄存器打拍以满足时序。5. PS端Linux应用开发与软硬件协同硬件平台搭建好后需要在PS端编写软件来控制整个系统。5.1 构建Linux系统与设备树使用PetaLinux在Vivado导出硬件描述文件.xsa后在PetaLinux项目中导入自动生成基础的设备树、内核配置和根文件系统。关键设备树节点需要确保自定义的AXI IP在设备树中有对应的节点以便Linux内核可以识别并加载驱动。例如对于一个AXI-GPIO IP用于控制LED// 在 system-user.dtsi 或 pl.dtsi 中 axi_gpio_0 { compatible xlnx,xps-gpio-1.00.a; reg 0x41200000 0x10000; // 基地址和范围与Vivado中一致 #gpio-cells 2; gpio-controller; };编译与烧写编译得到BOOT.BIN包含FSBL、比特流、U-Boot和image.ub内核、设备树、根文件系统将其放入SD卡或QSPI Flash。5.2 用户空间应用程序开发我们开发一个简单的C语言应用通过Linux的/dev/mem或UIO驱动来访问PL端IP并通过DMA接收数据。// 文件main.c #include stdio.h #include stdlib.h #include stdint.h #include fcntl.h #include sys/mman.h #include unistd.h // 假设自定义IP的寄存器映射 #define IP_BASE_ADDR 0x43C00000 // Vivado Address Editor中的地址 #define IP_REG_CTRL (IP_BASE_ADDR 0x00) // 控制寄存器 #define IP_REG_STATUS (IP_BASE_ADDR 0x04) // 状态寄存器 #define IP_REG_DMA_ADDR (IP_BASE_ADDR 0x08) // DMA目标地址寄存器 #define IP_REG_DMA_LEN (IP_BASE_ADDR 0x0C) // DMA长度寄存器 #define CTRL_START_BIT (1 0) #define STATUS_DONE_BIT (1 0) int main() { int fd; volatile uint32_t *ip_virt_addr; uint32_t dma_buffer[1024]; // 假设接收1024个32位数据 // 1. 打开 /dev/mem fd open(/dev/mem, O_RDWR | O_SYNC); if (fd -1) { perror(open /dev/mem failed); return -1; } // 2. 内存映射将物理地址映射到用户空间虚拟地址 ip_virt_addr (volatile uint32_t *)mmap(NULL, 4096, // 映射一页大小 PROT_READ | PROT_WRITE, MAP_SHARED, fd, IP_BASE_ADDR); if (ip_virt_addr MAP_FAILED) { perror(mmap failed); close(fd); return -1; } printf(IP mapped at virtual address: %p\n, ip_virt_addr); // 3. 配置DMA目标地址物理地址 // 注意需要将用户空间缓冲区的虚拟地址转换为物理地址这里简化处理。 // 实际项目中通常使用连续物理内存如CMA或通过驱动分配DMA缓冲区。 uint32_t dma_phy_addr (uint32_t)dma_buffer; // 这是错误的仅用于示意。 // 正确做法使用libxil或内核驱动提供的DMA分配函数。 *(ip_virt_addr 2) (uint32_t)dma_phy_addr; // 写DMA_ADDR寄存器 *(ip_virt_addr 3) sizeof(dma_buffer); // 写DMA_LEN寄存器 // 4. 启动IP核 printf(Starting IP...\n); *(ip_virt_addr 0) CTRL_START_BIT; // 写CTRL寄存器启动位 // 5. 轮询等待完成 while (!(*(ip_virt_addr 1) STATUS_DONE_BIT)) { usleep(1000); // 睡眠1ms } printf(IP processing done.\n); // 6. 读取处理后的数据这里假设数据已由DMA写入dma_buffer for (int i 0; i 10; i) { // 打印前10个数据 printf(data[%d] 0x%08X\n, i, dma_buffer[i]); } // 7. 清理 munmap((void*)ip_virt_addr, 4096); close(fd); return 0; }重要说明上述DMA地址映射是严重简化的。在实际Linux用户空间不能直接使用malloc的地址作为DMA地址。正确做法是编写一个简单的字符设备驱动使用dma_alloc_coherent分配DMA缓冲区并提供ioctl给应用层配置和启动DMA。或者使用Xilinx提供的AXI DMAIP核及其对应的xdma驱动它会在/dev下创建设备节点应用层通过read/write或mmap来访问数据。5.3 使用AXI DMA IP进行高效数据传输对于高速数据流如ADC持续采样推荐使用Vivado中的AXI DMAIP核。硬件连接将ADC控制器或FFT IP的AXI-Stream输出连接到DMA的S_AXIS_S2MMStream to Memory Map接口。将DMA的M_AXI_S2MM连接到ZYNQ的HP高性能AXI端口。软件驱动Linux内核已包含xdma驱动。使能CONFIG_XILINX_DMA和CONFIG_XILINX_AXIDMA。应用程序通过打开/dev/xdmaX_chrdev等设备文件使用ioctl如XDMADMA_START来控制DMA传输数据可以直接read到用户缓冲区。6. 系统集成、调试与固化6.1 上板调试流程硬件连接连接ADC输入信号、LCD显示屏、串口线、JTAG下载器和电源。下载比特流通过Vivado Hardware Manager将生成的.bit文件下载到FPGA。启动Linux将SD卡插入板卡上电。在串口终端中观察U-Boot和Linux启动日志。测试底层功能使用devmem命令直接读写IP寄存器验证硬件通路是否正常。# 读取0x43C00000地址的值 devmem 0x43C00000 32 # 向0x43C00000写入1 devmem 0x43C00000 32 1运行编译好的应用程序观察打印信息和信号输出。信号验证使用信号发生器产生标准正弦波输入ADC在LCD上观察波形和频谱是否正常。6.2 常见问题与排查思路问题现象可能原因排查步骤Vivado生成比特流失败时序违例逻辑设计时钟频率过高或关键路径延迟太大。1. 查看时序报告找到违例路径。2. 对关键路径添加寄存器打拍Pipeline。3. 优化代码结构减少组合逻辑级数。4. 降低时钟频率或使用更优的布局布线策略。PS端程序无法读取PL寄存器地址映射错误、AXI互联配置问题、IP未复位或未使能。1. 确认Vivado中分配的地址与软件中使用的地址一致。2. 检查Block Design中AXI互联是否连接正确。3. 在软件中先读取一个已知的寄存器如版本寄存器测试。4. 使用Vivado的ILA集成逻辑分析仪抓取AXI总线信号看是否有读写事务产生。ADC采样数据不正确时序不满足ADC芯片要求、SPI模式配置错误、参考电压或模拟地不干净。1. 使用ILA抓取ADC的CONVST、SCLK、SDATA、BUSY等引脚波形与数据手册对比。2. 检查ADC的配置寄存器如范围、滤波是否设置正确。3. 测量ADC的模拟电源和参考电压是否稳定。4. 检查PCB布局模拟和数字地分割与单点连接是否正确。DMA传输数据错乱或丢失DMA缓冲区地址未对齐、长度设置错误、中断未正确处理、AXI-Stream的tready信号被置低。1. 确保分配的DMA缓冲区地址和长度符合IP要求如128字节对齐。2. 检查DMA IP的配置数据宽度、突发长度。3. 抓取AXI-Stream接口的tvalid、tready、tdata信号看数据流是否连续。4. 在驱动中检查DMA传输完成中断是否被触发和处理。Linux启动卡住或报错设备树描述错误、内核配置缺失驱动、根文件系统损坏、Bootloader参数错误。1. 仔细查看串口启动日志定位卡在哪一步。2. 检查设备树中内存节点、时钟节点、自定义IP节点是否正确。3. 确认内核配置中使能了所需的外设驱动如USB、网络、FPGA Manager。4. 使用petalinux-boot工具在QSPI模式下烧写时若卡死检查Flash型号是否支持或尝试降低时钟频率。6.3 系统固化烧写至QSPI Flash竞赛作品需要脱离JTAG和SD卡独立运行因此必须将系统固化到板载的非易失存储器中。生成固化文件在Vivado中File - Export - Export Hardware包含比特流。在Vitis/SDK中创建FSBLFirst Stage Bootloader工程。使用Create Boot Image工具将FSBL.elf、system.bit硬件比特流和u-boot.elf或bl31.elf、u-boot.elf组合打包成BOOT.BIN。准备Linux镜像将Linux内核image.ub包含内核、设备树、根文件系统单独存放。烧写至QSPI Flash方法一U-Boot命令将BOOT.BIN和image.ub先拷贝到SD卡启动到U-Boot命令行然后使用sf命令擦除和烧写QSPI。# 在U-Boot中 fatload mmc 0 0x10000000 BOOT.BIN sf probe 0 0 0 # 探测QSPI Flash sf erase 0x0 0x100000 # 擦除足够大的空间 sf write 0x10000000 0x0 ${filesize} # 烧写BOOT.BIN到起始地址 fatload mmc 0 0x10000000 image.ub sf write 0x10000000 0x100000 ${filesize} # 烧写image.ub到偏移地址方法二Vivado Hardware Manager直接通过JTAG将.mcs或.bin文件烧录到Flash。配置启动模式将板卡的启动模式跳线设置为QSPI启动重新上电系统应从Flash自动加载。7. 项目总结与进阶思考通过“一站式信号处理平台”的完整实现我们走通了ZYNQ软硬件协同开发的典型流程从硬件架构设计、IP核开发、Vivado系统集成到Linux驱动、应用程序开发最后系统调试与固化。这不仅是一个竞赛作品更是一个可复用的开发框架。项目亮点总结软硬协同充分发挥了ZYNQ PS和PL的各自优势PS负责复杂控制和交互PL负责实时采集和算法加速。模块化设计ADC控制器、FFT、FIR滤波器等模块均封装为标准AXI接口IP可像搭积木一样重组快速构建不同应用。实时性保障关键信号处理链路在PL中以硬件并行方式实现延迟确定不受Linux系统调度影响。完整的开发链涵盖了从硬件描述语言、嵌入式Linux到上层应用的完整技能栈。进阶优化方向性能优化使用HLS高层次综合将C/C算法直接转换为硬件IP提升开发效率。对关键算法进行流水线深度优化提高系统吞吐量。功能扩展增加更多信号处理算法IP核如IIR滤波器、CORDIC解调、PID控制器。添加网络接口如Ethernet实现远程数据监控和参数配置。结合摄像头实现图像信号处理。可靠性提升实现MultiBoot功能在QSPI Flash中存储多个比特流镜像通过软件触发切换用于系统升级或冗余备份。增加看门狗和系统状态监控。低功耗设计在PS端使用CPU闲时降频、动态关闭PL部分时钟域等技术优化系统功耗这对于电池供电的应用尤为重要。对于初学者可以从一个简单的“LED控制”或“串口回环”实验开始逐步增加ADC采样、DMA传输、简单算法处理等模块循序渐进地掌握整个平台。遇到问题时善用ILA进行在线调试多查阅Xilinx官方文档UG和社区论坛大部分坑都有前人踩过。