Quartus Lite 25.1 首个工程实战:从建工程到全编译出 sof
这是 FPGA 入门线里 Altera(现独立为 Altera,不再挂 Intel 品牌)工具链的动手篇。概念背景看 14-Quartus 工程上手 与 05-开发全流程;Xilinx 一侧的对照看 13-Vivado 工程上手。本篇不复述概念,只做一件事:在 Quartus Prime Lite 25.1std.0.1129(2025-10-21 构建,Altera 分拆后的第一个大版本)上,把一个 LED 闪烁工程从空目录一路编到 sof 出炉,全程批处理脚本可复现、带完整界面截图。
本文要回答的问题
- 不用 GUI 向导,一条命令能把 Quartus 工程建起来并全编译吗?
- 器件型号、引脚、电平标准这些约束在 Tcl 里怎么写?
- 全编译跑完,资源占用报告(用了多少 LE/寄存器/引脚)去哪看?
- 新手最容易踩的「引脚方向不匹配」报错长什么样、怎么修?
一、为什么用批处理 Tcl 而不是 GUI 向导
Quartus 的 New Project Wizard 点六七次鼠标也能建工程,但批处理(quartus_sh -t flow.tcl)有三个硬优势:可复现(脚本即文档,别人 clone 下来一条命令重建工程)、可入版本库(.qsf 约束由脚本生成,不用提交二进制工程文件)、可进 CI(每晚回归编译盯 Error 数)。RTL 工程的 Git 管理思路在 50-RTL 版本管理 有专门讨论,本篇的 flow.tcl 就是那一篇推荐姿势的最小可用版。
二、实验设计:最小的真实工程
要验证工具链,设计越小越好但必须「真」——有时钟、有复位、有时序逻辑、有真实引脚约束。选 LED 闪烁:25 位计数器对 50MHz 时钟分频,数到 25_000_000 翻转一次 LED,约 0.5Hz。
module led_blink (
input wire clk,
input wire rst_n,
output reg led
);
reg [24:0] cnt;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
cnt <= 25'd0;
led <= 1'b0;
end else begin
cnt <= cnt + 25'd1;
if (cnt == 25'd25_000_000 - 1) begin
cnt <= 25'd0;
led <= ~led;
end
end
end
endmodule器件选 EP4CE6E22C8(Cyclone IV E,6,272 个 LE,EP4CE6 核心板是国内最常见的入门板),Quartus Lite 免费支持,不需要 license。计数器与分频的原理铺垫见 23-计数器与分频。
三、flow.tcl:工程即代码
整支脚本 20 行,分四段——建工程、登记器件与源码、下约束、跑全流程:
project_new -overwrite led_blink
set_global_assignment -name FAMILY "Cyclone IV E"
set_global_assignment -name DEVICE EP4CE6E22C8
set_global_assignment -name TOP_LEVEL_ENTITY led_blink
set_global_assignment -name VERILOG_FILE led_blink.v
set_location_assignment PIN_23 -to clk
set_location_assignment PIN_24 -to rst_n
set_location_assignment PIN_87 -to led
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to clk
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to rst_n
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to led
load_package flow
execute_flow -compile三个细节值得记住:project_new 只收一个位置参数(工程名,revision 默认同名)——这是 Quartus 25.1 的 Tcl 口径,写两个会直接报 More than 1 positional argument specified;-overwrite 让脚本幂等,重跑不残留旧工程;set_location_assignment 的引脚必须是器件上方向匹配的真实 IO 脚,踩坑实录见下一节。
这张图看数据流向:脚本是唯一输入,工程文件、比特流、报告全是产物——所以版本库只提交 flow.tcl + led_blink.v,.qpf/.qsf 由脚本重建。
四、真机编译:报错一次,修完一遍过
第一次实跑吃了个经典报错,值得留着当教材:最初把 led 约束到 PIN_25,Fitter 直接拒绝——
Error (169009): Cannot place output or bidirectional pin led in input pin location 25
Error (171000): Can't fit design in device
Error (293001): Quartus Prime Full Compilation was unsuccessful. 4 errorsEP4CE6E22 的 EQFP144 封装里 PIN_25 是输入专用脚,不能放输出。Quartus 的报错信息把方向冲突讲得明明白白,把 led 改到通用 IO 脚 PIN_87 后全编译一次通过。这类「报错原文 → 根因 → 一行修复」的排查套路与 fpga/beginner 排错系列 同构。
修复后的完整编译实录(节选尾部,全量日志见文末实验环境):
读这份日志抓四处:Analysis & Synthesis was successful. 0 errors, 1 warning 说明 RTL 过了语法与综合;Fitter was successful 说明引脚约束合法、布局布线收敛;Assembler was successful 说明 sof 装配出炉;最后 fit.summary 块给出资源账——46 / 6,272 个 LE(<1%)、26 个寄存器、3 个引脚,与一个 25 位计数器 + 1 位输出寄存器的理论值(25 计数位 + 1 led = 26 寄存器)精确吻合。
五、GUI 打开验证:工程确实立起来了
批处理跑完,用 GUI 打开 led_blink.qpf 交叉验证——下图为 Quartus Prime Lite 25.1 打开本工程的完整界面:标题栏显示工程路径与 led_blink,Project Navigator 挂出 Cyclone IV E: EP4CE6E22C8,顶层 led_blink 右侧直接标注 Logic Cells 46 (46)、寄存器 26 (26)——与上一节批处理 fit.summary 的资源账一模一样;Tasks 面板列出 Compile Design 完整阶段(Analysis & Synthesis → Fitter → Assembler → Timing Analysis)。批处理与 GUI 共用同一套工程文件,这就是「工程即代码」的闭环证据。

六、常见坑速查
| 现象 | 根因 | 处置 |
|---|---|---|
More than 1 positional argument specified | project_new 写了两个位置参数 | 只写工程名,revision 用 -revision 显式给 |
Cannot place output pin in input pin location | 引脚方向不匹配(输入脚放了输出) | 查器件 pinout 手册换通用 IO 脚 |
| 编译秒退、无 sof | 前一步报错带病往下跑 | 看日志首个 Error,逐阶段修 |
| GUI 与批处理结果不一致 | 改了 .qsf 没回写脚本 | 约束只进 flow.tcl,GUI 只读不改 |
代码获取
本文全部源码与编译脚本在公开仓:https://github.com/derekzhuo/geek-doc.cn/tree/main/experiments/quartus-lite-first-project——clone 后在 Windows 下执行 <Quartus安装目录>\quartus\bin64\quartus_sh.exe -t flow.tcl 即可复现;仓库里附本次真实编译日志与工程文件。
实验环境
- 机器/系统:Windows 11 26200 工作站(win-worker 节点)
- 工具版本:Quartus Prime Lite 25.1std.0 Build 1129(2025-10-21);同机另装 Questa Altera Starter FPGA Edition vsim 2025.2
- 日期:2026-10-24
- 完整命令:
quartus_sh.exe -t flow.tcl(建工程+全编译);quartus.exe led_blink.qpf(GUI 交叉验证)
这一篇在知识体系里的位置
Altera 工具链动手线的起点:前有概念铺垫 14-Quartus 工程上手、12-厂商与器件家族,后续自然延伸是 36-资源利用率报告(fit.summary 每个字段怎么读)与 37-时序报告入门;Xilinx 对称篇是 13-Vivado 工程上手 与 57-XSim 批处理 dump VCD。仿真侧下一篇会用同机的 Questa Starter 跑这个设计的门级仿真。
一句话总结
Quartus Lite 25.1 首个工程的最短路径是把工程定义写进 flow.tcl 用 quartus_sh 批处理跑通:project_new 单参数建工程、DEVICE 选 Lite 免费档 EP4CE6E22C8、引脚约束注意方向匹配(输入脚不能放输出),execute_flow -compile 一条龙后读 fit.summary 对资源账,GUI 只做交叉验证不做配置源头。