简介:这份PPT文档面向FPGA初学者与数字电路设计入门者,系统梳理了使用QuartusⅡ进行VHDL文本输入设计的完整流程,帮助读者建立从工程创建到在线调试的整体认知。内容涵盖新建项目、编写VHDL代码、Analysis & Elaboration分析与综合,并重点展开SignalTapⅡ逻辑分析仪的使用,包括创建STP文件、设置数据采集时钟、分配Pre-synthesis与Post-fitting信号、配置Basic触发模式等关键环节,同时说明MegaWizard Plug-In Manager实例化HDL模块的两种建库方法。资源包共1个pptx文件,约3.1MB,以图文并茂的幻灯片形式呈现操作界面与步骤示意,便于课堂讲解或自学对照。目前已有228人学习下载,适合作为数字系统设计课程的配套讲义,也可供需要快速上手QuartusⅡ与SignalTapⅡ调试工具的工程师查阅参考。
1. 从一份 VHDL 文本到 Signal 波形:Quartus II 里真正要打通的链路
很多人第一次在 Quartus II 里做 VHDL 设计,卡住的地方往往不是语法,而是流程断点:文件建好了,编译也过了,但 Simulation Waveform 里 Signal 一片空白或者全是红线。问题通常出在“文本输入”和“波形观察”之间那几个被跳过的环节——工程实体名和顶层文件不一致、Testbench 没被识别成仿真顶层、ModelSim 路径没配、Signal 没被加入波形窗口。
这篇内容围绕一条完整链路展开:在 Quartus II 里新建 VHDL 文本文件,走完 Analysis & Synthesis、Fitter、Assembler,再用 University Program VWF 或 ModelSim 观察 Signal 的变化。适合刚接触 FPGA 的在校学生、需要把课程实验跑通的工程师,以及从 Verilog 转 VHDL、想重新梳理工具链的人。下面按“建工程 → 写文本 → 编译 → 仿真看 Signal”的顺序,把每一步的命令、参数和常见坑讲清楚。
2. Quartus II 工程建立与 VHDL 文本输入的关键设置
2.1 新建工程时器件与 EDA 工具怎么选
打开 Quartus II,File → New Project Wizard。第一步选目录和工程名,工程名建议和顶层实体名保持一致,比如demo_top,避免后面 Top-Level Entity 找不到。第二步 Add Files 可以先跳过,文本文件后面单独建。第三步选器件,课程实验常用 Cyclone IV EP4CE 系列,比如EP4CE6E22C8,封装和速度等级按开发板实际填。
第四步 EDA Tool Settings 是重点。Simulation 一栏选 ModelSim-Altera,Format 选 VHDL。如果这里留成 None,后面 RTL Simulation 会直接报“no simulation tool configured”。第五步确认后 Finish。
注意:Quartus II 13.x 和 Quartus Prime 18.1/20.1 的向导界面略有差异,但 EDA Tool Settings 的位置都在同一流程里。新版把 ModelSim-Altera 改叫 ModelSim Intel FPGA Edition,选型逻辑不变。
2.2 用文本编辑器写第一个 VHDL 实体
File → New → VHDL File,得到一个空白.vhd。下面是一个带同步复位的 4 位计数器,作为后续观察 Signal 的载体:
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity demo_top is port ( clk : in std_logic; -- 50MHz 板载时钟 rst_n : in std_logic; -- 低电平复位 q : out std_logic_vector(3 downto 0) -- 计数输出 ); end entity demo_top; architecture rtl of demo_top is signal cnt : unsigned(3 downto 0) := (others => '0'); -- 内部计数寄存器 begin process(clk, rst_n) begin if rst_n = '0' then cnt <= (others => '0'); elsif rising_edge(clk) then cnt <= cnt + 1; -- 每个时钟沿加一 end if; end process; q <= std_logic_vector(cnt); -- 转回 std_logic_vector 输出 end architecture rtl;逻辑说明:cnt是内部 signal,也是后面波形里最值得看的对象;q是端口输出,方便绑定引脚。参数说明:clk接板载晶振,rst_n接按键,q接 LED。保存时文件名必须是demo_top.vhd,和 entity 名严格一致,否则 Analysis & Synthesis 会报“top-level entity not found”。
2.3 把文件设为顶层并做首次编译
Project Navigator 切到 Entity 视图,右键demo_top→ Set as Top-Level Entity。然后 Processing → Start → Start Analysis & Synthesis,或者直接点工具栏的 ▶ 只跑综合。Messages 窗口出现 0 errors 后,再跑 Start Compilation 走完整流程。
| 编译阶段 | 作用 | 失败时先看什么 |
|---|---|---|
| Analysis & Synthesis | 语法检查、综合成门级网表 | 实体名、库引用、端口方向 |
| Fitter | 映射到具体器件资源 | 引脚冲突、资源超限 |
| Assembler | 生成.sof配置文件 | 器件型号是否匹配 |
| TimeQuest | 时序分析 | 时钟约束是否缺失 |
如果综合报Error (10327): VHDL error at demo_top.vhd,先看行号,多数是numeric_std没 use 或者unsigned和std_logic_vector直接混用。
3. 从编译通过到 Signal 波形:仿真配置与观察方法
3.1 用 University Program VWF 快速看 Signal
不想写 Testbench 时,Quartus 自带的 University Program VWF 是最省事的路径。File → New → University Program VWF,打开波形编辑器。Edit → Insert Node or Bus → Node Finder,Filter 选Pins: all或Design Entry (all names),List 后把clk、rst_n、q、cnt全部加到波形窗口。
然后给clk设时钟:选中 clk 信号,Edit → Value → Clock,周期填 20ns(对应 50MHz)。rst_n前 100ns 设为 0,之后设为 1。保存为demo_top.vwf,再 Run Functional Simulation。这一步会调用 ModelSim 在后台跑,结束后自动弹出波形。
注意:VWF 仿真属于功能仿真,不含门延迟。如果波形里
cnt一直是 U(未初始化),检查复位段是否真的拉低过,以及cnt初值是否写了:= (others => '0')。
3.2 写 Testbench 让 Signal 可控可复现
VWF 适合快速验证,但工程化项目更推荐独立 Testbench。新建demo_top_tb.vhd:
library ieee; use ieee.std_logic_1164.all; entity demo_top_tb is end entity demo_top_tb; architecture sim of demo_top_tb is signal clk : std_logic := '0'; signal rst_n : std_logic := '0'; signal q : std_logic_vector(3 downto 0); constant CLK_PERIOD : time := 20 ns; -- 50MHz begin uut : entity work.demo_top port map (clk => clk, rst_n => rst_n, q => q); clk <= not clk after CLK_PERIOD / 2; -- 持续翻转产生时钟 stim : process begin rst_n <= '0'; wait for 100 ns; -- 保持复位 rst_n <= '1'; wait for 500 ns; -- 观察计数 assert false report "sim done" severity note; wait; end process; end architecture sim;逻辑说明:clk用并发赋值自翻转,stim进程负责复位时序。参数说明:CLK_PERIOD决定仿真时钟频率,改小则计数更快。在 Quartus 里 Assignments → Settings → EDA Tool Settings → Simulation 中,把 Testbench 文件加入 NativeLink,顶层设为demo_top_tb,再 Tools → Run Simulation Tool → RTL Simulation。
3.3 Signal 加不进波形的三类原因
第一类,Node Finder 里搜不到cnt。原因是综合把内部 signal 优化掉了。解决办法是在 Signal Tap 或仿真设置里保留层次,或者在代码里给cnt加attribute keep : boolean。第二类,波形里信号名带/层次路径,VWF 不认。改用 ModelSim 命令行add wave -r /*一次性加全部。第三类,ModelSim 报vsim-19找不到库。检查modelsim.ini里的work库映射,或在 Quartus 里重新执行 Tools → Launch Simulation Library Compiler。
4. 引脚绑定、时序约束与 Signal 的进阶观察
4.1 用 Pin Planner 绑定端口并验证 Signal 到引脚
编译通过后,Assignments → Pin Planner。在下方表格里给clk、rst_n、q[3..0]填开发板实际引脚号。填完重新 Start Compilation,Fitter 会检查引脚是否存在、是否冲突。绑定后q的每个位在波形里对应一个 LED,Signal 从仿真走向硬件。
| 端口 | 方向 | 建议引脚类型 | 常见错误 |
|---|---|---|---|
| clk | input | 专用时钟输入 | 接到普通 IO 导致抖动 |
| rst_n | input | 普通 IO + 上拉 | 悬空导致复位不确定 |
| q[3:0] | output | 普通 IO | 与下载口复用冲突 |
4.2 加 SDC 约束让 Signal 时序可查
没有约束时 TimeQuest 不会报真实时序。新建demo_top.sdc:
create_clock -name clk -period 20.000 [get_ports {clk}] derive_pll_clocks derive_clock_uncertainty set_false_path -from [get_ports {rst_n}]逻辑说明:第一行定义 50MHz 时钟,第二行自动推导 PLL 时钟,第三行留时序余量,第四行把异步复位设为 false path。参数说明:-period 20.000单位是 ns,改小等于提高频率要求。跑完 Start Compilation 后打开 TimeQuest Timing Analyzer,看 Setup/Hold 的 Slack 是否为正。
4.3 用 Signal Tap 在真实硬件上看内部 Signal
仿真看不到真实抖动时,Tools → Signal Tap Logic Analyzer。新建.stp,采样时钟选clk,Sample depth 设 1024,把cnt和q加进 Setup。重新编译并下载.sof,Run Analysis。Signal Tap 会占用片上 RAM,深度越大资源越多,调试完记得在 Settings 里关掉再出正式版本。
注意:Signal Tap 和 VWF 观察的是同一批 signal,但前者是硬件实时采样,后者是仿真激励。两者结果不一致时,优先怀疑时钟约束和复位释放时刻。
5. 让 Signal 波形可复用的两个技巧
第一个技巧是把波形配置脚本化。ModelSim 里手动 add wave 很费时,把常用信号写成wave.do:
onerror {resume} quietly WaveActivateNextPane {} 0 add wave -noupdate /demo_top_tb/clk add wave -noupdate /demo_top_tb/rst_n add wave -noupdate -radix unsigned /demo_top_tb/uut/cnt add wave -noupdate -radix hex /demo_top_tb/q run 1 us在 ModelSim 命令行执行do wave.do,波形和运行时长一次到位。-radix unsigned让cnt以十进制显示,比二进制好读;-radix hex适合看总线。换项目时只改层次路径即可。
第二个技巧是给关键 signal 加虚拟信号。VWF 里可以 Insert Virtual Signal,把q的某几位组合成新观察对象,或者把cnt的某一位单独拉出来看翻转频率。做法是 Edit → Insert → Virtual Signal,输入表达式如q[0]或cnt(0),再设成时钟或总线显示。这样不用改 RTL 就能在波形里做二次观察。
最后一个容易忽略的点:仿真跑完不要直接关 ModelSim,先quit -sim再退出,否则下次 NativeLink 调用时可能残留work库锁。Quartus II 13.1 在部分系统上需要以管理员身份首次运行一次,让 ModelSim 完成库编译,之后普通权限即可。Signal 从文本到波形的链路,本质上就是“实体名对齐、仿真顶层选对、信号保留住”这三件事,任何一环断了,波形都不会给你想要的答案。
本文还有配套的精品资源,点击获取