ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Quartus II FPGA入门:原理图与Verilog仿真下载全流程

Quartus II FPGA入门:原理图与Verilog仿真下载全流程 简介这份文档面向FPGA初学者、电子信息类专业学生及需要快速上手Intel Quartus II的硬件工程师用于解决从零搭建开发流程、跑通第一个可下载工程的问题。压缩包内仅1个PDF文件约2.22MB按章节编排涵盖工程建立、原理图输入、Verilog文本编辑与波形仿真四条主线。内容以实例驱动从New Project Wizard指定工作目录、工程名称与目标器件到调用符号库放置dff、input、not、output等元件完成原理图连线并命名信号再到新建Verilog HDL文件编写代码最后通过波形仿真观察时钟与输入信号、定位时序问题。文档还涉及器件指定、管脚绑定、未用引脚设置及AS与JTAG两种下载模式的差异与文件格式选择步骤配有软件界面截图与编号说明便于边看边练、对照排错。目前已有1417人学习下载适合作为课程实验、自学入门或工程模板查阅的手边参考资料。1. 一个 .bdf 加一个 .v把 Quartus II 的完整链路跑通第一次打开 Quartus II 的人八成会在菜单栏前愣两分钟——File 下面既有 New 又有 New Project WizardAssignments 里同时藏着 Device 和 Pins仿真和下载又是两套完全不同的文件格式。这份教程对应的正是最经典的那条最小路径先建工程再用原理图或者 Verilog 描述一个 D 触发器接着做波形仿真最后绑引脚、下到板子上。链路本身不长但每一步都有默认值会坑人工程名和顶层实体名对不上、Unused Pins 没改、下载时把 .sof 和 .pof 用错模式。把这条最小链路完整走通一遍后面再去做状态机、总线和时序约束手里才有可以对照的基线。2. 工程建立与原理图输入New Project Wizard 与 .bdf 走一遍原理图这条路是 Quartus II 里最直观的入口画出来的东西和课本上的电路图几乎一一对应特别适合验证「软件装好了没有、器件选对了没有」这两件事。它的问题也很明显元件一多就没法维护所以真实项目里通常只用它搭顶层把具体的逻辑丢给 Verilog 模块。2.1 New Project Wizard 的六个页面哪些必须填哪些能跳从 File → New Project Wizard 进入向导一共六页真正不能跳的只有第二页和第四页。第二页要填工作目录、工程名、顶层实体名第四页要选器件系列和具体型号。第一页是介绍第三页加已有文件第五页配第三方 EDA 工具第六页是概要都可以直接 Next 或者 Finish。页面关键字段建议1 Introduction无直接 Next2 Directory / Name工作目录、工程名、顶层实体名目录不能含中文和空格3 Add Files已有源文件新建工程直接 Next4 Family Device器件系列、型号按板子实际芯片选别用 Auto5 EDA Tool Settings综合、仿真、时序工具全用 Quartus 自带就保持默认6 Summary配置汇总核对一遍再 Finish提示工作目录里出现中文、空格或者过长的路径后期生成 IP 和调用仿真器时经常报找不到文件一开始就换成纯英文短路径最省事。第三页放弃添加文件是有意义的Quartus II 允许在建完工程之后随时通过 Project → Add/Remove Files in Project 补文件比在向导里一次选错再回头改要快。第五页如果不用 Synplify、ModelSim 这类外部工具直接保持默认即可强行指定工具链反而会让后面编译流程多出一层依赖。2.2 从符号库捞出 dffSymbol 搜索与元件放置建好工程后File → New在 Design Files 里选 Block Diagram/Schematic File得到一张空白原理图保存成 try1.bdf。在空白处双击会弹出 Symbol 对话框Symbol Name 输入框里键入 dff下面 Libraries 列表会定位到对应的库节点点 OK 之后光标上就粘着一个 D 触发器符号挪到合适位置单击左键落下。按照同样的方式再放置 input、not、output 三个符号。not 在这里的作用是演示逻辑门和触发器混排的摆放方式实际接线时可以先把 input 直接接到 D 触发器上把 not 串在中间做一次反相仿真波形上的差别一眼就能看出来。放置顺序上有个小习惯值得养成先摆输入再摆中间逻辑最后摆输出从左到右排开。连线的时候不容易交叉后期改电路也不用大范围挪位置。2.3 连线、命名 clk/Q 与第一次编译连线用鼠标就能完成把光标移到 input 右侧的待连线端点单击左键再移到 D 触发器左侧的输入端单击左键两点之间自动生成一条线。按同样的方式把 DFF 和 output 连起来电路就闭合了。接下来是命名。双击 input 符号上的input_name字样等文字底色变黑后键入clk输出端同理改成Q。信号名一定要改直接用默认的input0、output0后面 Node Finder 里根本认不出来哪个是哪个。命名完成后保存Quartus II 会默认以 try1 为名、以 .bdf 为后缀存盘。然后点工具栏上的编译按钮等价于 Processing → Start Compilation。编译结束后 Messages 窗口会给出 Error 和 Warning 的条数双击某一条可以直接跳到出问题的位置。第一次编译最常见的两类报错是「没有指定顶层实体」和「找不到器件」前者检查 Project → Set as Top-level Entity后者检查 Assignments → Device。2.4 Assignments → Device 指定目标器件Assignments → Device 打开器件设置窗口左侧按系列筛选右侧列出该系列下的具体型号。这一步别图省事用 Auto自动选出来的器件未必和板子一致综合出来的引脚规划会和实物对不上。选定器件后同一窗口里还有 Device and Pin Options里面有几个子页后面会反复用到Unused Pins 页决定未使用引脚的电平状态Configuration 页决定配置芯片和配置模式Voltage 页决定 IO 电平标准。第一次用默认值能跑通但引脚绑定之前一定要回来把 Unused Pins 改掉。3. Verilog 文本编辑模块名、顶层实体与符号文件三件套原理图画小电路快画到几十个元件就崩了。这时候切到 Verilog 是自然选择。Quartus II 自带的文本编辑器没有语法高亮提示以外的高级功能但它的好处是和工程体系完全打通写好的 .v 文件编译、仿真、绑引脚、下载的流程和 .bdf 一模一样。3.1 新建 Verilog HDL File 与文件名/模块名一致性File → New → Design Files → Verilog HDL File确定后进入空白编辑区。这份教程里给的例子是 D 触发器文件名存成 dff1.v。这里有一条硬规则文件名必须和 module 名完全一致包括大小写。如果文件叫 dff1.v 而模块写成module dff_1编译时会在顶层实体匹配环节报错提示找不到对应的设计单元。工程名叫 project2 而文件名叫 dff1.v 是可以的工程名和模块名是两回事别混在一起。3.2 D 触发器的可综合写法// dff1.v —— 文件名必须与 module 名一致 module dff1 ( input clk, // 时钟上升沿有效 input d, // 数据输入 output reg q // 输出always 块内赋值必须声明为 reg ); always (posedge clk) begin q d; // 非阻塞赋值综合出边沿触发的寄存器 end endmodule这段代码里有三个点值得说清。第一always (posedge clk)描述的是边沿敏感逻辑综合工具会把它映射成触发器写成always (clk)就成了电平敏感行为和预期完全不同。第二q d用的是非阻塞赋值时序逻辑里用非阻塞是约定用在某些工具下会综合出意料之外的链路。第三输出端口声明成reg不是说要占用一个寄存器资源而是 Verilog 的语法要求凡是在always块里被赋值的信号声明时都必须是 reg 类型。加异步复位后的版本更贴近实际工程module dff_rst ( input clk, input rst_n, // 低电平有效的异步复位 input d, output reg q ); always (posedge clk or negedge rst_n) begin if (!rst_n) q 1b0; // 复位优先级最高 else q d; end endmoduleposedge clk or negedge rst_n这个敏感列表决定了复位是异步的只要 rst_n 拉低输出立刻清零不用等时钟沿。写出这种结构之后仿真和上板行为的差异会小很多。下面这张表是新手最常踩的可综合边界写法能否综合说明always (posedge clk)可以时序逻辑映射为触发器always (*)可以组合逻辑建议配合case写全分支#10 d 1;不可以只用于仿真延时综合工具直接忽略initial赋初值谨慎依赖器件上电特性用复位替代更稳$display不可以仿真打印语句综合时被丢弃3.3 Set as Top-level Entity 与 Create Symbol Files文件写完之后先做 Project → Set as Top-level Entity把 dff1 指定为顶层实体。这一步比想象中重要工程里存在多个 .v 文件时Quartus II 需要一个明确入口来决定从哪个模块开始综合没指定就会随机挑或者直接报错。然后是 File → Create/Update → Create Symbol Files for Current File它会根据当前 .v 生成一个同名的 .bsf 符号文件。生成之后回到 .bdf 原理图里双击空白处就能在工程库节点下找到 dff1 这个符号像内置元件一样直接摆放。这就是「Verilog 写模块、原理图搭顶层」的混合做法在需要把多个模块拼在一起的项目里很常用。提示.v 文件改动之后.bsf 不会自动更新。改了端口列表却忘了重新生成符号文件原理图里的元件会停留在旧接口上编译时报端口不匹配很多人会在这上面卡很久。3.4 原理图与 Verilog 混合工程的组织方式两种方式混用的组织思路大致分两种。自顶向下的做法是先画 .bdf 顶层把各个功能块的接口规划好再逐个用 Verilog 实现生成 .bsf 后替换掉顶层里的占位符号。自底向上的做法是先写一堆独立模块逐个仿真验证最后用一个 .bdf 或者一个纯 Verilog 顶层把它们连起来。两种方式都行但要注意一致性问题Verilog 模块的端口位宽、方向、命名必须和 .bdf 里引用的符号完全对得上。端口名改了而符号没更新是混合工程里最高频的错误来源。4. 波形仿真、引脚绑定与下载从 .vwf 到 .sof/.pof设计写完不仿真等于闭着眼睛上板。Quartus II 自带的仿真器功能不算强但胜在和工程无缝衔接改一行代码重新跑一次仿真只要几秒钟。仿真通过之后再绑引脚、配置硬件、下载整条链路就走完了。4.1 新建 Vector Waveform File 与 Node Finder 筛节点打开 project2 工程File → New → Verification/Debugging Files → University Program VWF得到一个空白的矢量波形文件。在左侧节点列表区域右键选择 Insert Node or Bus点开 Node Finder 对话框。Node Finder 里的 Filter 是决定能不能找到信号的关键。要仿真顶层输入输出引脚选 Pins: all要抓内部寄存器或者中间信号选 Signal Tap 之外的设计实体相关选项并且得先把该信号在综合时保留下来。教程里仿的是输入输出管脚所以 Filter 选 Pins: all点 List左栏会列出全部引脚。从左栏选中需要观察的端口用中间的按钮移到右栏确定后信号就出现在波形文件里了。4.2 激励编辑End Time、Grid Size 与时钟周期波形文件上方的编辑工具栏决定仿真的时间尺度和激励形状。几个参数先定下来End Time 决定仿真总时长跑一个 8 位计数器至少得覆盖几百个时钟周期Grid Size 决定鼠标拖动波形时的最小时间粒度一般设成时钟周期的一半画时钟方便时钟信号用工具栏上的时钟按钮指定周期和占空比比手动拖边界准确得多对 D 触发器来说最省事的验证方式是给 clk 一个固定周期给 d 一段随意的 0/1 序列跑完看 q 是不是在每个时钟上升沿采到 d 的值。4.3 功能仿真与时序仿真的差别Quartus II 里跑仿真有两条路。Processing → Simulator Tool 打开仿真器设置Simulation mode 里选 Functional 就是功能仿真只看逻辑对不对不考虑布线延时选 Timing 就是时序仿真需要先跑完 Fitter 和 Timing Analysis波形上会带真实的门延时和布线延时能看出建立保持时间够不够。仿真模式需要的编译阶段波形特征适用场景FunctionalAnalysis Synthesis干净无毛刺验证逻辑正确性Timing完整编译 Timing Analysis带延时和毛刺验证高频下的时序余量仿真结果出来后波形窗口上会出现 q 的跳变。如果 q 一直不动先查时钟有没有真的加进去——波形文件里时钟信号如果没设置成时钟属性仿真器会把它当普通信号永远保持 0。4.4 Pins 面板绑定引脚与 Unused Pins 设置仿真通过接着把信号挂到物理引脚上。Assignments → Pins 打开引脚分配面板双击对应管脚那一行的 Location 空白框下拉菜单里列出当前器件所有可用引脚号按实验板的原理图选。# pin_assign.tcl —— 下列引脚号仅为示例按实验板原理图替换 # 在 Tools - Tcl Scripts 里选中本文件执行或直接在 Tcl Console 里 source set_location_assignment PIN_23 -to clk set_location_assignment PIN_25 -to d set_location_assignment PIN_27 -to q # 未使用引脚统一设为三态输入避免悬空引脚在板级引入干扰 set_global_assignment -name RESERVE_ALL_UNUSED_PINS AS INPUT TRI-STATEDset_location_assignment是 Quartus 的 Tcl 命令第一个参数是器件引脚号-to后面跟顶层端口名被执行的约束会写进工程的 .qsf 文件。set_global_assignment那条对应图形界面里的 Assignments → Device → Device and Pin Options → Unused Pins 设置项取值AS INPUT TRI-STATED表示未使用引脚作为三态输入。注意未使用引脚保持默认的As output driving ground时它们会被驱动到低电平。如果板子上这些引脚正好接着别的器件上电就可能出现意外拉低甚至电流倒灌。分配完引脚后记得回头把 Unused Pins 改成三态输入然后重新完整编译一次。4.5 Programmer 里 JTAG 与 AS 的选择编译产物在工程目录下的 output_files 里JTAG 模式用 .sofAS 模式用 .pof。点工具栏的 Programmer 按钮进入下载界面先 Hardware Setup在 Add Hardware 里添加 ByteBlaster II 或者对应的下载器双击可选列表里的硬件让它出现在当前选择栏中。模式选择上两种方式差别很大模式目标使用文件掉电后适用阶段JTAGFPGA 内部 SRAM.sof配置丢失需重新下载调试期改一次下一次AS板上配置芯片.pof掉电保持上电自动加载交付或者长期运行用 AS 模式时还要在 Assignments → Device → Device Pin Options 里指定配置芯片型号否则生成 .pof 时会报找不到配置器件。设置完重新编译Programmer 里选中 .pof点 Start 开始烧写。5. 编译报错定位与上板验证几个能省半天的技巧前面几步都走通之后真正耗时间的往往不是写代码而是「编译过了但板子不工作」。下面这些排查顺序和工具用法基本上能覆盖八成以上的新手卡点。5.1 用 Messages 面板分层定位错误编译失败时别急着从头读报错文本。Messages 面板顶部有 Error、Warning、Info 三个标签先看 Error 的条数。Quartus II 的报错是分层的最上面一条通常才是根因下面的往往是被带出来的连锁错误。双击报错条目会跳到对应位置或者对应的工具报告。常见根因就几类顶层实体未指定、模块名与文件名不一致、端口位宽不匹配、引脚约束指向了不存在的端口名。把这四类排掉剩下的多半是 Verilog 语法问题编辑器里 CtrlL 能直接跳到第一个语法错误行。5.2 用 Tcl 脚本管理引脚约束和工程配置图形界面点引脚几十个信号还行上百个就纯体力活了。更稳的做法是把引脚约束写成 Tcl 脚本提交到版本控制里。前面那段pin_assign.tcl可以直接在 Tools → Tcl Scripts 里执行执行完打开 Assignments → Pins 面板会看到 Location 已经填好了。这么做的另一个好处是可复现工程配置全部落在 .qsf 和 .sdc 这两个文本文件里配合 .v、.bdf 一起管理换台机器重新编译引脚分配一字不差。5.3 上板不工作时按这个顺序查下载报告显示成功但功能不对按下面的顺序过一遍比乱试快得多确认下载的是当前编译出来的文件。改过代码没重新编译Programmer 里还是旧时间戳的 .sof现象会完全对不上。确认引脚分配和板子原理图一一对应。尤其是时钟接到普通 IO 上时钟网络走不通逻辑会完全不跑。用示波器或者逻辑分析仪看时钟脚有没有波形。没有波形先查晶振和板子供电问题不在设计里。检查复位信号的电平极性。写的是negedge rst_n硬件上却给了高电平有效输出会一直停在复位值。用 Signal Tap 抓内部信号。Processing → Start Analysis Synthesis 之后打开 Signal Tap Logic Analyzer把关心的信号加进去重新编译下载能看到 FPGA 内部真实跑出来的波形。还有一种情况是 JTAG 下载正常、AS 模式上电却不启动。这时候重点看两处配置芯片型号是否和板上实物一致以及 .pof 是不是用当前工程重新生成的。用过期的 .pof 烧配置芯片现象就是板子一上电毫无反应重新上电也没用。换机器时只拷 .v 和 .bdf 而漏掉 .qsf引脚分配会全部回到未分配状态编译照样能过但板子一定不工作。本文还有配套的精品资源点击获取
返回列表