Quartus II VHDL 设计:从文本输入到 Signal 波形观察的完整链路

Quartus II VHDL 设计:从文本输入到 Signal 波形观察的完整链路 简介这份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 IIFile → New Project Wizard。第一步选目录和工程名工程名建议和顶层实体名保持一致比如demo_top避免后面 Top-Level Entity 找不到。第二步 Add Files 可以先跳过文本文件后面单独建。第三步选器件课程实验常用 Cyclone IV EP4CE 系列比如EP4CE6E22C8封装和速度等级按开发板实际填。第四步 EDA Tool Settings 是重点。Simulation 一栏选 ModelSim-AlteraFormat 选 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 FinderFilter 选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.vhdlibrary 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 CompilationFitter 会检查引脚是否存在、是否冲突。绑定后q的每个位在波形里对应一个 LEDSignal 从仿真走向硬件。端口方向建议引脚类型常见错误clkinput专用时钟输入接到普通 IO 导致抖动rst_ninput普通 IO 上拉悬空导致复位不确定q[3:0]output普通 IO与下载口复用冲突4.2 加 SDC 约束让 Signal 时序可查没有约束时 TimeQuest 不会报真实时序。新建demo_top.sdccreate_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采样时钟选clkSample depth 设 1024把cnt和q加进 Setup。重新编译并下载.sofRun Analysis。Signal Tap 会占用片上 RAM深度越大资源越多调试完记得在 Settings 里关掉再出正式版本。注意Signal Tap 和 VWF 观察的是同一批 signal但前者是硬件实时采样后者是仿真激励。两者结果不一致时优先怀疑时钟约束和复位释放时刻。5. 让 Signal 波形可复用的两个技巧第一个技巧是把波形配置脚本化。ModelSim 里手动 add wave 很费时把常用信号写成wave.doonerror {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 从文本到波形的链路本质上就是“实体名对齐、仿真顶层选对、信号保留住”这三件事任何一环断了波形都不会给你想要的答案。本文还有配套的精品资源点击获取