拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

紫光同创PDS入门实战:从软件安装到FPGA工程跑通全流程

紫光同创PDS入门实战:从软件安装到FPGA工程跑通全流程 1. 为什么选择紫光同创FPGA作为入门起点1.1 国产FPGA的生态现状与入门门槛这几年FPGA圈子有个很明显的趋势就是国产替代从口号变成了实际项目里的硬需求。紫光同创作为国内FPGA的主要玩家之一旗下Logos、Compact、Titan等系列覆盖了从低功耗小容量到高性能大容量的场景尤其在通信、工业控制、视频处理这些领域出货量不小。很多做硬件工程的朋友之前一直用国外大厂的器件和工具链现在项目要求换国产方案第一个问题就是软件怎么装、工程怎么建、约束文件怎么写。我最初接触紫光同创的PDSPango Design Suite时也踩了不少坑。它的界面风格和操作逻辑跟国外主流工具不太一样网上中文资料虽然有一些但大多零散缺少一份从安装到跑通第一个工程的完整记录。所以这篇文章我打算把自己从零开始用PDS的全过程整理出来包括软件安装、License配置、新建工程、写代码、综合实现、写约束文件、下载到板子以及中间遇到的各种报错和解决办法。这篇文章适合谁看如果你是刚接触FPGA的学生或者从其他平台转过来的工程师又或者项目里第一次用紫光同创的芯片那这篇内容应该能帮你省下不少查资料的时间。我不打算讲太深的理论重点放在“怎么操作”和“为什么这么操作”上让你看完能自己跑通一个完整流程。1.2 PDS软件的整体定位与核心模块紫光同创的PDS全称是Pango Design Suite是一套完整的FPGA开发工具链里面包含了综合、布局布线、时序分析、比特流生成、下载配置这些环节。它不像某些工具把功能拆成好几个独立软件PDS基本是一个主界面里完成大部分工作这点对新手比较友好不用在多个窗口之间来回切换。整个工具链的核心模块我梳理了一下主要有这几个PDS主程序负责工程管理和综合实现Pango Constraints Editor用来编辑约束文件Programmer负责下载比特流到芯片还有ModelSim或者自带的仿真工具做功能验证。约束文件这块是很多新手容易忽略但又极其重要的部分它决定了你的代码能不能正确映射到芯片的物理引脚上时序能不能满足要求。后面我会专门用一大段来讲约束文件的写法和常见错误。有一点要提前说明PDS的版本和器件支持是绑定的。你下载软件的时候一定要看清楚版本说明比如某些版本只支持Logos系列某些版本对Titan系列支持更好。装错版本会导致新建工程时找不到对应的器件型号这个问题我遇到过好几次后面会详细说怎么避免。2. 软件安装与License配置的完整流程2.1 下载渠道与版本选择的关键判断紫光同创的PDS软件获取渠道主要有两个一个是官网的下载中心另一个是通过代理商或者技术支持获取。官网下载需要注册账号填写一些基本信息审核通过后就能拿到安装包和License文件。这里有个细节要注意License是和网卡MAC地址绑定的所以你最好在打算长期开发的那台机器上申请换机器就得重新申请挺麻烦的。版本选择上我建议优先选官网标注的“稳定版”或者“推荐版”不要盲目追最新。新版本可能修了一些bug但也可能引入新的问题而且网上针对新版本的教程少遇到问题不好查。我目前用的是PDS 2022.1这个版本对Logos系列的支持比较成熟综合和布局布线的速度也可以接受。下载下来的安装包一般是个压缩包解压后里面有安装程序、License文件、以及一些示例工程。安装包大小在几个GB左右建议预留至少20GB的磁盘空间因为综合和布局布线过程中会产生大量中间文件空间不够会导致流程中断。2.2 安装步骤与License导入的实操细节安装过程本身不复杂双击安装程序一路下一步就行。但有几个地方需要留意安装路径不要有中文和空格这是很多EDA工具的通用禁忌PDS也不例外。我一般习惯装在D盘根目录下比如D:\Pango\PDS_2022.1这样路径短出问题的概率小。安装完成后第一次启动PDS会提示你导入License。License文件一般是个.dat或者.lic后缀的文件通过License管理界面导入。导入成功后软件会显示License的有效期和支持的器件系列。如果导入失败最常见的原因是MAC地址不匹配或者License文件被修改过。这时候你需要检查申请License时填的MAC地址和当前机器的MAC地址是否一致用ipconfig /all命令可以查看。还有一个坑是系统时间。License是有有效期的如果你的系统时间不对比如被改到了License过期之后软件会直接报License失效。我有个同事因为主板电池没电系统时间重置到了几年前结果PDS死活打不开查了半天才发现是时间问题。所以装完软件后顺手确认一下系统时间是否准确。2.3 环境变量与驱动安装的注意事项PDS安装过程中会自动配置一些环境变量但有时候需要手动检查。比如PANGO_HOME这个变量应该指向你的安装目录如果没配好命令行工具可能找不到。另外下载器驱动也是必须装的紫光同创用的下载器一般是Pango USB Cable或者兼容的JTAG下载器驱动装不好Programmer里识别不到设备就没法下载比特流。驱动安装有个小技巧先装驱动再插下载器让系统自动识别。如果顺序反了可能会识别成未知设备这时候需要在设备管理器里手动更新驱动指向PDS安装目录下的驱动文件夹。我在Windows 10和Windows 11上都试过Win11有时候对未签名驱动的限制更严需要临时关闭驱动签名强制才能装上这个后面问题排查部分会细说。3. 新建第一个工程的完整操作与代码编写3.1 工程创建向导里的关键选项解读打开PDS后点File - New Project会弹出一个工程创建向导。这个向导里有几个选项很关键选错了后面会很麻烦。第一个是工程名称和路径同样不要有中文和空格我一般用英文加下划线的命名方式比如led_blink_test。第二个是器件型号选择这里要根据你实际用的开发板或者目标芯片来选比如Logos系列的PGL22G-6MBG324选错了综合会报错或者布局布线失败。第三个是综合工具和仿真工具的选择。PDS自带综合工具也可以用Synplify Pro等第三方工具。新手建议先用自带的等熟悉了再换。仿真工具如果装了ModelSim可以在这里关联没装的话可以先跳过后面用PDS自带的波形仿真也能凑合。向导最后一步会问你要不要添加已有源文件第一次建工程选“否”直接创建一个空工程然后手动添加文件这样思路更清晰。3.2 编写第一个Verilog模块LED闪烁工程建好后右键工程名选择New Source新建一个Verilog文件。我习惯把模块名和文件名保持一致比如led_blink.v这样综合的时候不容易出问题。下面是我写的第一个LED闪烁代码逻辑很简单就是用一个计数器控制LED的亮灭。module led_blink( input wire clk, // 系统时钟假设50MHz input wire rst_n, // 复位信号低电平有效 output reg led // LED输出 ); reg [24:0] cnt; // 25位计数器50MHz时钟下约0.67秒翻转一次 always (posedge clk or negedge rst_n) begin if (!rst_n) begin cnt 25d0; led 1b0; end else begin if (cnt 25d24_999_999) begin cnt 25d0; led ~led; end else begin cnt cnt 1b1; end end end endmodule这段代码里计数器的位宽是25位因为50MHz的时钟周期是20ns要数到0.5秒需要25_000_000个周期25位计数器最大能到33_554_431够用。如果你板子上的时钟频率不是50MHz需要相应调整计数值这个后面约束文件部分会讲怎么确认时钟频率。代码写完后点综合按钮PDS会检查语法并生成网表。如果代码有语法错误底部的Console窗口会报出来双击报错信息能定位到具体行号。综合通过后就可以进行布局布线了。3.3 综合与布局布线的过程观察综合和布局布线是FPGA开发里最耗时的环节尤其是布局布线根据设计规模和器件容量可能几秒钟也可能几分钟。PDS在跑这些流程的时候底部的进度条会显示当前阶段比如“Synthesis”、“Placement”、“Routing”。我建议第一次跑的时候盯着看如果卡在某个阶段不动了可能是设计有问题比如组合逻辑环路或者资源超限。综合完成后可以打开综合报告看看资源占用情况比如LUT用了多少、寄存器用了多少、IO用了多少。对于LED闪烁这种小设计资源占用应该非常低如果发现LUT用量异常大可能是代码写法有问题比如不小心综合出了锁存器或者大的组合逻辑。布局布线完成后会生成时序报告。时序报告里主要看建立时间Setup和保持时间Hold是否满足。对于低速设计一般都能过但如果时钟频率高或者逻辑复杂可能会报时序违例。时序违例的解决方法后面会讲第一次跑先确保流程能走通就行。4. 约束文件详解从引脚分配到时序约束4.1 约束文件的作用与基本语法结构约束文件在FPGA开发里的地位怎么说都不为过。它就像一张地图告诉工具你的代码里的信号对应芯片上的哪个物理引脚以及这些信号需要满足什么样的时序要求。没有约束文件工具会随机分配引脚你的LED可能分配到某个你根本没接LED的引脚上板子上看不到任何现象。紫光同创PDS的约束文件一般用.fdc后缀语法和SDCSynopsys Design Constraints类似但有一些自己的扩展。基本结构包括引脚约束、时钟约束、时序例外、IO标准设置等。下面是一个典型的约束文件示例# 时钟约束假设输入时钟是50MHz周期20ns create_clock -name clk -period 20 [get_ports clk] # 复位信号引脚约束 set_property -name {PACKAGE_PIN} -value {R1} -objects [get_ports rst_n] set_property -name {IO_TYPE} -value {LVCMOS33} -objects [get_ports rst_n] # LED引脚约束 set_property -name {PACKAGE_PIN} -value {T2} -objects [get_ports led] set_property -name {IO_TYPE} -value {LVCMOS33} -objects [get_ports led]这里PACKAGE_PIN后面的值就是芯片封装上的引脚编号具体填什么要看你的开发板原理图。IO_TYPE是IO电平标准常见的有LVCMOS33、LVCMOS25、LVDS等选错了可能导致信号无法正确输出甚至损坏芯片。4.2 引脚约束的实操方法与常见错误引脚约束最直接的方法就是查开发板的原理图找到LED、按键、时钟这些外设连接到了FPGA的哪个引脚。比如我的板子上50MHz时钟接在E1引脚复位按键接在R1LED接在T2。把这些信息填到约束文件里布局布线的时候工具就会按照这个分配。常见错误有几个引脚编号写错比如把T2写成T20工具会报错说找不到这个引脚IO标准不匹配比如引脚所在的Bank供电是3.3V你写了LVCMOS25工具会报电压冲突重复分配同一个引脚分配给两个信号工具也会报错。这些错误在布局布线阶段都会暴露出来根据报错信息逐个排查就行。还有一个新手容易忽略的点时钟引脚通常有专用引脚不是随便找个IO就能当时钟输入的。如果你把时钟信号分配到普通IO上工具可能会报错或者时序很差。查原理图的时候注意看时钟信号是不是接在带有GCLK或者CCLK标记的引脚上。4.3 时序约束的编写与时钟频率计算时序约束的核心是create_clock它告诉工具你的时钟周期是多少。比如50MHz的时钟周期是20ns就写-period 20。这个数值一定要和实际时钟频率一致写大了工具会放松时序要求可能导致实际运行时序违例写小了工具会过度约束浪费资源甚至布不通。除了时钟周期还可以加set_input_delay和set_output_delay来约束输入输出信号的时序关系。对于LED闪烁这种简单设计不加这些也能跑但如果你的设计里有高速接口比如DDR、SPI、以太网这些约束就必须加否则时序很难保证。时钟频率的计算方法假设你的板子上有个50MHz的晶振那周期就是1/50MHz 20ns。如果是100MHz周期就是10ns。有些板子用的是差分时钟约束的时候要用create_clock指定到差分对的P端或者N端具体看工具的要求。4.4 约束文件的调试与验证技巧约束文件写完后怎么验证它是对的最直接的方法就是跑完布局布线后打开Pin Report或者Timing Report看看引脚分配是不是和你写的一致时序是不是满足。PDS的Pin Report会列出每个信号分配的引脚编号和IO标准对照原理图检查一遍没问题就说明引脚约束对了。时序报告里重点看WNSWorst Negative Slack和WHSWorst Hold Slack。WNS是建立时间余量WHS是保持时间余量两个都是正数或者零说明时序满足。如果WNS是负数说明建立时间不够需要优化逻辑或者降低时钟频率。如果WHS是负数说明保持时间不够这种情况比较少见一般出现在跨时钟域或者高速设计中。我自己的习惯是每次改完约束文件都重新跑一遍布局布线然后看报告确认。虽然费时间但能避免很多低级错误。有一次我忘了改IO标准结果LED一直不亮查了半天才发现是电平不匹配板子上的LED是低电平点亮我约束成了高电平驱动改过来就好了。5. 比特流下载与板级调试的实操记录5.1 生成比特流与下载配置布局布线和时序都通过后就可以生成比特流文件了。PDS里点Generate Bitstream工具会生成一个.bit或者.sbit后缀的文件。生成过程中如果报错通常是时序没满足或者约束有冲突根据报错信息回去改。下载比特流用PDS自带的Programmer工具。打开Programmer选择下载器类型一般是Pango USB Cable然后扫描设备。如果驱动装好了下载器连接正常应该能看到芯片的ID和型号。确认无误后加载比特流文件点Program等待进度条走完板子上的LED就应该开始闪烁了。如果下载失败常见原因有下载器没插好、驱动没装、芯片供电不足、JTAG链路有问题。我遇到过一次下载器识别到了但下载总是失败后来发现是USB线太长导致信号衰减换了一根短一点的线就好了。这种问题很隐蔽查起来费时间但经验多了就能快速定位。5.2 板级调试的常见现象与排查思路LED不亮或者不闪是新手最常遇到的问题。排查思路可以按这个顺序来先确认比特流下载成功了没有Programmer里有没有报错然后确认板子供电正常LED本身没坏接着检查约束文件里的引脚分配和IO标准对不对最后用示波器或者逻辑分析仪测一下时钟引脚有没有波形。还有一种情况是LED亮了但闪烁频率不对。比如你期望1Hz闪烁结果它闪得飞快或者几乎不闪。这通常是时钟频率和计数器设计不匹配导致的。比如你板子上的时钟是25MHz但代码里按50MHz算的计数值那闪烁频率就会慢一倍。解决方法是查原理图确认实际时钟频率然后调整计数器阈值。如果设计里有多个时钟域调试会更复杂。跨时钟域的信号需要做同步处理否则会出现亚稳态导致行为不确定。亚稳态这个问题在低速设计里可能不明显但在高速或者异步接口里是必须处理的。常见的同步方法是打两拍或者用异步FIFO这个展开讲能写一整篇这里先提一下后面有机会再细说。5.3 固化程序到Flash的操作要点比特流下载到FPGA后掉电就丢了因为它是配置到SRAM里的。如果要让板子上电自动运行你的设计需要把比特流固化到Flash里。PDS的Programmer支持生成.mcs或者.bin文件然后通过下载器烧录到板子上的配置Flash中。固化操作有几个注意点Flash型号要选对不同厂家的Flash指令集不一样选错了烧不进去烧录速度不要设太高尤其是用杜邦线连接下载器的时候速度高了容易出错烧录完成后要断电重启让FPGA从Flash重新加载配置。我第一次固化的时候忘了选Flash型号烧录一直失败后来查了板子原理图才知道用的是某个特定型号的Flash选对了就一次成功。固化成功后板子上电就能自动运行你的设计了不需要再连接下载器。这一步对于做产品或者交付demo很重要因为不可能每次都带着电脑去下载。6. 常见问题速查与避坑经验汇总6.1 软件安装与License类问题问题现象可能原因解决方法PDS启动报License失效系统时间不对或MAC地址变化校准系统时间重新申请License新建工程找不到器件型号软件版本不支持该器件换用支持该器件的PDS版本安装过程中报路径错误安装路径含中文或空格改用纯英文无空格路径下载器识别不到驱动未安装或USB线问题重装驱动换短USB线License问题我踩过最大的坑就是换电脑。一开始不知道License绑MAC地址换了台机器怎么都导入不了后来联系技术支持重新申请才解决。所以如果你打算在多台机器上用最好提前问清楚License政策有些版本支持浮动License有些只支持单机。6.2 综合与布局布线类问题综合报错最常见的是语法错误和模块例化错误。比如端口名字写错、位宽不匹配、缺少分号这些。PDS的报错信息还算友好双击能跳到具体行仔细看一般能改对。布局布线报错多半是资源超限或者约束冲突比如LUT不够用了或者引脚分配重复了。这时候要么优化代码减少资源占用要么换更大容量的器件。时序违例是布局布线阶段比较头疼的问题。WNS为负说明建立时间不够可以尝试的方法有降低时钟频率、优化组合逻辑、增加流水线寄存器、调整布局布线的策略。PDS里有一些布局布线的选项可以调比如effort level调高了工具会花更多时间优化时序但效果不一定明显。我一般先看关键路径在哪然后针对性地改代码比盲目调工具选项有效。6.3 下载与板级调试类问题下载失败的原因前面说了不少这里补充一个JTAG链路上有多个器件。有些板子上FPGA和CPLD或者其他芯片共用JTAG链路这时候需要在Programmer里正确设置链路上的器件顺序否则工具找不到目标FPGA。这个在复杂板子上很常见新手容易懵。板级调试还有个技巧用PDS自带的在线逻辑分析仪。它可以在FPGA运行时抓取内部信号的波形相当于一个软逻辑分析仪。对于调试时序问题或者协议问题非常有用不用额外买硬件逻辑分析仪。不过它会占用一些逻辑资源设计大的时候要权衡。6.4 约束文件相关的独家避坑技巧约束文件这块我总结了几条经验第一引脚约束一定要对照原理图逐个确认不要凭记忆或者猜第二IO标准要和Bank电压匹配不确定的时候查芯片手册或者问硬件工程师第三时钟约束的周期值要准确不确定就用示波器测一下实际时钟频率第四约束文件要纳入版本管理每次改动都记录出问题了方便回退。还有一个隐藏的坑约束文件里的信号名要和代码里的完全一致包括大小写。Verilog是大小写敏感的约束文件里写led代码里是LED工具就找不到这个信号约束不生效。这种错误很隐蔽因为工具不一定报错只是默默忽略你的约束结果引脚分配不对板子没反应。7. 从第一个工程到实际项目的扩展思路跑通LED闪烁只是第一步接下来你可以尝试更复杂的设计比如按键消抖、数码管显示、UART通信、SPI接口、VGA显示等。每增加一个外设就多学一点约束文件的写法多了解一点时序约束的知识。紫光同创的官网和社区里有一些示例工程可以参考它们的约束文件和代码结构。对于想深入FPGA开发的朋友我建议重点补两块时序分析和跨时钟域处理。这两块是区分新手和有经验工程师的关键。时序分析要理解建立时间、保持时间、时钟偏斜、亚稳态这些概念跨时钟域要掌握打拍同步、异步FIFO、握手协议等方法。这些内容展开讲篇幅很大但值得花时间学。另外PDS的版本更新比较快新版本可能会支持更多器件和特性。建议关注紫光同创的官方发布说明了解新版本的变化。但生产项目里不要轻易升级工具版本除非新版本解决了你遇到的问题否则稳定优先。我个人在实际操作中的体会是FPGA入门最难的不是写代码而是把整个流程跑通尤其是约束文件和板级调试这两块。代码写错了可以改但约束错了或者板子没反应排查起来很考验经验。所以建议新手一定要动手做一块自己的板子哪怕是最小系统板把LED、按键、串口这些基础外设都跑一遍比只看书看视频强得多。
返回列表