恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
复旦微FMQL45T900开发板实战:从开箱到异构程序跑通与ZYNQ对比
首页
资讯中心
/
复旦微FMQL45T900开发板实战:从开箱到异构程序跑通与ZYNQ对比
复旦微FMQL45T900开发板实战:从开箱到异构程序跑通与ZYNQ对比
发布时间:2026/9/27 2:28:42
1. 为什么我会把目光转向复旦微FMQL45T900第一次拿到复旦微FMQL45T900开发板的时候我其实没抱太高期待。过去几年做FPGA项目手边几乎清一色是Xilinx的板子从ZYNQ-7020到ZYNQ UltraScale工具链、IP核、调试流程都熟得不能再熟。但这两年国产FPGA的呼声越来越高尤其是复旦微的FMQL系列主打的就是“PS端ARMPL端FPGA”的异构架构对标的就是Xilinx ZYNQ这条产品线。FMQL45T900这个型号PL端逻辑资源大约相当于Artix-7 200T级别PS端集成了四核ARM Cortex-A53还带GPU和AI加速单元纸面参数相当能打。我这次拿到的开发板是官方评估板板载DDR4、eMMC、千兆网口、HDMI输出、MIPI接口还有FMC扩展座。说实话第一眼看到板子的做工和接口布局确实有点意外——国产开发板以前给人的印象往往是“能用就行”但这块板子的电源设计、时钟树布局、高速接口走线明显是认真做过的。当然参数好看不代表好用真正决定能不能落地的是工具链的成熟度、调试的便利性以及遇到问题时能不能快速找到资料。这篇文章我就从实际使用的角度把这块板子从开箱到跑通第一个异构程序的全过程拆开来讲同时会穿插和Xilinx ZYNQ的对比给正在选型或者想尝鲜国产FPGA的朋友一个参考。2. 开发板硬件拆解与核心器件选型逻辑2.1 板载资源一览与接口布局先看板子上的核心配置。FMQL45T900芯片本身是FCBGA封装引脚间距0.8mm焊在板子中央。围绕它的是两片DDR4颗粒总容量4GB位宽64bit挂在PS端的内存控制器上。PL端单独挂了一片512MB的DDR3L用于做视频帧缓存或者高速数据采集的缓冲。存储方面eMMC 8GB用来装Linux系统QSPI Flash 64MB用来存BOOT和PL配置码流。接口部分一个千兆以太网口PS端RGMII一个HDMI 2.0输出PL端一个MIPI CSI输入接口一个USB 3.0 OTG一个USB-UART调试口一个SD卡槽一个FMC LPC扩展座还有若干PMOD和GPIO排针。这个配置放在ZYNQ阵营里大概对应的是ZYNQ-7045或者ZYNQ UltraScale ZU3EG这个级别。但FMQL45T900的PS端是四核A53比ZYNQ-7000系列的双核A9要新两代算力上优势明显。PL端逻辑单元数量在200K左右Block RAM和DSP Slice的数量也够做中等规模的图像处理或者通信基带。我特意查了一下官方数据手册PL端的DSP Slice是900个这个数字在国产FPGA里算是相当慷慨了做FIR滤波或者矩阵运算的时候不会太捉襟见肘。2.2 电源与时钟设计稳定性的根基开发板的电源设计是我比较在意的地方。整板供电是12V DC输入然后通过多路PMIC和LDO分别给PS端、PL端、DDR、外设供电。PS端核心电压0.85VPL端核心电压0.9VDDR4是1.2VDDR3L是1.35V。我拿万用表实测了一下各路电压的纹波在满载情况下PS端核心电压的纹波大概在20mV以内PL端在30mV左右这个表现算是合格。要知道FPGA最怕的就是电源不稳尤其是PL端在做高速逻辑翻转的时候电流突变很容易引起电压跌落导致时序违例甚至死机。这块板子在电源部分用了不少钽电容和陶瓷电容组合看得出是做过仿真优化的。时钟方面板子上有一颗50MHz的有源晶振给PS端做参考时钟另外一颗200MHz的差分晶振给PL端做高速收发器的参考。还有一颗24MHz的晶振给USB和以太网PHY。PL端还有一组Si5338时钟发生器可以输出多路不同频率的时钟方便做多时钟域设计。这个配置比很多入门级ZYNQ板子要厚道ZYNQ-7020的很多板子只给一个33.333MHz的单端晶振做高速接口的时候还得自己外挂时钟芯片。2.3 与Xilinx ZYNQ的硬实力对比把FMQL45T900和ZYNQ-7045放在一起比PS端FMQL是四核A531.5GHzZYNQ-7045是双核A91.0GHz制程上FMQL是28nmZYNQ-7045是28nm但A53的IPC比A9高不少所以PS端算力FMQL大概是ZYNQ-7045的2.5倍以上。PL端逻辑资源两者接近但FMQL的DSP Slice更多Block RAM略少。接口方面FMQL支持PCIe Gen2 x4ZYNQ-7045支持PCIe Gen2 x8这点ZYNQ略胜。但FMQL45T900支持MIPI D-PHYZYNQ-7000系列原生不支持MIPI需要外挂芯片转换这在做摄像头或者显示应用的时候FMQL反而更方便。价格上我查了一下市场报价FMQL45T900芯片单颗大概在800-1000元人民币ZYNQ-7045芯片单颗在1500-2000元人民币。开发板的话FMQL45T900官方评估板大概3000元左右而同等配置的ZYNQ-7045开发板普遍在5000元以上。这个价差对于批量出货的产品来说成本优势非常明显。当然选型不能只看硬件成本工具链的授权费用、开发效率、技术支持响应速度都是隐性成本这些后面会详细说。3. 工具链搭建与第一个工程跑通3.1 开发环境安装与License配置复旦微的FPGA工具链叫Procise界面风格和Xilinx的Vivado有点像但底层引擎是自研的。我下载的是最新版Procise 2023.2安装包大概8GB安装过程还算顺利但有几个坑要注意。第一安装路径不要有中文和空格否则综合的时候会报奇怪的错误。第二License需要向复旦微申请如果是评估板用户板子包装里会附带一个License文件有效期一年。第三Procise对Windows版本有要求Win10 64位专业版最稳Win11家庭版我试过偶尔会闪退建议用专业版。PS端的开发环境是复旦微定制的Linux SDK基于Yocto构建里面包含了交叉编译工具链、U-Boot、Kernel和根文件系统。SDK的安装比较简单解压后运行一个脚本就行但要注意SDK的路径也不能有中文。我是在Ubuntu 20.04的虚拟机里装的SDK分配了8GB内存和200GB硬盘编译内核的时候大概用了40分钟比Xilinx的PetaLinux要快一些可能是因为Yocto的配置做了精简。3.2 创建第一个异构工程PS端Hello World PL端LED闪烁跑通第一个工程是建立信心的关键。我在Procise里新建了一个工程选择FMQL45T900器件然后添加了一个Block Design。PS端的配置和Vivado里配ZYNQ很像需要设置DDR型号、时钟频率、外设引脚复用。这里有个细节要注意FMQL的PS端引脚复用配置比ZYNQ要复杂一些因为它的MIO引脚数量更多功能映射关系更密第一次配的时候容易搞混。我的建议是直接参考官方提供的板级配置文件里面已经把DDR、以太网、USB、SD卡的配置都做好了直接导入就行不用自己从头配。PL端我写了一个最简单的LED闪烁逻辑一个24位的计数器最高位输出到LED引脚。综合、实现、生成比特流整个过程大概用了6分钟比Vivado编译同样规模的工程要快可能是因为Procise的综合引擎对中小规模设计的优化更好。生成比特流之后通过Procise的下载器把比特流烧到PL端同时通过SDK把Linux系统烧到eMMC里。这里有个坑FMQL的启动模式选择是通过板子上的拨码开关设置的QSPI启动、SD启动、eMMC启动的拨码组合不一样我第一次没注意拨错了结果板子一直停在BootROM阶段串口没有任何输出。后来查了手册才发现拨码开关的位置改过来之后系统正常启动。3.3 串口调试与系统启动验证串口是调试异构系统最重要的工具。FMQL45T900开发板上的USB-UART接口用的是CH340芯片Windows下需要装驱动Linux下免驱。串口波特率默认是1152008N1。系统启动的时候串口会打印U-Boot的启动信息然后加载Kernel最后进入Linux命令行。我第一次启动的时候Kernel在加载到一半的时候卡住了串口输出停在“Starting kernel...”之后就没有了。排查了半天发现是设备树里的DDR容量配置和实际板子不一致板子是4GB DDR4但设备树里写的是2GB导致Kernel访问高地址内存的时候出错。修改设备树重新编译之后系统正常启动进入命令行后可以用ifconfig看到以太网口用ls /dev可以看到PL端的设备节点。这里插一句FMQL的Linux内核版本是5.10比Xilinx PetaLinux 2023.2的5.15要老一些但基本的外设驱动都很全。PL端和PS端的数据交互可以通过AXI总线Procise里提供了AXI GPIO、AXI DMA、AXI Stream等IP核用法和Vivado里的同名IP几乎一样如果你之前用过ZYNQ迁移过来学习成本很低。4. 异构通信实战PL端数据采集与PS端处理4.1 AXI DMA配置与带宽测试异构架构最大的价值在于PS端和PL端的分工协作。我设计了一个简单的数据采集系统PL端做一个16位的计数器每个时钟周期加一通过AXI Stream接口把数据送到DMADMA再把数据搬到PS端的DDR里PS端的应用程序从DDR里读数据做累加和校验。这个测试主要是验证AXI总线的带宽和DMA的稳定性。在Procise里配置AXI DMA的时候有几个参数需要特别注意。首先是数据位宽我设的是16位和PL端的计数器输出一致。其次是Buffer Length我设的是8192字节这个值不能太小太小的话DMA中断太频繁PS端CPU占用率会很高也不能太大太大的话DDR的占用会影响到其他外设。我实测下来8192字节是一个比较平衡的值。然后是Scatter-Gather模式如果要做连续的大数据量传输建议开启SGDMA这样DMA可以自动链式搬运多个Buffer不需要PS端频繁干预。带宽测试的结果在PL端时钟100MHz的情况下AXI Stream的持续带宽大概在180MB/s左右这个数字和ZYNQ-7045的AXI HP接口带宽理论值约1.2GB/s实测约400MB/s相比有差距但考虑到FMQL的PL端时钟频率和AXI位宽我用的64位这个成绩算是正常。如果换成128位AXI位宽带宽应该能翻倍。这里要提醒一句AXI总线的带宽不仅取决于位宽和时钟还和DDR控制器的效率有关。FMQL的DDR控制器在随机访问模式下的效率大概在60%左右顺序访问能到85%以上所以做DMA的时候尽量用顺序访问。4.2 PL端逻辑设计中的时序约束时序约束是FPGA设计里最容易被忽视但又最致命的部分。我在PL端设计里加了一个简单的SPI Master用来读取外部传感器的数据。SPI的时钟是25MHz理论上时序很宽松但综合之后Procise报告了一个建立时间违例路径是从SPI的移位寄存器到输出引脚。我检查了一下发现是输出引脚没有加ODELAY约束导致Procise在布局布线的时候把寄存器放得离引脚太远走线延迟超过了时钟周期。解决方法是加一条输出延迟约束set_output_delay -clock [get_clocks spi_clk] -max 2.0 [get_ports spi_mosi]。这个约束告诉工具从寄存器到引脚的延迟不能超过2ns。加了约束之后重新布局布线违例消失。这里要强调一下FMQL的时序约束语法和Xilinx的XDC基本兼容但有些命令的参数名不一样比如set_false_path在Procise里叫set_false_path但set_clock_groups的写法略有不同具体要查Procise的约束手册。4.3 PS端应用程序开发与性能调优PS端的应用程序我是在Linux下用C写的通过mmap把DMA的物理地址映射到用户空间然后直接读数据。这里有个关键点DMA的Buffer必须是物理连续的所以在Linux下要用dma_alloc_coherent来分配不能用普通的malloc。我一开始用malloc分配Buffer结果DMA搬过来的数据全是乱的后来改成dma_alloc_coherent才正常。性能调优方面我试过几种方案。第一种是轮询模式PS端死循环读DMA的状态寄存器一旦DMA完成就处理数据。这种模式延迟最低但CPU占用率100%只适合单任务场景。第二种是中断模式DMA完成之后触发中断PS端在中断服务程序里处理数据。这种模式CPU占用率低但中断延迟大概在10-20微秒适合对实时性要求不极端的场景。第三种是DMA多线程一个线程专门等DMA中断另一个线程处理数据中间用环形缓冲区传递。这种模式吞吐量最高我实测下来在1MB/s的数据率下CPU占用率不到5%。5. 与Xilinx ZYNQ的深度对比工具链、生态与踩坑记录5.1 工具链成熟度对比Vivado的成熟度不用多说从综合、实现、仿真到调试整个流程非常顺滑IP核丰富文档齐全遇到问题网上搜一下基本都能找到答案。Procise作为后来者在界面和流程上已经做得很像了但细节上还有差距。比如Vivado的Block Design支持自动连线Procise的Block Design需要手动连很多线虽然也有自动连接功能但有时候会连错。再比如Vivado的ILA集成逻辑分析仪非常好用可以实时抓PL端的信号Procise也有类似的功能叫PL Debugger但触发条件的设置没有ILA灵活抓深层信号的时候需要手动例化调试核。不过Procise有一个优点编译速度快。同样规模的设计Vivado要跑20分钟Procise大概12分钟就能跑完。这可能是因为Procise的综合引擎对国产器件的底层结构做了针对性优化而Vivado要兼容太多器件系列通用性牺牲了效率。5.2 IP核与参考设计丰富度Xilinx的IP核库是它的护城河从AXI互联到视频处理从以太网到PCIe几乎你能想到的都有现成的IP。复旦微的IP库还在建设中常用的AXI GPIO、AXI DMA、AXI Timer、AXI UART这些都有但视频处理、高速接口的IP相对少一些。比如我想做一个MIPI CSI-2的接收Xilinx有现成的MIPI CSI-2 RX Subsystem IP拖进去配一下就能用。FMQL这边官方提供了一个MIPI的参考设计但需要自己改RTL代码灵活性高但工作量也大。参考设计方面复旦微官网提供了不少板级参考设计包括以太网通信、HDMI显示、MIPI采集、PCIe传输等但文档的详细程度参差不齐。有些参考设计只有源码没有说明文档需要自己读代码理解。Xilinx的参考设计通常配有XAPP文档步骤清晰截图详细这点上复旦微还需要追赶。5.3 实际踩坑记录与解决思路第一个坑Procise的License和MAC地址绑定换网卡或者换电脑之后License失效需要重新申请。这个机制比Vivado的License严格Vivado的License可以绑定到License Server上多台电脑共用。如果你的开发团队有多个人建议申请一个License Server版本的License。第二个坑FMQL的PS端DDR配置和实际板子不一致的问题。我前面提到过设备树里DDR容量写错导致Kernel卡死后来发现Procise的PS配置界面里DDR容量选项和实际板子的DDR颗粒容量有时候对不上需要手动改。建议拿到板子之后先用官方提供的板级配置文件不要自己从头配。第三个坑PL端比特流加载方式。ZYNQ支持通过PS端的PCAP接口加载PL比特流也支持从QSPI Flash加载。FMQL也支持这两种方式但PCAP加载的时候比特流的头部格式和Xilinx的bit文件不一样需要用Procise的工具转换成.bin格式。我第一次直接把.bit文件写到QSPI里结果PL端一直不工作后来用Procise的bit2bin工具转换之后才正常。6. 国产FPGA的适用场景与选型建议6.1 什么项目适合用FMQL45T900从我这段时间的使用体验来看FMQL45T900适合以下几类项目。第一类是工业控制和自动化PS端跑Linux做上层管理和通信PL端做多轴电机控制或者高速IO采集四核A53的算力足够跑复杂的控制算法。第二类是图像处理PL端做图像的预处理去马赛克、滤波、边缘检测PS端做后处理和显示MIPI接口原生支持省去了外挂芯片的成本。第三类是通信设备PL端做基带处理PS端做协议栈PCIe接口可以接上位机或者加速卡。第四类是教学和科研价格比ZYNQ开发板便宜不少适合批量采购。不太适合的场景也有。第一类是需要大量高速收发器的项目FMQL45T900的GTH收发器数量比同级别的ZYNQ要少做多通道高速通信的时候可能不够用。第二类是需要成熟IP核的项目比如视频编解码、PCIe Gen3、100G以太网这些Xilinx有现成的IPFMQL要么没有要么还在开发中。第三类是对工具链稳定性要求极高的项目Procise虽然已经能用但偶尔还是会遇到一些莫名其妙的bug比如综合的时候报一个不存在的错误重启软件就好了。6.2 从ZYNQ迁移到FMQL的注意事项如果你之前一直用ZYNQ想迁移到FMQL有几个地方需要提前准备。首先是RTL代码的兼容性Verilog和VHDL的语法基本通用但有些Xilinx的专用原语比如IDDR、ODDR、BUFG在FMQL里名字不一样需要替换。其次是约束文件XDC的语法大部分兼容但有些命令的参数需要调整。再次是IP核的替换Xilinx的IP核不能直接在Procise里用需要用FMQL的对应IP重新例化。最后是调试手段ILA换成PL DebuggerVitis换成复旦微的SDK使用习惯上需要适应。迁移的成本主要在于IP核的重新开发和调试工具的适应纯RTL代码的迁移成本不高。如果项目里用了大量的Xilinx IP迁移的工作量会比较大。如果项目主要是自己写的RTL迁移相对容易。6.3 采购与技术支持渠道FMQL45T900开发板可以通过复旦微的官方代理商购买也可以在几个主流的电子元器件平台上找到。价格方面官方评估板大概3000元第三方做的核心板底板方案大概1500-2000元。芯片的采购周期目前大概在8-12周比前两年有所改善但还是要提前备货。技术支持方面复旦微有官方论坛和技术支持邮箱响应速度还可以一般工作日24小时内会有回复。代理商也会提供一定的技术支持但水平参差不齐建议优先走官方渠道。另外复旦微的GitHub上有一些开源参考设计和工具脚本虽然更新不算频繁但关键的资料都能找到。7. 一些实操心得与后续扩展方向7.1 调试效率提升的几个小技巧第一个技巧Procise的工程文件建议用Git管理但要注意把生成的中间文件比如综合网表、布局布线结果排除掉只保留源码和约束文件。Procise的工程文件是XML格式的合并冲突的时候比较容易解决。第二个技巧PL端的调试信号尽量在顶层引出不要埋在子模块里。Procise的PL Debugger对深层信号的抓取支持不如Vivado的ILA如果信号在子模块里需要手动例化调试核比较麻烦。在顶层引出信号之后可以直接在Debugger里添加。第三个技巧PS端的应用程序建议用perf工具做性能分析看看CPU时间花在哪里。我一开始以为DMA搬运是瓶颈用perf分析之后发现瓶颈在内存拷贝上后来改成零拷贝的方式性能提升了30%。7.2 后续可以尝试的扩展项目跑通基础的数据采集之后我打算做几个扩展项目。第一个是MIPI摄像头的实时图像处理PL端做去马赛克和色彩空间转换PS端做目标检测用OpenCV或者轻量级的神经网络。第二个是PCIe数据采集卡PL端做高速ADC的接口PS端做数据打包和网络传输。第三个是多板级联通过千兆以太网或者PCIe把多块FMQL板子连起来做分布式计算。这些扩展项目的难度依次递增但基础都是PS-PL的异构通信。如果你也想尝试建议先把AXI DMA和中断调通这是异构通信的核心。然后再根据具体应用加PL端的逻辑和PS端的应用。7.3 关于国产FPGA生态的一点个人看法说实话国产FPGA这两年的进步是肉眼可见的。FMQL45T900的硬件设计已经达到了可以商用的水平工具链虽然还有差距但基本的功能都能用而且迭代速度很快。我去年用Procise 2022.1的时候综合一个中等规模的设计要跑15分钟今年用2023.2同样的设计只要8分钟效率提升明显。生态建设是个慢功夫Xilinx花了三十年才建立起今天的护城河国产FPGA不可能一蹴而就。但如果你愿意花点时间适应工具链愿意在遇到问题时自己动手解决FMQL45T900是一个值得考虑的选择。尤其是在成本敏感、供货周期要求短的项目里国产FPGA的优势会越来越明显。最后分享一个我在调试过程中总结的小经验遇到Procise报错的时候先看日志文件日志在工程目录的logs文件夹里里面会记录详细的错误信息。很多时候报错信息只是表象真正的错误在日志的后面几行。另外Procise的官方论坛虽然帖子不多但质量还可以搜索错误代码的时候经常能找到答案。如果实在找不到直接发邮件给技术支持附上日志文件和工程文件他们回复得还挺快的。