资讯动态

国产FPGA开发实战:基于AXP100与紫光Logos-2的PDS全流程指南

发布时间:2026/10/22 11:56:53 来源:尧图企业网站定制
1. 从一块国产FPGA开发板说起这套组合到底解决什么问题手里这块黑金AXP100开发板搭配紫光同创的Logos-2系列FPGA再装上Pango Design SuitePDT大家一般叫PDX或者直接叫PDS开发工具是我最近几个月一直在折腾的组合。说实话第一次听说紫光FPGA时很多人的第一反应都是“国产FPGA好不好用”“工具链会不会很难上手”尤其是用惯了Vivado或者Quartus的工程师对这种新工具天然带点怀疑。但实际用下来这套国产组合的完成度比我预想的高不少——Pango Design Suite该有的功能几乎都有从工程创建、RTL编写、综合布局布线到时序约束、逻辑分析、在线调试流程走通之后你会发现它其实就是“换了个皮”的成熟FPGA开发环境没有想象中那么大的门槛。这篇文章不是官方教程的复读而是我从拿到AXP100开发板、装好PDS、跑通第一个流水灯再到调DDR、抓时序、排坑的完整过程复盘。内容面向两类人一类是想从Xilinx/Altera转过来体验国产FPGA的工程师另一类是刚接触FPGA、准备拿Logos-2练手的学生或爱好者。我尽量把关键步骤、参数选择逻辑、踩过的坑都写清楚照着做基本能省下一大半摸索时间。1.1 选型第一步Logos-2在紫光产品线里是什么定位紫光同创的FPGA产品线大体分两个方向高端的是Titan系列主打大容量高性能面向通信、计算这类需要SerDes和大量DSP资源的场景主流性价比的是Logos系列逻辑规模中等、功耗控制好、价格友好适合工控、显示、接口扩展、电机控制这类应用。Logos-2就是Logos的新一代制造工艺提升到了28nm级别逻辑单元、Block RAM、DSP数量都有明显增长同时把用户IO、高速接口这些资源也做了增强。AXP100这块板子核心用的就是Logos-2系列芯片。我手上这颗的具体型号是PGL22G级别封装是FGG324速度等级属于普通商用级。你拿到板子之后可以先看上边芯片丝印再对照Pango Design Suite里器件选择列表确保选型一致这一步错了后面全部白搭。Logos-2这个系列的定位非常明确它不是用来跟Virtex UltraScale拼性能的而是在中低逻辑密度区间里提供一个国产化、可控、成本合理的FPGA方案。如果你做的东西需要几十K到一两百K逻辑单元带点DDR、串口、网口、显示接口那Logos-2刚好合适。选国产FPGA现在也不再是单纯的“情怀”问题。很多项目确实有国产化率要求供应链上也更可控加上紫光和黑金这种板卡厂商会提供中文技术支持和本地化资料查问题、要例程都方便。当然生态成熟度跟国外的老牌工具比还是有一些差距IP核种类少一些社区讨论量也没那么大后面我会专门说哪些地方容易让人抓狂以及怎么绕过去。1.2 为什么选择黑金AXP100做项目最怕的就是“冷启动”成本黑金这家公司做FPGA开发板做了很多年以前主要是做Xilinx和Altera的板子后来也跟进了国产FPGAAXP100就是面向紫光Logos/Logos-2系列的典型板卡。我这块板子上的资源大概是这样板载DDR3、HDMI接口、以太网PHY、UART转USB、LED和按键、数码管、LCD扩展接口、ADC等。不同批次的外设配置会有差异一切以板卡丝印和随板资料清单为准。挑开发板这件事我的经验是不只看硬件配置更要看“配套资料完整度”。黑金在这方面做得比较到位随板资料里有原理图PDF、引脚分配表、几十个从简单到复杂的Verilog例程、PDT工具的安装包和License申请指引。这意味着你不需要从零开始啃芯片手册先对照例程跑起来再按自己的项目改冷启动成本低很多。1.3 先建立正确预期Pango Design Suite到底是个什么样的工具Pango Design Suite是紫光同创官方的一体化FPGA设计工具缩写PDX还是PDT不同版本叫法略有差异本文统一用PDS。它涵盖了完整的设计流程RTL编辑、逻辑综合、布局布线、时序分析、功耗估算、位流生成、下载调试、在线逻辑分析。界面布局上跟Vivado和Quartus有很多相似的地方——左边是Flow Navigator式的流程导航中间是源码/原理图/报告窗口下边是Console和Message窗口用过其他FPGA工具的人基本能无痛迁移。不过话说回来PDS也有自己的脾气。比如某些菜单的翻译和排版还不太统一后台自动保存偶尔会触发卡顿部分IP核配置界面的交互逻辑跟Vivado不完全一样这些都需要时间适应。但你只要熬过最初两周的“工具磨合期”后面就会觉得顺手很多。2. 开发环境搭建与工程创建实操别在入门第一步卡住很多人拿到板子之后第一件事就是装软件结果装完就卡在License上或者在新建工程时器件选不对、仿真跑不起来。这一章我按实际操作的顺序把环境搭建和第一个工程完整走一遍。2.1 安装与License激活这一步卡住的人最多PDS安装包一般随开发板资料附送也可以去紫光同创官网下载。安装过程本身不难基本就是下一步、下一步选好安装路径。但有几点要特别注意第一安装路径不要带中文和空格最好就是D:\PDS这样第二安装完成后第一次启动需要联网激活或者导入License文件第三License分本地节点锁定的和浮动License两种个人开发通常用本地License公司团队可以用浮动License。我遇到的坑是防火墙拦截——License服务启动后第一次启动PDS提示“License not found”排查了半天最后发现是Windows防火墙把License通信端口给拦了加入白名单就好了。另外如果你机器上装了多个版本的PDS要注意环境变量里指向的License路径是不是当前版本需要的多版本共存时环境变量串了是最常见的错误。激活成功的标志是启动界面不弹错误框Help菜单里的“License Information”能看到有效期和Feature列表。建议第一次激活后顺手把这台机器上支持的所有器件列表导出来看一眼确认你买的板子对应器件型号在列表里。提示如果你在公司内网用的浮动License还需要检查服务器端口是否被网络策略拦截。这个经常被忽略。2.2 新建工程器件选型与目录规范打开PDS之后File - New Project进入新建工程向导。工程类型一般是RTL Project工程名字我用的是“led_test”位置放在D:\fpga_proj\led_test。这里再强调一次整个工程路径不能有中文最好是英文数字工程名不要叫test、new这种太通用的名字否则后期工程一多你自己都分不清。器件选型这一步要选对产品系列和具体型号。在Device Family里选Logos-2然后在Device列表里找你板子上贴的那颗芯片比如PGL22G封装FGG324速度等级选标称值。如果你选错了型号综合和布局布线也能跑但最后生成的位置流下载到板子上大概率不工作或者IO引脚约束对不上。选完器件后向导会问你要不要创建约束文件这里建议直接用向导创建空约束文件后边所有管脚和时序约束都写在这个文件里。目录规范这件事我吃过亏。刚开始建工程时随手都放在桌面结果项目稍微大一点RD工程、仿真工程、备份、文档全混在一堆。后来学乖了每个工程目录下固定分成几个子目录rtl源码、constr约束、sim仿真、doc文档、prjPDS工程文件本身。这样打包备份和换机器都很方便。2.3 从流水灯开始第一个能跑起来的工程环境弄好之后第一个例程不建议上来就搞复杂功能先点亮几个LED才是正事。我在工程里新建了一个Verilog源文件代码如下module led_blink ( input wire clk, input wire rst_n, output reg [3:0] led ); reg [24:0] counter; always (posedge clk or negedge rst_n) begin if (!rst_n) begin counter 25d0; led 4b1000; end else if (counter 25d24_999_999) begin counter 25d0; led {led[2:0], led[3]}; // 循环左移实现流水灯 end else begin counter counter 1b1; end end endmodule这段代码的逻辑很简单用计数器计时每500毫秒假设时钟50MHz计数25_000_000次切换一次LED状态实现流水灯效果。你可以根据自己的板载时钟频率调整计数器的最大值。代码写完接下来就是管脚约束。打开约束文件.sdc后缀把LED和时钟的管脚分配写进去。管脚号怎么确定打开AXP100的原理图PDF找到LED部分看到四个LED连接在FPGA的哪几个引脚上比如我板上是K14、K15、L14、L15具体以实际板卡为准然后在SDC里写成set_pin_assignment {led[0]} {LOCATION K14;} set_pin_assignment {led[1]} {LOCATION K15;} set_pin_assignment {led[2]} {LOCATION L14;} set_pin_assignment {led[3]} {LOCATION L15;} set_pin_assignment {clk} {LOCATION N13;} set_pin_assignment {rst_n} {LOCATION M3;}这里有一点容易搞错管脚名称的写法是“led[0]”这种向量形式不是“led_0”不同工具写法不同PDS要求带方括号。另外时钟引脚必须分配在专用的时钟输入引脚MRCC/SRCC上否则后续时序会很差这一点在原理图上看引脚名称就能辨别——带MRCC或者SRCC后缀的才是时钟专用引脚。约束写好后左侧流程栏里点击综合Synthesis完成后看有没有错误再点布局布线Place Route最后点位流生成Generate Bitstream。整个过程如果顺利几分钟内就能拿到比特流文件。然后用下载线连接PC和AXP100板上的JTAG口——黑金的下载线一般插上后驱动是免驱的但也有个别系统需要手动装驱动。打开PDS的下载工具Programmer加载比特流点击Program如果板上LED开始循环闪动恭喜你的第一块国产FPGA工程已经跑通了。我第一次跑通这个流水灯的时候说实话没有太激动更多的是“松了一口气”——因为之前听说国产工具流程走不通的传闻太多了真正把流程跑通之后才知道很多东西并没有网上说得那么玄乎。3. 从RTL到比特流的全流程拆解综合、约束、IP与调试流水灯只是一个最小闭环。真正做事的时候你还得面对综合报告、时序约束、IP核调用和在线调试这些环节。这一章把全流程中比较关键的几个节点展开讲一讲。3.1 综合和布局布线搞清楚工具在你背后做了什么很多新手习惯“写完代码直接点编译”出问题了也不知道从哪查起。我建议还是了解一点底层逻辑综合Synthesis是把你的Verilog/VHDL代码翻译成由逻辑门、触发器、BRAM、DSP这些底层资源组成的网表布局布线Place Route是决定这些逻辑资源放在芯片的哪个位置、怎么连接。这两个阶段都会生成报告而报告里藏着大量有用信息。综合报告重点看三样东西一是有没有语法或语义错误二是资源占用率——LUT用了多少、FF用了多少、BRAM用了多少、DSP用了多少如果某项超过80%你就要警惕后边的布局布线可能因为资源拥挤导致时序不满足三是警告信息——容易有未连接端口、锁存器推断、位宽截断之类的Warning这些Warning平时看着不起眼到了调试阶段可能就是坑。布局布线报告重点关注时序部分。PDS会给出每个时钟域的WNSWorst Negative Slack和TNSTotal Negative Slack。WNS如果是正数说明时序收敛了如果是负数说明你时钟跑太快逻辑路径上的延迟超过了时钟周期这个时候要么降频要么优化代码逻辑层级要么调整约束。我第一次调UART波特率时钟的时候把分频逻辑写得比较深布局布线后WNS变成-0.3ns后来通过打拍、简化组合逻辑才收敛。跑流程的姿势也有讲究小工程直接点左侧流程栏里的“Run All”一条龙编译就行工程大了或者要精细控制还是建议手工分步跑综合完看一眼资源再布局布线。这样出了问题你能知道是哪个阶段挂的。3.2 时序约束实操SDC至少要会写这几条时序约束是FPGA开发里绕不开的一个坎。很多人嫌麻烦不写约束结果工程在板上表现时好时坏或者改几行代码之后时序全乱。我的建议是从第一个正经工程开始就养成写SDC约束的习惯至少把时钟和主要IO都约束上。PDS里的约束文件就是SDCSynopsys Design Constraints格式语法跟Vivado用的XDC很像跟Quartus的SDC也几乎一样。最常用的约束有这几类首先是创建时钟告诉工具时钟树的源头和频率。如果你板上的晶振是50MHz连接到FPGA的时钟引脚约束就是create_clock -name clk_in -period 20.0 [get_ports {clk}]周期单位是纳秒50MHz就是20ns。如果时钟经过PLL分频或倍频后产生新的时钟域PDS的PLL IP在生成时会自动带出约束不需要你手写但建议打开生成的约束文件确认一下有没有缺失。其次是输入输出延时约束。比如你要约束UART接收引脚的数据到达时间可以写set_input_delay -clock [get_clocks clk_in] -max 5.0 [get_ports {rxd}] set_output_delay -clock [get_clocks clk_in] -max 3.0 [get_ports {txd}]初学者不一定能理解每条约束的物理意义但至少要把顶层模块的时钟和复位约束上。没有时钟约束的时候工具只能按默认频率或者优化布局来尽力最终结果跟你的真实工作频率之间是脱节的这也就是为什么有人觉得“板子能跑但性能就是上不去”。时序分析报告如果报RED时序违例别急着改代码。先看是setup违例还是hold违例setup违例通常是路径组合逻辑太深可以插寄存器打拍hold违例在FPGA里相对少见一般调整约束或者加delay就行。3.3 IP核使用PLL、BRAM、DDR这类资源的正确姿势FPGA里有很多现成的资源块直接例化比自己写逻辑更高效。PDS里有IP CatalogIP目录类似Vivado的IP Catalog打开之后能看到PLL、BRAM、ROM、FIFO、DDR控制器、SerDes、ADC接口等各种IP。调用的方式基本是“双击IP - 配置参数 - 生成IP例化模板 - 在你的代码里例化”。我用得最多的是PLL比如需要从50MHz输入时钟生成100MHz的系统时钟和25MHz的显示时钟。PLL配置界面里主要填输入频率、期望输出频率工具会自动算出分频倍频系数。生成之后IP会输出一份例化模板里面有端口列表和参数你把它复制到自己的RTL代码里就行。有一点要特别提醒PLL的锁定信号locked一定要接上、一定要用。上电之后PLL需要一段时间稳定输出如果你不检查locked信号就直接用PLL输出时钟逻辑在板子刚上电那一小段时间内是“无证驾驶”可能出现莫名其妙的状态错乱。我习惯在复位逻辑里把locked和外部复位一起做“或”处理只要locked没拉高整个系统就一直保持复位。BRAM和FIFO这类IP倒不复杂配置时注意位宽和深度要选对早期用错位宽导致FIFO读出来的数据全错排查了好久。DDR控制器如果你板子上有DDR颗粒需要用这个IP配置项比较多包括DQ位宽、地址位宽、Bank数、时序参数等这些参数在DDR芯片手册里都能查到。建议先跑黑金提供的DDR测试例程确认板子上的DDR颗粒正常工作再自己集成。3.4 下载配置与在线调试把程序烧到板子上的几种方式程序编译完成之后就要下载到板子上。PDS的下载流程跟其他工具类似打开Programmer下载器工具识别到JTAG链上的FPGA加载比特流然后点击Program。这个方式把程序下载到FPGA内部SRAM里掉电就没了适合开发调试阶段用。如果程序最终要固化到板子上就需要把位流烧写到板载SPI Flash或者配置Flash里。这个过程分成两步第一步是生成烧写文件PDS里选择Generate PROM File或类似的菜单把比特流转换成Flash能识别的格式第二步是切换下载模式——一般板子上会有配置模式跳线从JTAG模式拨到SPI Flash模式重新下载。这里很多人容易在“生成什么格式的文件”上卡壳。不同配置芯片支持的格式不一样常见的是.bin也有.hex烧录格式。建议先看板卡资料里用的是哪种配置Flash再看PDS生成文件时选相应格式不要闭眼瞎选。我遇到过烧录文件格式选错导致Flash编程失败最后重新烧一遍就好了耽误了半个小时。在线调试方面PDS提供了类似集成逻辑分析仪ILA的功能。你可以把关心的内部信号加进调试核综合时预留调试逻辑下载后在工具里实时抓取信号波形。我的使用习惯是先把怀疑有问题的信号和关键状态机的当前状态加进逻辑分析仪跑一下触发条件然后保存波形慢慢看。抓过几次波形之后很多问题其实一眼就看出来了——比如状态机卡在某个状态出不来、计数器的使能信号一直没拉高、FIFO空满标志跟预期不符等等。这里有个经验在线调试会占用额外逻辑资源也会让布局布线变紧张所以调试完务必在最终版本里把调试逻辑去掉重新综合出一版干净的位置流。否则可能出现“调试版功能正常去掉在线逻辑后反而时序变差”的诡异问题其实往往就是资源占用导致的布局变化。4. 实测踩坑记录常见问题与排查思路用了这一段时间PDS和AXP100的组合给我最深的感受是功能不缺席但细节上确实比老牌工具“糙”一些很多问题不是原理上的而是操作习惯和工具行为差异导致的。这一章我按类别整理了我自己遇到、以及跟朋友交流后确认过的常见问题做成速查表方便你排查。4.1 安装与License问题速查症状常见原因解决办法启动报License not found防火墙拦截License端口把License服务加入防火墙白名单启动报Feature缺失环境变量指向了旧版本License检查PDS版本和License版本是否匹配浮动License偶尔断开网络不稳定或服务器重启重新启动License服务确认服务器名称配置正确安装后打不开工程工程路径含中文把工程移到纯英文路径下重新打开多版本PDS冲突环境变量串了手动指定当前版本对应的License环境变量License的问题本质上是验证机制的问题没什么技术含量但就是烦人而且容易反复。我的做法是把License申请邮件、激活步骤截图存在固定文件夹里出问题就按步骤重来一遍基本十分钟内能解决。4.2 工程编译和时序问题速查编译报错里最有迷惑性的还不是语法错误而是那种“综合通过、布局布线报错”的情况。常见的有几类一类是引脚约束冲突。你在SDC里把一个引脚同时分配给了两个信号或者分配到了不支持的Bank电压域布局布线阶段就会报错。解决方法是逐条检查引脚分配尤其是复用引脚和配置相关引脚如JTAG引脚、配置引脚这些特殊引脚不是你想用就能用的。另一类是资源不足。LUT、FF、BRAM等资源超过100%布局布线直接失败。这类问题建议看综合报告里的资源占用表格定位是哪个模块占用量太大再考虑优化代码或者换更大容量的芯片。还有一类是时序不满足。WNS为负数报告里会标出关键路径。我的排查顺序是先看关键路径在哪个模块里、路径上是组合逻辑太长还是扇出太大如果是组合逻辑太长把路径中间加寄存器打拍如果是扇出太大复制逻辑或加约束降低扇出。改完重新布局布线再看WNS是否变正。4.3 下载与板上验证问题速查症状常见原因解决办法Programmer找不到下载器驱动没装或线材接触不良重装下载器驱动换一根USB线JTAG识别不到FPGA板卡供电异常、JTAG链上其他设备干扰检查电源灯状态断开其他JTAG设备配置Flash烧写失败Flash型号选错、文件格式错误核对Flash型号重新生成正确格式文件下载成功但板上没反应管脚分配不对、复位一直有效、时钟没起振用示波器测时钟引脚检查复位逻辑掉电后程序丢失你用的是SRAM配置方式改用Flash固化方式重新烧写板上验证阶段有一个容易被忽略的点电源供电能力。AXP100板载很多外设如果你只插JTAG线供电USB供电当板上有HDMI、以太网、DDR等外设同时工作时5V电源可能带不动导致FPGA工作不稳定、下载失败甚至反复重启。我后来习惯用外部稳压电源给板子供电JTAG线只管烧录不兼供电这样问题少很多。4.4 一些能提升效率的小习惯排查问题之外我还总结了一些使用PDS时提升效率的小习惯。刚开始玩这个工具我花了点时间摸透快捷键比如保存、运行综合、打开报告这些操作都能用快捷键完成。PDT支持Tcl控制台这个功能值得好好用一下——你可以在控制台里输入命令实现流程控制、批量创建工程、查看内部信号。把常用操作写成Tcl脚本以后重复劳动能省很多时间。代码风格上建议每个模块的文件名和模块名保持一致顶层模块用top命名内部信号命名统一风格。这样不管是自己后来回顾还是别人接手都很容易读懂。我的另一个习惯是建立“个人IP库”。那些验证过的UART、SPI、I2C、PLL、FIFO等模块整理成标准接口的Verilog代码放在一个专门的仓库里每个新项目直接调用。几次下来新项目的开发速度会有非常明显的提升。5. 最后说点我的真实感受如果你问我这套国产FPGA开发组合到底值不值得用我的回答是值得但前提是你得调整好预期。PDS和AXP100的组合确实能够支撑起完整的FPGA开发流程尤其是对于中低密度逻辑、接口控制、显示处理这类项目效率和稳定性都够用。它不会像Vivado那样给你铺好地毯但也没有网上传闻的那么“不堪”。我在实际使用中最大的心得是遇到问题先别急着判断是不是工具烂很多坑其实就是版本差异、环境配置、约束写法的问题——先看报告、先查手册、先搜官方资料多数都能找到答案。最后再分享一个小技巧把官方自带的例程和黑金配套的例程当成“参考答案”不要直接把它们当成最终方案。我的做法是先跑通例程然后用调试工具抓实际波形理解每个信号为什么要这么连接再动手改成自己的逻辑。这个过程会让你对FPGA内部工作原理的理解上一个台阶远比你照着例程抄十遍更有收获。国产FPGA的生态还在快速生长这个过程中愿意动手踩坑的人往往反而能积累出别人没有的经验。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑