ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

复旦微FMQL45异构SoC上跑通LED流水灯:Vivado全流程实战解析

复旦微FMQL45异构SoC上跑通LED流水灯:Vivado全流程实战解析 做FPGA开发的人十有八九是从点灯开始的。但同样是点灯拿到国产复旦微FMQL45这种ARMFPGA异构SoC平台整个流程和纯FPGA开发板还是有明显差别的。FMQL45系列集成了双核ARM Cortex-A9处理器和可编程逻辑软硬件协同的特性让它比单纯跑Verilog多了一层复杂度也正是这层复杂度让一个LED流水灯实验从工程创建到硬件调试走下来能把Vivado的完整开发链路、约束设计、在线调试方法全部串一遍。这篇文章我一共分七个部分来讲从FMQL45的芯片架构理解、Vivado环境准备、RTL工程创建、代码与约束设计到综合实现、比特流生成、JTAG下载和在线调试全部基于我实际操作的记录整理。适合刚入手国产FPGA平台、之前只玩过纯逻辑FPGA、或者正卡在工程建好了但板子不亮这个环节的朋友参考。全程记录我在FMQL45上跑通LED流水灯的每一步操作、每一处报错和对应的解决办法属于可以直接照着复现的操作笔记。1. 一块板子两个世界先搞懂FMQL45到底在做什么1.1 FMQL45和Zynq-7000的血缘关系拿到复旦微FMQL45开发板第一件事不是急着开Vivado而是先理解你手上这块芯片的定位。FMQL45是复旦微电子推出的嵌入式处理器芯片片内同时集成了PSProcessing System处理器系统和PLProgrammable Logic可编程逻辑两大部分。PS端是双核ARM Cortex-A9主频可以跑到1GHz上下跑Linux、跑裸机程序都没问题PL端是FPGA逻辑资源用来做高速并行处理、自定义外设接口。这套架构和Xilinx Zynq-7000系列非常接近开发工具链也基本沿用了Vivado生态。所以你在网上搜FMQL45的资料会发现大量Zynq-7000的实验教程可以直接参考寄存器地址、AXI总线接口、甚至部分IP核的使用方式都有很高的相似度。但也别高兴太早国产芯片在细节上一定有你需要注意的地方比如个别外设的寄存器偏移、时钟管理单元的配置方式、以及开发板上引脚分配的差异这些都得靠自己看原理图和芯片手册来确认。这里插一句和你选型相关的经验FMQL45在不少工业控制、电力电子、机器视觉项目里出现频率很高。原因很简单——国产化需求ARM和FPGA在一颗芯片里整板面积和功耗都下来了通信带宽还比板间互连高一个量级。对于想接触异构SoC开发、又希望技术栈能迁移到实际项目的人来说这是个很合适的入门平台。1.2 为什么LED实验并不像看起来那么简单你可能觉得LED实验不就是写个计数器、翻转几个IO吗在纯FPGA开发板上确实如此。但FMQL45开发板上的LED接在PL端的IO上你要让它们亮起来至少要走通这么几条链路Vivado工程创建时芯片型号选择必须和板上实际芯片一致RTL逻辑设计需要绑定正确的引脚位置和IO电平标准综合Synthesis、实现Implementation、生成比特流Bitstream每一步都要没有致命错误用下载器连接板子时JTAG链要能被Vivado识别比特流下载到PL后时钟、复位、引脚极性任何一环不对LED都不会按预期工作。每一步都可能出问题。我见过不少刚上手的工程师代码写得完全正确最后卡在引脚没约束或者JTAG识别不到设备上。所以这篇文章我刻意把看上去很简单的步骤也展开讲因为对FMQL45这类平台来说工具链的坑往往比逻辑设计的坑更多。2. 开发环境准备Vivado装对了后面才不折腾2.1 版本选择不是越新越好FMQL45开发使用的工具链是Vivado。复旦微官方资料里通常推荐Vivado 2019.2或2020.2版本这个信息很关键。我最初图省事装了2022.2结果工程建好之后总觉得别扭——不是说完全不能用而是部分IP核的默认配置界面变了早期国产例程的脚本和约束文件在新版本下会有兼容性提醒排查起来多花时间。实验下来我的建议是尽量和开发板资料包里的Vivado版本保持一致。如果你拿到板子时配套资料是2019.2的例程那就装2019.2没有配套资料的情况下2020.2算是一个兼容性比较好的版本。版本的选择会直接影响后面跑IP核配置、跑综合实现时的行为别在版本上给自己添堵。安装本身没什么特别的门道Windows和Linux都行。我自己调试PL逻辑时在Windows下用Vivado如果需要把PS端Linux跑起来再切到Ubuntu环境做交叉编译。装的时候有几个点提醒一下安装路径不要带中文和空格不要装在C盘系统目录里Vivado对路径解析偶尔会出幺蛾子安装时勾选Vivado HL WebPACK或HL Edition即可FMQL45的逻辑规模用WebPACK版本够用不需要Vivado HLx版本含Vitis相关组件的完整安装除非你后面要搞SDSoC/Vitis流程License方面如果你没有正版授权可以用评估版LicenseVivado会免费提供标准版评估功能全开申请完放在指定目录就行。2.2 下载器驱动先搞定这个再开干FMQL45开发板常见的调试下载器有两种一种是板载的JTAG调试器插上USB线电脑就能识别另一种是需要外接的Xilinx平台电缆USB下载器类似DLC10兼容款。不论哪种Windows下都要装驱动。我第一次接上板子时Vivado的Hardware Manager里一直显示No hardware target设备管理器里看是未知设备。原因很简单驱动没装上。解决方法是在Vivado安装目录下找到data/xicom/cable_drivers/nt64这个文件夹里面有个dpinst_amd64.exe右键以管理员身份运行装完重新拔插USB线设备管理器里就能看到Xilinx USB Cable之类的设备了。另外注意有些国产开发板的JTAG模式需要拨码开关配合。比如板子上有BOOT模式选择你需要把启动模式拨到JTAG档而不是QSPI或SD卡档。这个细节非常容易忽略我调试时不只一次遇到啊拨码没拨过来的情况。上电前先把板子的跳线和拨码确认一遍养成习惯。2.3 软硬件路径的工程化习惯环境装好后建议建一个统一的工程目录结构。我自己习惯这样组织project/ ├── rtl/ # 所有RTL源码 ├── xdc/ # 约束文件 ├── ip/ # 自定义IP或IP核生成目录 ├── sim/ # 仿真相关文件 ├── vivado/ # Vivado工程文件 └── doc/ # 原理图、数据手册、笔记好处很明显工程规模一大文件组织不乱版本管理也好做。很多初学者喜欢把Vivado工程直接建在桌面上、文件名随便起等到做集成项目时几十个文件堆在一起找起来真要命。FMQL45实验阶段规模小但你迟早要在这块平台上做更复杂的设计一开始就养成规范后面省心。3. 从零创建Vivado工程每一步都讲清楚为什么3.1 选择RTL工程而不是IP Integrator打开Vivado后创建工程时有几个模板选项。LED实验这种纯PL逻辑设计选RTL Project就行不要一上来就点IP IntegratorBlock Design。原因很简单IP Integrator主要用于搭建PS和PL之间的系统级连接比如把Cortex-A9处理器、AXI总线、DMA控制器这些模块用图形化方式连起来。纯LED流水灯用不到PS端资源直接在RTL里写逻辑、绑定引脚就够了。等你后面要做PS控制PL外设的实验再回到IP Integrator把Zynq PS核拖出来接上AXI GPIO之类的外设IP那个流程完全是另一套玩法。FMQL45的芯片型号在Vivado里怎么选这里有个细节复旦微的芯片在Vivado器件列表里对应的可能是FMQL45T900或类似的兼容型号标识。如果你找不到直接叫FMQL45的选项先查一下手头板卡用的具体芯片丝印再在Vivado的Device列表里按封装、速度等级筛选出对应项。我的经验是参考开发板资料包里的Vivado工程找到官方例程的.xpr文件右键用记事本打开搜索Part字段里面会明确写着器件型号照抄就不会错。3.2 工程创建流程中的几个关键选项创建RTL工程的流程是File → New Project → Next → 填工程名和路径 → 选Project Type为RTL Project → Add Sources暂时可以不加后面再添加→ Add Constraints同样可以后面再加→ 选择器件型号 → Finish。这中间有几个选项值得你注意Do not specify sources at this time推荐勾上先创建空工程再看结构避免一次性把文件路径引错后面全乱Project Location路径建议直接放到你规划的vivado/目录下工程名用led_run这种有意义的命名不要用test1、test2Default Part选对型号是头等大事选错了后面综合实现会报各种奇奇怪怪的问题。工程创建好之后第一件事是检查左侧Flow Navigator导航栏里的Project Settings确认一下Top Module名字、目标语言Verilog这些基本信息。养成这个习惯后面添加文件时才不会因为顶层模块指定错误而找不到起点。3.3 添加源文件RTL和约束的正确姿势在Sources窗口里右键 → Add Sources把rtl/目录下的led_run.v加进来。注意这里有两种添加方式Add or create design sources和Add or create constraints。RTL文件归设计源文件XDC约束文件归约束文件两者不要混在一起添加。添加RTL文件时有个常见困惑Vivado会自动根据模块的例化关系识别顶层但如果文件里写了多个module或者文件名和module名不一致Vivado可能会选错顶层模块。这时你需要在Sources窗口里右键目标模块 → Set as Top。约束文件也是同理多个XDC文件存在时Vivado会按它们在工程里的顺序依次处理。LED实验只有一个XDC文件不存在这个问题但当你的设计包含MMCM时钟约束、物理约束、时序例外多条文件时文件的顺序会影响约束覆盖关系到时候记得留意。4. 跑马灯逻辑与约束文件30行代码背后的三个重点4.1 Verilog代码设计计数器与移位寄存器LED跑马灯的逻辑很简单核心就是分频计数和移位输出。在我们的开发板上LED一般有4个或8个我这里按4个LED的写法来展示引脚和极性以你手头板子的原理图为准。module led_run( input wire clk, // 板载时钟一般50MHz input wire rst_n, // 复位低有效 output reg [3:0] led // 4个LED ); reg [25:0] cnt; // 计数器每50_000_000个时钟周期清零一次对应1秒 always (posedge clk or negedge rst_n) begin if (!rst_n) cnt 26d0; else if (cnt 26d49_999_999) cnt 26d0; else cnt cnt 1b1; end // 移位每秒把LED点亮位向左移动 always (posedge clk or negedge rst_n) begin if (!rst_n) led 4b0001; else if (cnt 26d49_999_999) led {led[2:0], led[3]}; end endmodule如果你用的板载时钟是100MHz计数器要改成26d99_999_999清零如果是33.333MHz改成26d33_333_332。这个计算方式就是时钟频率减一举例来说50MHz时钟下计数49_999_999个周期正好是1秒因为计数器是从0开始数的到49_999_999一共数了50_000_000个周期也就是1秒。这里有个代码层面的细节我故意把计数器和移位逻辑写在两个always块里。实际综合时两个块都受同一时钟和复位控制功能上完全没问题。但如果你把cnt和led的赋值混在同一个always块里也没有错只是逻辑看起来不够清晰。我建议按功能划分always块一个管计数、一个管输出这种风格在工程代码里更常见也方便后续把LED的功能扩展成多种显示模式。4.2 XDC约束引脚位置和电平标准一个都不能少写完Verilog只是第一步真正让代码落到板子上的是约束文件。FMQL45开发板的LED引脚并不是固定焊在某个通用IO上不同厂商的板子引脚分配完全不同。我在XDC里写的是位置约束和电平标准约束格式如下set_property PACKAGE_PIN AA16 [get_ports {led[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}] set_property PACKAGE_PIN AB16 [get_ports {led[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {led[1]}] set_property PACKAGE_PIN AC15 [get_ports {led[2]}] set_property IOSTANDARD LVCMOS33 [get_ports {led[2]}] set_property PACKAGE_PIN AD15 [get_ports {led[3]}] set_property IOSTANDARD LVCMOS33 [get_ports {led[3]}] set_property PACKAGE_PIN AB17 [get_ports {clk}] set_property IOSTANDARD LVCMOS33 [get_ports {clk}] create_clock -period 20.000 -name sys_clk [get_ports {clk}] set_property PACKAGE_PIN AB18 [get_ports {rst_n}] set_property IOSTANDARD LVCMOS33 [get_ports {rst_n}]上面的引脚名是我按常见开发板风格写的占位你拿到自己的FMQL45板子后一定要按原理图里LED、时钟、复位实际连接的引脚来改。把原理图对应页截图放大看找到网络标号比如LED_D1、SYS_CLK、RESET_N再在芯片引脚列表里查到对应的封装引脚名填进XDC里。引脚约束之外时钟约束也很重要。即使在LED实验这种低速设计里我仍然建议加上create_clock。它不光是让时序分析有据可依更重要的是Vivado在Implementation阶段如果发现时钟端口没有任何约束会报时序约束不足的警告。养成给所有时钟端口添加时序约束的习惯等以后做高速接口时会非常受益。4.3 LED极性问题低有效还是高有效这是LED实验里最容易踩的坑。很多板子的LED一端接电源、另一端通过限流电阻接到FPGA引脚FPGA输出低电平时LED才亮这叫低有效反过来FPGA输出高电平时LED点亮叫高有效。写代码之前先看一眼原理图。如果原理图上LED的阳极接3.3V、阴极通过电阻接到FPGA引脚那么是低有效你的RTL里要让某个LED熄灭时输出1点亮时输出0。上面的示例代码是为高有效设计的如果板子是低有效可以在约束里加一句set_property DRIVE LOW [get_ports {led[0]}]或者更简单——在RTL里把输出取反assign led_high_active ~led_low_active;总之LED实验的代码虽然只有几十行但引脚查错一个、极性搞反一个板子上的现象就完全不一样。这也是我为什么反复强调先看原理图再看例程最后写代码的原因。5. 综合、实现与比特流生成红线报错处理实录5.1 完整流程的四个阶段和顺序Vivado左侧Flow Navigator里从Synthesis到Bitstream是一条线Run Synthesis → Run Implementation → Generate Bitstream。每一步在运行前都会让你选择运行策略直接保持默认即可。这里有一个操作习惯的问题很多初学者习惯一股脑点Generate BitstreamVivado会弹窗提示Launch runs on 8 cores之类的然后就开始自动跑综合、实现、生成比特流。好消息是如果一切顺利一条命令就出结果坏消息是一旦中间哪一步出错日志里报一串黄线加红线新手很容易懵。我的建议是分步操作每一步看结果再迈下一步先点Run Synthesis等综合结束确认没有error综合结束后在打开的Synthesis Design窗口里点菜单栏的Open Elaborated Design先检查一下有没有语法错误、模块例化是否正确再到约束文件里检查引脚约束是否有效此时可以用Edit Constraints直接添加引脚约束也可以等Implementation阶段检查确认无问题后Run Implementation跑完后看一眼时序报告Timing Summary和利用率报告Utilization都通过了再Generate Bitstream。这个顺序能让你在最短时间里定位问题出在哪个阶段。比如综合报错大概率是语法错误或模块名写错实现报错大概率是引脚约束冲突或逻辑太紧只有时序违例比如关键路径WNS为负需要回到RTL去优化结构或改约束策略。5.2 常见报错实录DRC RTSTAT-2和它的朋友们我在LED实验过程中遇到的第一个红线报错就是DRC RTSTAT-2。这属于Implementation阶段Report DRC检查出来的规则违例通常是这样的提示[DRC RTSTAT-2] I/O port is not constrained: The I/O port led[0] is not constrained ...翻译过来就是你有IO端口没有做引脚约束。出现这个报错直接去检查XDC文件有没有成功例化到工程里、引脚名和RTL顶层端口名是否一致。我排查过一次发现是约束文件里引脚写成了LED[0]而RTL端口名是小写led[0]TCL对大小写敏感直接匹配不上。另一个高发报错是时序违例Timing ViolationLED实验本身逻辑简单其实不太可能出现严重违例但如果你把时钟约束的频率写错比如板子实际是50MHz你却写了create_clock -period 10.000100MHzVivado按照100MHz去布局布线时序自然紧张可能报WNS为负。解决办法就是把周期改回实际频率。还有一类问题不是报错而是导出比特流成功但板子上没反应。这种问题往往出在JTAG链识别、下载器接线、电源供电这些硬件环节我放到下一节细说。5.3 比特流文件哪儿去了三种下载方式对比Generate Bitstream完成后Vivado会生成.bit文件默认路径在工程目录下的.runs/impl_1/里。以LED实验为例文件名叫led_run.bit。下一步就是把bit文件下载到FMQL45开发板上。下载bit文件有几种不同方式我按使用频率列一下下载方式适用场景特点Vivado Hardware Manager直接下载日常调试最快点两下就能看现象掉电丢失通过Vivado生成下载配置Program Flash固化到QSPI Flash掉电不丢上电自动加载用SDK/命令行工具下载自动化脚本、批量烧录适合产线或脚本化流程LED实验阶段用第一种就够了。打开Hardware Manager → Open Target → Auto Connect识别到设备后右键设备 → Program Device选中bit文件烧进去。上电后观察LED现象符合预期就说明整个PL链路是通的。这里必须提醒一个概念直接Program Device下载的是bit文件这种下载方式掉电就没有了。如果想让程序在开发板上电后自动运行需要把配置固化到QSPI Flash里。固化操作在Hardware Manager里选Add Configuration Memory Device选择板载Flash型号生成.bin或.mcs文件再烧写。国产平台的Flash型号有时候在Vivado列表里显示的不是原厂型号需要手动指定兼容型号这部分我建议参考开发板资料包里的指导文档不要盲选。6. 硬件调试实录从bit加载失败到LED点亮6.1 硬件连接和JTAG识别检查把bit文件下载到FMQL45板上之前先做一组硬件检查。我的调试顺序是这样确认开发板电源指示灯亮核心电压正常FMQL45的功耗不算低劣质USB线供电可能导致上电后反复重启最好用规格匹配的电源适配器确认JTAG下载器和开发板连接稳固如果是外接下载器检查排线方向有没有插反Pin1对准如果是板载下载器USB线直接连电脑确认BOOT模式拨码在JTAG档位这点我在前面提过但值得再强调一次打开设备管理器在通用串行总线设备或调试设备分类下看到Xilinx相关设备再进Vivado。如果Hardware Manager里Auto Connect后显示No hardware target最常见的原因是驱动问题或线缆问题。换一根USB线试试很多时候数据线只有充电功能没有数据线芯这种线接上根本没反应。另外Vivado版本和下载器固件不兼容也可能导致识别失败可以到Xilinx官网下载更新一下cable drivers。6.2 下载bit后的三种现场情况连接识别正常、点击Program Device后无外乎三种情况情况一进度条走完、LED按预期跑起来。大功告成恭喜你但别急着关掉窗口后面调试ILA、固化Flash还要用到这个环境。情况二下载时报错比如ERROR: [Labtools 27-2229] Device configuration failed。这种一般是配置时序或电平问题。检查JTAG链路有没有其他设备占用了同一条链检查板子是不是进入了异常状态把电源断掉重新上电、Refresh设备后再试一次。有一点需要注意Vivado识别了设备但配置失败往往和PS端启动模式有关——FMQL45的PS端如果正在从SD卡启动LinuxPL配置有可能被干扰把启动拨到JTAG模式通常会解决这个问题。情况三下载成功但LED没有任何反应。这个问题最隐蔽我在后面单独开一节讲排查思路。6.3 用ILA观察内部信号调试不止看现象LED实验如果逻辑没反应除了肉眼盯着灯看更高效的排查手段是用Vivado的ILAIntegrated Logic Analyzer来观测FPGA内部信号。ILA相当于一个可以嵌入到设计里的逻辑分析仪可以把你想看的信号比如计数器cnt、LED寄存器led在FPGA运行时实时抓出来。加入ILA的常用方式有两种在RTL代码里直接例化ILA IP核Vivado IP Catalog里搜ILA配置探针数量和位宽综合完成后在Synthesis Design中右键信号 → Mark Debug再走实现流程。我LED实验里其实没有用到ILA计数器逻辑一眼就能推断问题但打个比方如果你做的是SPI接口的驱动数据总是不对凭肉眼是看不出毛病的ILA就能帮你看到每一个时钟边沿上的信号变化。所以提前了解ILA的使用流程后面做复杂实验时能省一大半排查时间。ILA例化的基本思路是在RTL里把要观察的信号接到ILA IP的probe端口并把时钟接给ILA。下载bit后在Hardware Manager里会自动弹出ILA调试界面配置好触发条件比如cnt 26d123Run Trigger就能看到触发边沿前后的波形。实测下来Vivado的ILA功能完全能胜任低速到百兆级信号的调试是FMQL45平台上非常趁手的工具。6.4 LED不亮的排查路线图下载成功但LED不亮按优先级排查以下项目我的实际经验是绝大多数问题出在最后两项电源检查万用表量一下板子上3.3V、1.8V、VCC_INT等关键电源轨是否正常LED本身的供电是否来自3.3V还是独立电源域时钟检查确认Vivado的时钟约束的频率和板上晶振一致用示波器或万用表频率档量一下晶振是否起振有的板子晶振是PS端专供的PL端需要用PS的FCLK输出或者板上另有PL时钟晶振复位检查确认复位引脚的电平逻辑和代码一致如果代码是高有效复位板上默认拉低就会导致一直处于复位态LED极性低有效和高有效搞反现象是完全相反的——电路上反了的灯会常亮代码控制的那一盏不亮其余常亮这种问题看着像没反应其实是完全亮了引脚约束引脚绑错位置驱动信号根本没到LED那颗引脚上。这种问题最坑因为Vivado不会报错——你约束的引脚是一个悬空IO输出电平在那里翻转但LED根本不在那。我建议在新板卡上做LED实验时先把约束文件写成点亮固定某个LED比如led 4b0001下载确认这盏灯亮了再去写流水灯的位移逻辑。这样能把硬件通路和代码逻辑分成两个步骤验证排查问题快得多。7. 常见问题速查表与踩坑记录7.1 排查表从报错信息到解决方案我把FMQL45平台LED实验前后遇到的典型问题整理成了一张速查表供你直接对照现象原因解决方案Vivado安装时提示WinPcap安装失败Vivado依赖WinPcap用于仿真和部分调试功能系统权限或安全软件拦截以管理员身份安装WinPcap或单独下载WinPcap安装后再运行Vivado安装程序Hardware Manager提示No hardware target驱动未安装USB线是充电线设备被其他程序占用重装dpinst_amd64.exe驱动换数据线关闭其他调试软件Program Device失败 / Device configuration failedJTAG模式不对电源不稳启动模式拨码在非JTAG档拨到JTAG启动模式检查电源重新上电Refresh设备DRC RTSTAT-2报错IO端口没有约束文件或约束名不匹配检查XDC文件是否添加、引脚名是否和RTL端口完全一致综合或实现时报错未指定顶层工程未能自动识别顶层模块右键模块 → Set as Top下载成功但LED全灭可能处于复位态时钟没来极性搞反先用固定电平点亮单个LED测试通路检查复位电平和极性下载成功但LED常亮极性搞反低有效设计成了高有效修改RTL输出极性或在约束中调整驱动方式时序报告WNS为负时钟约束频率大于实际频率布局布线压力大检查create_clock周期是否符实际使用更高速度等级或优化代码固化到QSPI后上电无反应Flash型号选错、启动模式不在QSPI档参考官方资料选兼容Flash型号把启动拨码拨到QSPI档这张表我建议保存下来尤其是前几行工具链相关的问题是最耗时也最影响心情的。7.2 我的三个独家避坑心得第一芯片型号眼看手查新板卡永远优先以官方例程为准。创建工程时不要想当然官方例程的工程文件里会直接写明所用器件型号跟着走比自己猜稳妥得多。这在我第一次创建FMQL45工程时省了不少时间当时我差点按Zynq-7045的型号去建工程了。第二先点亮一颗灯再写流水灯。这个习惯救了我很多次。每次拿到新板子我从来不会直接把完整设计烧进去而是先写一个只有让LED_D1输出规定的电平的极简工程下载后确认这颗灯能亮能灭再在此基础上扩展逻辑。板上通路验证过了代码再有问题就只管查代码不互相甩锅。第三日志要分段看报错要追根。Vivado的日志信息非常多报错出现时不要只看最后三行。我的经验是先看综合阶段的critical warning再看实现阶段的DRC报告最后才看bitstream生成阶段的错误。很多时候bitstream生成失败只是前面实现阶段遗留问题的连锁反应根因早就在DRC报告里写明白了。养成从日志里找第一次出现error的位置的习惯比反复重新跑工程有效得多。第四针对FMQL45这类国产平台资料包和官方论坛是最高效的学习入口。复旦微官方提供的例程虽然不多但每一个都很有参考价值。拿到例程后我会先把它完整跑一遍确认环境没问题然后再从例程里删掉PS部分、修改成自己的逻辑。这样能大幅降低第一次接触不熟悉芯片时的挫败感。7.3 下一步还能玩什么LED实验跑通后意味着你的FMQL45开发环境已经全线打通Vivado工程创建、RTL编写、约束设计、综合实现、JTAG下载、硬件排错这几个核心环节你都有体感了。这之后有几个值得尝试的方向在PL里添加一个UART IP核通过串口把FPGA内部信号发到电脑上看建立最简单的FPGA→PC通信链路学习PS端的裸机或Linux开发把双核ARM Cortex-A9跑起来再通过AXI总线用ARM控制PL端的LED体会真正的软硬件协同尝试用IP Integrator搭建一个基于AXI GPIO的Block Design把CPU和外设连接起来这算是FMQL45开发的核心玩法了。我自己在FMQL45上做完LED实验之后最强烈的感觉是这个平台的上手曲线确实比纯FPGA要陡一些因为增加了PS端的知识和工具链的复杂度但一旦把这条链路跑通后面做PetaLinux启动、AXI外设扩展、甚至是简单的图像采集处理实验都会顺畅很多。LED实验的小恰恰是它适合作为第一个跑通全流程项目的原因——知识点集中问题点少出了问题也容易定位。把这套流程吃透再往上叠加复杂度时你就已经站在一个知道问题出在哪个环节的起点上了。
返回列表