☰
FPGA入门必看:Quartus II原理图、管脚分配、编译下载全流程
2026/10/2 23:26:59 网站建设 项目流程

做FPGA开发绕不开Quartus II这款软件,但很多初学者最难受的阶段不是看不懂Verilog,而是手里有块开发板,却不知道怎么把软件里的电路真正跑起来。我当年第一次用Quartus II连接开发板时,光是管脚分配就卡了整整一下午,明明编译都通过了,下载到板子上灯就是不亮,最后才发现是Pin Planner里引脚的编号填错了。这篇文章就把这条链路完整梳理一遍:原理图绘图、管脚分配、编译、下载,每一步该怎么做、为什么要这么做、遇到问题怎么排查,全部摊开讲清楚。不管你是刚拿到开发板的自学者,还是正在准备课程设计的学生,照着这个流程走一遍,基本能把“软件画图-下载到板”这条全链路彻底打通。

1. 开工前,把这四样东西先搞定

1.1 开发板和下载器怎么选

先说硬件。Quartus II是Intel(原Altera)FPGA的官方开发环境,市面上绝大多数国产开发板用的都是Cyclone IV、Cyclone 10这类芯片,所以选板子时优先确认核心芯片是Intel/Altera的FPGA就行。常见的有EP4CE10F17C8、EP4CE6E22C8、EP4CE15F23C8这些型号,前两位EP4C代表Cyclone IV系列,中间的10或6代表逻辑单元数量级别,后面F17、E22是封装和管脚数,C8是速度等级。

下载器这块,绝大多数学习板标配的是USB-Blaster。这个下载器一端是USB口接电脑,另一端是10针或者14针的JTAG排线接开发板,功能就是把你电脑上编译生成的配置文件烧写到FPGA里。如果手里没有原装的,市面上兼容版也够用,但驱动安装上要花点心思,后面细说。

1.2 Quartus II版本别乱装

很多初学者上来就装最新版Quartus,结果发现自己的开发板芯片型号在器件列表里根本找不到,或者软件启动就要吃好几个G内存,电脑直接卡死。这里有个非常现实的原则:Quartus版本跟着你的芯片走,不是越新越好。

如果你用的是Cyclone IV这种老一代芯片,Quartus II 13.1或者13.0是教学和自学圈子里最稳的选择。这个版本对Cyclone IV支持非常成熟,网上资料多,遇到问题一搜就有答案,而且软件体量相对小,对电脑配置要求也不高。如果芯片是Cyclone 10 LP这类,可以考虑Quartus Prime 17.0以上的版本,但界面和操作逻辑跟老的Quartus II差别不大,本文讲的流程依然适用。

关于软件获取和授权,建议直接去官网下载对应版本,也可以找学校实验室或公司内部分享的安装包。至于License授权,现在很多高校都有正版授权,可以直接用校园网登录获取;个人学习的话,Quartus II本身有30天评估期,也有免费的Web Edition版本,足够做基础的绘图、仿真和下载学习用了。

1.3 安装时最容易踩的坑:驱动

软件本身的安装流程很简单,一路Next就行,真正的坑在USB-Blaster驱动。安装完Quartus后,先把USB-Blaster插到电脑上,打开设备管理器,如果看到一个带感叹号的未知设备,说明驱动还没装上。

驱动的路径一般在Quartus安装目录下的drivers文件夹里,比如C:\altera\13.1\quartus\drivers\usb-blaster。右键未知设备选“更新驱动程序”,手动指定到这个目录,让它搜索安装即可。如果提示驱动签名问题,Windows会拦截老版本驱动,这时可以临时禁用驱动签名强制安装,或者用兼容模式安装驱动,装完之后再恢复签名验证,这个步骤在Win10/Win11上比较容易踩坑。

1.4 工程目录规范(个人极建议)

这一条是血的教训。FPGA项目文件特别多,一个最简单的原理图工程,编译完就会生成几十个衍生文件。我第一次偷懒把所有文件丢在桌面,结果编译一次报错都找不到文件在哪,后来清理系统时误删了工程文件,辛辛苦苦画的电路全部白费。

建议每个工程单独建一个文件夹,命名规则用“日期-项目名”,比如20250312_led_blink。工程内部可以再分src(源文件)、doc(原理图资料、芯片手册)、output(编译输出、下载文件)三个子目录。这样不仅文件好找,后面做版本管理、给别人交接也都方便得多。

2. 创建工程与原理图绘图

2.1 新建工程时的几个关键参数

打开Quartus II,在主界面选择File → New Project Wizard,就开始创建工程了。这里有几个参数要重点注意。

第一是工程名称和顶层实体名称,必须用英文字母开头,不能带中文、空格、特殊符号。比如led_test可以,测试不行,led test也不行。因为Quartus的编译工具链对路径和名称里的非ASCII字符支持不好,开始界面看着没事,编译到一半就会报一堆莫名其妙的错误。

第二是器件型号选择。这里别偷懒直接点Finish,一定要精确选择你的开发板芯片型号。怎么看芯片型号?看开发板上的丝印,通常芯片表面会印一串字母数字,比如EP4CE10F17C8。选错型号会导致后边管脚分配对不上,严重的话下载时直接报ID不匹配。如果实在看不清丝印,可以去买板子的店铺看商品详情页,一般都会把核心芯片型号标出来。

第三是EDA工具设置页面,如果只是做原理图输入和下载,保持默认即可。后面要加ModelSim仿真时,再到Settings里把仿真工具指定为ModelSim,指定好仿真库路径,这个后面可以随时改。

2.2 原理图里怎么“画电路”

Quartus II支持两种主流设计输入方式:原理图输入和Verilog代码。很多学校课程前期会用原理图帮学生建立数字电路概念,后面再过渡到代码。这里的绘图其实是画“逻辑电路图”,不是画PCB,你画的每一个门电路、每一个输入输出符号,最终都会映射到FPGA内部的逻辑单元上。

新建原理图文件,在File → New里选Block Diagram/Schematic File,就会进入图形编辑界面。在空白处双击,或者从菜单栏的Edit → Insert Symbol打开符号库,就可以往原理图上放器件了。

符号库里什么都有:基本逻辑门(与门AND2、或门OR2、非门NOT)、触发器(DFF)、计数器(counter)、输入输出引脚(input、output)、还有各种功能模块(lpm_*系列)。搞数字电路实验时,最常用的就是逻辑门、引脚和几个基础的LPM模块。

举个最简单的例子:做一个LED闪烁的电路。我们先在符号库里放一个input引脚,命名为clk,再放一个output引脚,命名为led。中间放一个counter计数器模块,把计数器最高位接到led上。因为FPGA开发板上的晶振一般是50MHz,计数器计数到一定位数后,最高位的翻转频率差不多就是1Hz左右,LED就会以肉眼可见的频率闪烁。把输入输出引脚用连线工具(工具栏的直角连线图标)连到计数器模块上,一个最简单的原理图工程就算画好了。

2.3 常用但容易忽略的绘图设置

画图时有几个小设置很影响后续效率。

连线时如果不想一条条手动点,可以用自动连线功能,选中一个引脚拖到目标引脚附近松开,软件会自动连好,不过自动连线偶尔会绕弯,还是建议自己拉直角线,整洁的图后面排查问题会很省心。

总线命名要规范。FPGA开发板上LED灯往往有8个,如果每个都画一根线接到输出引脚,图会非常乱。正确做法是先定义一个8位总线输出,比如led[7..0],然后用总线连线(粗线)一次性连接到所有引脚上。能看出原理图设计水平的地方,一半在总线处理上。

每个输入输出引脚双击后都要起名字,名字必须和你的硬件连接对应。比如clk、rst_n、led[7..0]这些。不要用pin1、pin2这种没有含义的名字,后面做管脚分配时你会疯掉。

3. 管脚分配:从逻辑符号到物理引脚

3.1 为什么要管脚分配

这是初学者最容易懵的一步。你在原理图里画的clk、led,在Quartus眼里只是一个个“逻辑信号”,它并不知道这个信号最终要走FPGA芯片的哪一个物理引脚。FPGA芯片有几十上百个引脚,每个引脚都有编号,比如PIN_M9、PIN_A11之类。管脚分配(Pin Assignment)干的事情,就是把逻辑信号和物理引脚一一对应起来。

如果你不分配,Quartus会随便给你挑几个引脚,编译能通过,但下载到板子上后,板子上的LED、按键、晶振根本不会和你的逻辑信号连上,灯当然不会亮。

3.2 查开发板原理图,确认硬件连接

管脚分配最关键的参考文件是开发板的原理图。买开发板时店家通常会附带资料包,里面一定有原理图PDF。打开原理图,找到LED部分的电路,一般会标注类似LED1 -> PIN_3、LED2 -> PIN_4这样的网络名和FPGA引脚号。

同样找到晶振部分,50MHz晶振的输出引脚通常标注为PIN_M9这类,这个引脚就是你要分配给时钟信号的物理引脚。有的开发板原理图可能只标注网络名而非引脚号,那还需要对照FPGA芯片手册里的引脚功能表二次确认,这个工作宁可慢一点也别错,管脚分配错了下载后是没有任何提示的,点不亮就是点不亮。

3.3 Pin Planner实操步骤

管脚分配在Quartus的Pin Planner界面里做。在工程编译前,先点菜单栏Assignments → Pin Planner,就能打开图形化的管脚编辑窗口。

界面左侧是FPGA芯片的物理引脚图,右侧是当前工程里未分配的逻辑信号列表。操作很简单:选中一个逻辑信号(比如clk),在对应的Location栏输入物理引脚编号(比如PIN_M9),或者直接双击后从下拉列表里选择。

分配完所有引脚后,记得保存。Quartus会把分配结果写入工程的.qsf文件里。这一步千万要养成习惯,分配完看一眼I/O Bank电压(一般是3.3V或2.5V),确保和开发板上的bank电压一致,否则就算引脚号对了,电平不匹配也可能导致信号异常。

3.4 管脚分配三条红线

管脚分配虽然操作简单,但有几个红线必须记住。

第一,专用配置引脚不能乱用。FPGA有专用的配置引脚(如DATA0、DCLK、nCONFIG、nCEO等),这些引脚要么是下载配置用的,要么是上电时序控制用的,普通IO功能的引脚分配时别去碰它们。在Pin Planner里,这类引脚通常会有特殊颜色或标注,分配前多留个心。

第二,时钟信号必须接到专用时钟引脚。FPGA芯片上有一组专用全局时钟引脚,用字母加数字表示,比如PIN_M9就可能是全局时钟引脚。如果时钟信号接在普通IO上,功能上也许能跑,但时序会很差,频率高了或者逻辑复杂了就会出时序违例、偶发跑飞的问题。看板子原理图时注意晶振连的是哪个引脚,那个引脚一般就是专用时钟引脚。

第三,分配完一定要重新编译。管脚分配是对工程约束的修改,改了约束不重新编译,下载的还是旧版本,等于白改。而且重新编译时Quartus会做管脚合法性检查,如果有冲突或非法分配,这里会直接报错,比下载后点不亮好排查一百倍。

4. 编译:从原理图到可下载文件

4.1 编译四步,分别干了什么

编译按钮在主工具栏上是最醒目的那个右箭头图标,全称是Start Compilation。但很多人不知道,点这一个按钮的背后,软件自动跑了四个阶段。

第一阶段是分析和综合(Analysis & Synthesis),把你画的原理图或者写的Verilog转换成底层的逻辑网表,也就是把门电路、触发器这些元素映射成FPGA内部的查找表和寄存器资源。这个阶段如果原理图有语法错误、连线错误,都会在这里报出来。

第二阶段是适配(Fitter),也叫布局布线。Quartus会把网表中的逻辑单元放到FPGA内部的物理位置上,并规划好它们之间的走线。这个过程受管脚约束影响很大,管脚分配得好,布线就快且稳;管脚分配乱七八糟的,Fitter要花很多时间绕线,编译速度就慢。

第三阶段是装配(Assembler),生成最终的下载文件。对FPGA来说就是.sof文件,对配置芯片来说就是.pof文件。.sof文件是直接烧进FPGA内部SRAM的,掉电就丢;.pof是写给外部配置芯片的,掉电不丢。

第四阶段是时序分析(Timing Analysis),检查你的设计能不能在时钟要求下正常工作,有没有建立时间违例、保持时间违例。初学者做简单灯控实验,一般不会有时序问题,但如果后面做复杂数字系统、跑高速接口,这步就是决定成败的关键。

4.2 编译通过后看哪几个关键信息

编译结束后,界面底部的Messages窗口会显示整个编译过程的摘要,重点看两个地方。

第一个是资源使用报告。在Compilation Report里展开Fitter → Resource Section,能看到你的工程用了多少逻辑单元、多少寄存器、多少引脚。如果引脚使用数量和你的管脚分配数量对不上,或者逻辑单元用量为0,一定要回头检查是不是原理图画错了,比如输入输出没有真正连到逻辑门上。

第二个是编译告警(Warnings)。这里有几百条告警很正常,但有些告警必须处理。比如提示某某引脚没有分配,说明你有逻辑信号没做管脚约束;提示时钟没有约束或未使用,说明时序分析可能没起作用。双击告警信息可以自动跳到对应位置,比肉眼翻报告快得多。

4.3 编译告警不用全怕,但有几种必须处理

刚开始学的时候,我一看Warnings几百条就紧张,生怕哪里出了问题。后来总结出来,告警分三种。

第一种是信息性告警,比如告诉你某个IP核用了默认参数,这种不影响功能,可以忽略。

第二种是警告性告警,比如Pinsled[0]has no clock,这类说明你某个引脚没有接时钟,查一下是不是漏连了;再比如Output pins are stuck at GND or VCC,说明输出端接死了,多半是逻辑写死的问题。

第三种是错误类告警,虽然显示在Warnings里,但实际是错误前兆,比如时序约束缺失、时钟端口没有驱动等,这类要当成错误处理。

还有一个经验:编译报错不可怕,最怕的是编译通过但下载后没有现象。所以每次编译通过后,我都会去Messages里扫一眼Warnings,凡是和“pin”“clock”“unused”相关的,全部点开看一遍,大概率能提前发现隐患。

5. 下载到板子:跑起来才是硬道理

5.1 硬件连接顺序

编译通过生成了.sof文件,终于到了最激动人心的下载环节。但先别急着点下载按钮,硬件连接顺序很关键。

先把USB-Blaster的JTAG排线插到开发板上,注意排线方向,通常板上会有丝印箭头或者白色标记,插反了虽然一般不会烧板子,但会检测不到器件。再把USB口插到电脑上。最好先插JTAG再插USB,这样设备枚举更稳定。

然后给开发板上电。有些开发板支持USB供电,有些需要单独的电源适配器。上电后看板上电源指示灯是否亮起。这里有个很经典的问题:JTAG排线插着时,如果板子没供电,电脑是检测不到FPGA的,很多人排查半天驱动问题,结果发现是板子忘了上电。上电顺序建议是:JTAG接好 → USB接好 → 开发板上电 → 打开Quartus Programmer。

5.2 Programmer下载实操

在Quartus主界面点Tools → Programmer,打开下载窗口。第一次打开可能左上角硬件显示No Hardware,这时点Hardware Setup,在列表里选择USB-Blaster,点Close返回。

然后在下载列表区域,如果之前编译过,软件会自动把.sof文件关联进来,文件路径显示在列表里。如果没有自动关联,点Add File手动选择工程output目录下的.sof文件就好。

模式选择保持JTAG即可。勾选列表里的Program/Configure一栏的复选框,然后点Start按钮。正常情况下进度条会从0跑到100%,窗口下方的Message区域会显示Succeeded。如果这时开发板上的LED开始按照你预期的方式闪烁或点亮,恭喜,全链路算是真正打通了。

5.3 SOF与JIC:掉电不丢的固化方案

.sof文件是直接配置到FPGA内部SRAM的,优点是用JTAG下载快、适合调试,缺点是掉电就丢失,板子重新上电后配置就没有了。

想要掉电不丢,需要把配置烧写到板子上的配置芯片里,比如EPCS系列。流程是:先在Quartus里点File → Convert Programming Files,把.sof转换成.jic文件。转换时需要指定配置芯片型号,比如EPCS16,要跟你板子上实际焊的配置芯片对应上。

转换生成.jic后,在Programmer里添加这个.jic文件,然后勾选下载。这时Quartus会有提示是否覆盖配置芯片,确认即可。烧写完成后,板子重新上电,FPGA会自动从配置芯片加载程序,LED照样该闪就闪。日常调试用SOF,验证完功能想脱机运行就用JIC固化,这两者的区别一定要搞清楚。

5.4 加餐:SignalTap能省很多事

当你的设计变得复杂,板上现象不对时,全靠肉眼调会非常痛苦。这时候Quartus自带的逻辑分析仪SignalTap II就是救命工具。

SignalTap可以实时抓取FPGA内部节点信号,基本逻辑和示波器类似。在工程里设置一个.stp文件,选择想要观察的信号,设置触发条件,然后重新编译,再用SOF文件下载到板子上。运行SignalTap后,它就能把FPGA内部信号实时抓到电脑上显示成波形。

对初学者来说,这个工具可能用不上,但我建议提前知道它的存在。当你第一次遇到“下载成功了但功能不对劲”,又完全不知道从哪里排查时,能想到用SignalTap去抓内部信号,就已经比很多只会干瞪眼的人强一大截了。

6. 实测常见问题与排查手册

6.1 下载器识别不到

症状:Programmer窗口Hardware Setup里看不到USB-Blaster,或者设备管理器里显示未知设备。

排查步骤按顺序来:

  • 确认开发板已上电,电源指示灯亮;
  • 换一个USB口,优先插主机后面的USB口,前置USB口供电可能不足;
  • 换一根USB线,有些细的充电线只有电源线没有数据线,识别不到就是这原因;
  • 重新安装USB-Blaster驱动,路径在Quartus安装目录的drivers\usb-blaster下;
  • 如果以上都不行,换一台电脑试试,排除是下载器本身的问题。

6.2 JTAG chain 报错

症状:下载时报Error (209015): Can't access JTAG register或者JTAG chain broken。

这类问题多半是JTAG链路有问题。下载器排线没插牢、插反、或者开发板上JTAG引脚有虚焊,都可能导致这个报错。处理方式:重新插拔排线,检查排线方向;确认开发板供电正常;如果板子和下载器之间用了转接板,也检查一下转接板上的跳线设置。这个报错还有个容易忽略的点:开发板上多个JTAG器件——比如FPGA和配置芯片共用一条JTAG链路——如果其中一个器件进入异常状态,整条链路就断了,排查时可以把链路上所有相关芯片的电源都确认一遍。

6.3 引脚冲突与分配后编译错误

症状:管脚分配后重新编译,报出Pin is not assigned或者Conflict错误。

第一种情况是你还有信号没分配引脚,比如原理图上有个output引脚没做Pin Assignment,编译时Fitter不知道放哪,就直接报错。解决方法是回到Pin Planner,把剩余信号全部指定引脚。

第二种情况是分配给某个信号的引脚和另一个信号冲突,或者分配到了专用引脚上。比如你把普通信号分配到了nCE、nCEO这类专用引脚上,Quartus会直接拒绝。这时要看错误信息里提示的是哪个引脚,回到Pin Planner里改掉就好。

还有种隐蔽的情况:使用了lpm_counter这类IP核时,Quartus会为时钟、复位等信号自动分配一些全局信号引脚,如果你又在管脚分配里把这些引脚手动分配给别的信号,会触发资源冲突。遇到这类错误先别急着删分配,看看编译器提示的冲突原因再动手。

6.4 编译速度慢到怀疑人生

编译一个工程动辄几十秒甚至几分钟很正常,但如果慢到离谱就要找原因了。

最大的元凶是工程里包含了大量IP核或复用模块。每次编译都要重新综合一遍所有模块,哪怕你只是改了一个引脚的约束。解决方案是善用Quartus的Incremental Compilation(增量编译)功能,把稳定的模块设为Partition,这样下次编译时没改动的模块可以直接复用上次的结果,速度能快好几倍。

另一个原因是工程文件夹放在了机械硬盘上。FPGA编译会生成海量的小文件,机械硬盘随机读写慢,编译速度会被严重拖累。把工程放到SSD上,直观感受就是编译快很多。如果你的工程文件夹在一台配置一般的老电脑上,可以试试关掉杀毒软件对工程目录的实时监控,有时候杀毒软件扫描生成的文件会疯狂占用IO,拖慢整个编译过程。

管脚分配还有个小技巧,工程里引脚数量非常多时,手动一个个在Pin Planner里拖很痛苦,而且容易出错。这时可以用Tcl脚本批量分配。Quartus支持在命令行里执行Tcl命令,也可以写一个.tcl脚本文件,放置一段像set_location_assignment PIN_M9 -to clk这样的命令列表,然后在Quartus Tcl Console里执行,一次就能把几十个引脚全部约束好。工程越复杂,这个技巧就越值钱,后续改板子改引脚的效率能提升一个量级。

整个流程走下来,你会发现Quartus和开发板之间的链路其实并不复杂,核心就是“绘图→分配管脚→编译→下载”四步。但每一步都有它不能犯的错:绘图时命名要规范,分配时一定要查原理图,编译后要留个心眼看看告警,下载时别忽略硬件连接顺序。踩过几次坑之后,我对这套流程最大的体会就是:FPGA开发不是一个“画画图跑一下”的事,而是“设计、约束、实现、验证”四件事的闭环。管脚约束是硬件和软件之间的桥,编译是逻辑到物理的映射,下载是最后那一脚临门,任何一个环节脱节,板子都不会理你。

最后再分享一个个人习惯:每次跑通一个新功能,我会把编译报告里资源占用、时序裕量、还有当时的.qsf管脚分配文件都截个图存到工程文件夹里。等哪天功能改挂了、性能对不上了,回头翻一翻这些现场记录,往往能很快定位是哪一步改动把原来的状态破坏了。这个习惯帮我省过很多次返工,希望对你也有用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询