ARTICLE DETAIL

资讯详情

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

紫光同创FPGA开发实战:从PDS工具到引脚时序约束全攻略

紫光同创FPGA开发实战:从PDS工具到引脚时序约束全攻略 1. 软件环境准备与工程创建1.1 下载安装先搞清楚PDS和TD的区别刚接触紫光同创的FPGA最容易懵的一点是到底该用哪个软件紫光同创目前的工具链主要有两套一套叫PDS另一套叫TD。很多初学者在官网看到两个下载入口直接不知道该点哪个。我个人的经验是PDS主要面向中高端器件比如Logos系列、Compa系列、28nm工艺的芯片功能更全支持Team License和Node-Locked License适合正经做项目的场景。TD则偏轻量适合快速验证、教学使用尤其在早期的代码移植和学习阶段启动快、界面清爽对应的器件以低端、中小规模为主。这里给一个最简单的判断方法你手头是哪颗芯片去PDS或TD的Device Support列表里查一下能识别到哪颗就用哪个。不要为了“功能全”硬上PDS如果器件本身不在支持列表里反而会多出很多麻烦。我见过有人拿TD建的工程硬想用PDS打开结果版本报错半天最后发现选错工具链白白浪费了一个下午。下载安装这块要注意几个小细节。第一安装路径不要有中文这几乎是所有FPGA工具的通用禁忌紫光同创的软件也不例外之前有人装到D盘的“新建文件夹”里结果综合的时候各种诡异报错换路径重装就好了。第二安装前先关掉杀毒软件部分安全软件会对License相关的进程误报导致工具起不来。第三建议按默认装到C盘虽然C盘空间吃紧但后续的License绑定、环境变量配置会省心很多。安装完成之后第一次启动需要配置License。紫光同创的License文件一般是.lic或.dat格式可以通过环境变量LM_LICENSE_FILE指定也可以在软件界面里直接选择License文件路径。这里有个经验如果你用的是试用License建议把到期时间记在手机备忘里免得做到一半License过期工程都打不开那才叫欲哭无泪。1.2 新建工程的基本流程一个demo带你跑通装好软件之后我建议先不要急着写代码花十分钟建一个空工程把整个流程点一遍建立“工程管理”的体感。紫光同创的工程界面和Xilinx ISE/Vivado有七八分神似用惯了Vivado的人上手很快纯新手也不用慌逻辑是完全相通的。新建工程的路径一般是“File - New Project”弹出向导之后会要你填工程名、工程路径、器件型号。这里说一下我踩过的坑工程名尽量用英文不要有空格uart_rx_top这种命名就很好uart rx top这种带空格的命名后续生成文件的时候容易在一些工具脚本里报找不到路径的问题。器件选型这一步要仔细。紫光同创的芯片命名规则比如SL2-25E-8F676C包含系列、容量、速度等级、封装等信息。如果你不确定手里的开发板具体是哪颗芯片可以从开发板资料或圆片标记上看。选错了器件型号后面综合、布局布线基本不可能过哪怕勉强过了下载也大概率失败因为JTAG ID对不上。工程建完之后PDS会自动生成一个默认的目录结构通常包含src源码、constr约束、sim仿真、out输出几个目录。我强烈建议你从一开始就遵守这个结构而不是把文件一股脑丢在根目录。等工程变大了几十个文件混在一起你就知道目录干净有多重要了。新建工程这一步做完可以顺手点一下综合Synthesis不写任何代码空的顶层模块能编译通过就说明环境基本没问题。这一步通过之后再正式开始写代码和约束排查问题的时候你才能把“环境问题”和“代码问题”分开不然两边混在一起调试会很痛苦。2. 约束文件FPGA开发的“地基”2.1 约束文件到底管什么很多人写FPGA代码上来就是module xxx(...)一顿操作代码写得飞起等到要上板了才想起来约束文件还没写。这个顺序其实是有问题的。约束文件不是工程的“补丁”而是工程的一部分它决定了你的逻辑在真实芯片上以什么样的物理形态落地。从功能维度看约束文件主要管三件事物理位置约束告诉工具某条信号应该分配到芯片的哪个引脚、哪个Bank、哪个时钟引脚上。电平标准约束告诉工具这个引脚工作在什么电压、什么IO标准下比如3.3V LVCMOS、1.8V LVCOM18、还是差分LVDS。时序约束告诉工具你的设计期望跑多快的时钟数据路径的建立时间和保持时间要多苛刻工具才能根据这些约束来布局布线。拿建房打比方代码解决了“这个房子要盖几层、每个房间是什么功能”的问题而约束文件解决的是“这块地怎么分配、每面墙用多厚的砖、门窗开在哪”的问题。没有约束文件代码只是纸面上的设计约束文件才是让设计落地的施工图。在紫光同创的工具链里约束文件的后缀通常有两种一种是.pdc物理约束一种是.sdc时序约束和Synopsys的SDC格式有渊源。也有人会把引脚约束和时序约束写在同一个顶层约束文件里叫法比较灵活。但行业惯例是物理约束和时序约束分开因为它们的关注点不同分开写便于排查问题。2.2 不写约束直接编译会怎样这个问题几乎每个入门的人都会问我不写约束让工具自己分配行不行答案是行但结果往往很糟糕。先说引脚不写引脚约束工具会按默认策略自动分配引脚这个分配结果是随机的。下载到板上之后你会发现板上的LED不亮、UART的TX没有波形因为工具分配的引脚跟你实际接线的引脚对不上逻辑再好也没用。所以引脚约束是必须写的没有商量余地。再说时序不写时序约束工具会以“尽量布线成功”为目标不对时钟频率做任何保证。芯片内部能跑多少兆赫兹你的设计是否满足建立时间和保持时间工具压根不管。最典型的现象是仿真完全正确上板在低速情况下也正常一超频就乱码、偶发错误十有八九是时序约束缺失、芯片内部时序违例导致的。这个坑我在带团队的时候见过太多次。有一个踩坑比较典型的案例同事做一个MIPI接口的图像采集项目功能仿真全都过了上板之后图像时好时坏找了两天问题最后发现顶层约束文件是空的。加上时钟约束精确到10MHz重新布局布线问题直接消失。所以约束文件不是“锦上添花”而是“雪中送炭”。我还想补充一点不写约束还有一个隐性风险就是器件内部的时钟资源分配混乱。FPGA内部不只是可编程逻辑还有专用的时钟布线网络、PLL/MMCM等时钟资源。如果不加约束工具可能把一个高频信号从普通逻辑路径绕过去导致时钟偏斜严重。约束文件写得好不好直接决定了你的设计在物理上是不是“顺路”的。3. 引脚配置与约束语法手把手写PDC3.1 先说清楚PDC文件的基本语法紫光同创的物理约束文件PDC语法和Xilinx UCF类似但具体关键字有差别。以下是几个最常用的写法我建议直接把这段当成模板用改一改就上板。引脚分配最基础的语法是IO_LOC形如IO_LOC clk 2; IO_LOC rst_n 3; IO_LOC uart_tx 45; IO_LOC uart_rx 46;注意引脚的编号是芯片封装的物理引脚号而不是逻辑引脚名。你必须对着芯片的封装图或开发板的原理图来写。这一点和Xilinx不一样Xilinx常用的是包引脚名比如A15、K17而紫光同创的引脚编号更像是纯数字或者数字加字母的物理封装脚位要格外仔细。分配电平标准用IO_PORT比如IO_PORT clk IO_TYPELVCMOS33; IO_PORT uart_tx IO_TYPELVCMOS33;如果你是差分信号比如LVDS、Mini-LVDS写法会不一样。紫光同创通常要求成对的引脚比如P端和N端需要额外指定差分对类似IO_PORT lvds_p IO_TYPELVDS;这样的形式。同时IO_PORT里还可以附加其他参数常见的包括DRIVE驱动强度、SLEW压摆率、PULLUP上拉、TERM端接等这些参数的应用场景各不相同。举个例子如果某个信号是I2C的数据线是开漏输出那你大概率要加上拉如果某个信号是高速时钟那你可能要考虑更严格的压摆率、更强的驱动。这些细节决定了信号在PCB上的真实电气表现别偷懒。3.2 引脚位置怎么查封装图是唯一的“参考答案”写引脚约束的第一步不是写代码而是查原理图、查封装图。紫光同创芯片的封装资料包括引脚位图Pin Diagram、封装引脚定义表Pin Table在官网对应器件的技术文档里都能找到通常是PDF格式。查引脚要注意几个坑引脚编号要和封装对应。同系列不同封装引脚编号完全不一样比如F676封装和F484封装引脚位置差得不是一星半点千万别拿别人的工程直接改芯片型号就上。注意电源引脚和地引脚。FPGA不比单片机电源脚和地脚非常多分布在各Bank周围。在画原理图和写约束时要确保所有Bank电源VCCIO接对了电压否则特定Bank的引脚即使约束了电平也可能不对。留意NC引脚。NC表示No Connect不能接任何网络有些开发板会把NC脚引出来做扩展接口这在FPGA开发中是禁忌。我以前见过一个经典翻车案例一个同学在淘宝买了一块开发板不看原理图直接拿网上的同一个系列的引脚约束文件想当然改了一下结果下载后板子毫无反应。排查了半天发现他把引脚号对错了代码里写的是IO_LOC led 27;而板子上的LED实际接的是引脚45。这就是不看原理图、不看封装图的代价。如果你的板子买的是市面上常见的开发板比如像黑金、小梅哥这些厂商出的板子一般资料包里有现成的引脚约束模板直接拿过来改一改最省事。如果是自己画板子那就没有捷径必须对着自己画的原理图和CAD封装把每个脚的信息逐一核对这个过程虽然枯燥但值得认真做。3.3 时钟约束让工具知道你的“速度期望”引脚配完之后还要加上时钟约束。紫光同创的PDS支持SDC格式的时序约束最核心的语法是create_clock。比如你的板上有一颗50MHz的有源晶振接在芯片的某个时钟专用引脚上那么在SDC文件或PDC同名的SDC文件里这样写create_clock -name clk -period 20.000 [get_ports clk]-period 20.000表示时钟周期是20纳秒对应50MHz。时钟周期换算公式是T_ns 1000 / F_MHz50MHz对应20ns100MHz对应10ns这个换算关系要熟练很多人在1秒和1纳秒的换算上栽过跟头。除了create_clock还有几个约束在实际项目中经常用到。set_input_delay和set_output_delay定义信号相对时钟的时序裕量对高速IO特别重要。set_false_path用来告诉工具某些路径不需要做时序收敛比如跨时钟域的异步信号可以把它标成false path免得工具在这些路径上浪费布线资源。set_max_delay则对异步信号的延迟上限做约束。时序约束的完整写法需要结合具体的接口协议来设计这里不做展开但对入门者来说明白一件事就够了时钟约束是你告诉工具“我这颗芯片期望跑多快”的唯一途径。写好了工具会努力满足你的期望没写好工具就放养了。3.4 用模板手动改快速完成引脚配置文件有一说一对一个新入门的人从零敲一个完整的约束文件并不容易。我的建议是找一个同系列或者同芯片的官方模板基于模板手动改速度最快。典型步骤是打开PDS工程展开约束目录新建一个PDC文件。通过“Tools - Pin Planner”打开引脚规划器这个功能可视化了芯片封装图鼠标点某个引脚就能看到引脚号、Bank、可用电压等属性极其方便。在引脚规划器里把设计中的所有IO信号手动拖到目标引脚上或者直接在右侧属性表里填引脚号。保存后PDS会自动生成对应的PDC文件你再手动补上IO_TYPE和SLEW等参数。再建一个SDC文件写上时钟约束保存约束部分就完成了。这里要特意表扬一下引脚规划器。紫光同创的PDS在引脚可视化这块做得挺顺手比某些老牌工具更直观它可以按Bank高亮、按信号名搜索、检查引脚冲突这些功能在人工检查的时候作用很大。新手完全可以从Pin Planner入手不需要背引脚号。4. 综合、布局布线与下载调试4.1 从约束到比特流的完整流程约束文件写完接下来就是FPGA开发的标准流程综合 - 布局布线 - 生成下载文件 - 上板调试。在PDS里这些操作一般在“Process”窗口里依次双击即可。综合Synthesis的作用是将RTL代码转换成网表。这一步会检查语法错误、模块例化关系、信号位宽等问题。综合通过并不代表设计没问题它只代表语法层面没有报错。布局布线Place Route则是把网表映射到芯片的实际逻辑单元上这个过程对时序约束的依赖最大。如果时序约束写得严苛布局布线的时间会变长甚至出现负余量Negative Slack。在PDS中生成下载文件一般叫“Generate Bitstream”或“Generate Programming File”生成的文件是.bit或者.pdi格式。这一步做完之后通过下载器把bit流烧进芯片。下载环节有几个要注意的点。首先是下载器紫光同创的下载器一般是JTAG接口市面上有官方下载器也有兼容的第三方下载器。插上之后在PDS里打开“Programmer”工具选择对应器件加载bit文件点击Program就可以了。如果是自己画的板子JTAG的TCK、TDO、TMS、TDI四根线要按菊花链顺序连对初始化失败的时候首先检查这几根线有没有虚焊。4.2 布局布线其实没那么玄但要会看报告很多入门者觉得布局布线就是点一下按钮等它跑完就行。其实布局布线器的日志和报告里藏着大量有用信息学会看报告能省很多排查时间。布局布线跑完之后PDS会生成一份.twr时序报告和.rpt布局布线报告。你要重点关注的内容包括时序余量Setup Slack / Hold Slack如果两个余量都是正的说明时序收敛如果有负余量说明设计在特定时钟频率下无法满足时序要求需要优化代码或约束。资源占用率LUT、FF、BRAM、DSP的使用百分比。如果某个资源用得超过90%布局布线器几乎没有优化空间出现时序违例的概率会大增。这时候要主动优化代码结构而不是加约束硬压。扇出Fanout警告某个信号扇出特别大工具会提示。面向全局复位的信号扇出几千个是一个正常的事但如果一个业务信号扇出几千个说明代码结构有问题会导致布线拥塞、时序变差。举一个实际的例子之前做一个图像处理项目用了某个厂商的软核处理器综合完之后显示LUT占用92%布局布线后一大堆时序违例。后来把一个组合逻辑很重的信号拆成两拍流水LUT占用降到80%以下时序也收敛了。这说明你改了代码结构比硬调约束有用得多。4.3 下载与调试板子没有反应时怎么排查假设你已经把bit流成功下载进FPGA结果板子上的LED不亮UART不发数据这时候该怎么排我建议按照“从简单到复杂”的顺序来排查。先检查最基础的电路信号包括时钟是否进入芯片、复位信号电平是否正确、电源是否稳定。这些都可以用示波器或万用表快速确认。如果时钟有波形、电源电压正常、复位电平也对那大概率是引脚约束或代码逻辑的问题。再检查引脚约束是否和你实际的板子接线一致。对照开发板的原理图把你写的PDC文件里的每个信号逐一核对。这个步骤看起来很笨拙但真的能解决80%的“板子没反应”问题。然后是逻辑问题。用在线逻辑分析仪抓内部信号看看FPGA内部的时钟、复位、核心状态机是否正常工作。紫光同创的PDS自带逻辑分析仪工具不过数量和触发条件有限入门调试基本够用。最后说一个容易被忽视的电源问题。在很多个人设计的板卡上FPGA核心电压VCCINT和IO电压VCCIO必须严格对上核心电压一般需要专用LDO或DCDC稳压器。如果VCCIO接错了电压引脚即使约束了也会工作得不正常这个在排查时很难发现建议从原理图开始就检查一遍。5. 常见问题与排查技巧实录5.1 几个高频报错和对应解决思路我整理了在紫光同创FPGA开发中比较高频的几个报错以及我自己总结的排查思路做成一个速查表供参考报错/现象常见原因排查方向ERROR:IO constraint not found某些引脚没有在PDC中约束打开Pin Planner看是否有未分配的IOERROR:Bank VCCIO mismatchBank的IO电压与约束类型不匹配检查原理图对应Bank的VCCIO电压是否与IO_TYPE一致WARNING:Timing violation时序约束未满足查看时序报告看是Setup还是Hold违例ERROR:Clock net has no driver时钟信号没有正确连接检查代码确认时钟命名和SDC中的get_ports是否一致Program failed / JTAG ID mismatch选择了错误的器件型号或JTAG接线问题查芯片型号查JTAG四线连接这几个报错看起来分散其实背后的共性是别急着看报错信息先问自己三个问题——约束文件写对了吗芯片型号选对了吗原理图接线看对了吗这三个问题的答案一旦确认大多数报错都能自己解开。5.2 资料少、案例少怎么办国产FPGA的一个现实问题是生态和工具链比不过Xilinx和Intel/Altera中文教程相对少案例也不像国外厂商那么丰富。这确实是入门者绕不开的一个坎但不能因此就放弃。我的经验是分三步走。第一步把官方文档读透特别是UG和TRM系列文档。紫光同创官网和官方公众号有技术文档和用户指南这些文档虽然排版风格比较干但信息密度大引脚说明、寄存器定义、工具流程都在里面。第二步利用社区资源比如开源社区、技术论坛、B站的FPGA入门视频很多UP主和站长整理了紫光同创的开发笔记。第三步动手把开发板的官方demo跑通一个再基于demo做小改动从小灯到UART到SPI逐步建立起自己的工程复用库。还有一个小建议学会“翻译式学习”。用Xilinx的文档当成参考搜同一个问题的英文名字比如“Xilinx create_clock constraint”看懂了原理再迁移到紫光同创的写法上这个策略在工具不够用的时候尤其有效。因为FPGA开发的核心方法论是通用的具体工具只是表达方式不同。5.3 关于“国产FPGA值不值得学”的一点体会用国产FPGA做产品这件事前几年大家还有顾虑现在越来越多工程师开始接触它。紫光同创、高云、安路这些国产FPGA厂商的器件在性价比和中低端容量区间已经很能打了。对于学习和开发者来说最大的价值在于你可以用“练习价”的板子体验一套完整的FPGA开发流程。流程跑通了之后万一产品量产要换芯片再迁移也不难因为逻辑设计本身是可移植的改的主要是约束和底层接口。我个人在实际开发中还有一个很深的体会国产FPGA工具链虽然比Vivado简陋一些但代码质量和实现效果不差。如果写的是贴近工业场景的逻辑比如UART、SPI、IIC、SDRAM控制器这类接口逻辑紫光同创的中低端器件完全够用。如果你习惯先做仿真再上板哪怕工具再简陋也拦不住你把功能调通。最后说一个最实用的建议在正式项目里约束文件的版本管理一定要重视。每次修改引脚约束都要更新工程说明文档哪怕只是改了一个引脚号。因为一个项目周期动辄几个月等到你自己都忘了某条约束为什么这么写的时候文档就是你唯一的回忆。这一点和工具链没有关系是每个FPGA工程师都应该养成的习惯。
返回列表