Quick Start
- 步骤一:在您的计算机上安装 ModelSim(Intel FPGA 版,免费)或 GHDL(开源,通过包管理器或官网下载)。
- 步骤二:创建一个工作目录,例如
vhdl_tutorial。 - 步骤三:编写一个简单的 VHDL 设计文件(例如
and_gate.vhdl),实现一个二输入与门。 - 步骤四:编写对应的测试平台文件(例如
and_gate_tb.vhdl),实例化设计并施加激励。 - 步骤五:使用 ModelSim:启动 vsim,执行
vlib work、vcom and_gate.vhdl and_gate_tb.vhdl、vsim work.and_gate_tb、add wave *、run 100 ns,观察波形。 - 步骤六:使用 GHDL:执行
ghdl -a and_gate.vhdl and_gate_tb.vhdl、ghdl -e and_gate_tb、ghdl -r and_gate_tb --vcd=result.vcd,然后用 GTKWave 打开result.vcd查看波形。 - 步骤七:对比两种工具的输出波形,验证与门逻辑正确(输入 00/01/10/11 时输出分别为 0/0/0/1)。
- 步骤八:若遇到编译错误,检查 VHDL 语法(如 entity/architecture 结构、信号声明、端口映射)。
前置条件与环境
| 项目 | 推荐值 | 说明 | 替代方案 |
|---|---|---|---|
| 操作系统 | Windows 10/11 或 Ubuntu 22.04 LTS | ModelSim 对 Windows 支持更好;GHDL 在 Linux 上更稳定 | macOS(需额外配置) |
| EDA 工具 | ModelSim Intel FPGA Starter Edition 2024.1 | 免费,功能完整,支持 VHDL-2008 | ModelSim PE/DE(付费) |
| 仿真器 | GHDL 4.0.0(2026 年最新稳定版) | 开源,支持 VHDL-2008 大部分特性 | nvc(另一开源 VHDL 仿真器) |
| 波形查看器 | GTKWave 3.3.120 | 配合 GHDL 使用,开源免费 | ModelSim 内置波形窗口 |
| 时钟/复位 | 测试平台中生成 100 MHz 时钟(周期 10 ns) | 用于同步逻辑仿真 | 可调频率 |
| 接口依赖 | 标准 VHDL 库(ieee.std_logic_1164, ieee.numeric_std) | 所有工具均支持 | 无 |
| 约束文件 | 无(仿真阶段不需要时序约束) | 上板时才需要 .sdc 或 .xdc | — |
目标与验收标准
- 功能点:能够使用 ModelSim 和 GHDL 分别完成 VHDL 设计的编译、仿真和波形查看。
- 性能指标:仿真运行时间在 1 秒内完成 100 ns 的测试平台(对于入门级设计)。
- 资源占用:ModelSim 启动内存约 200 MB,GHDL 约 50 MB(以实际测量为准)。
- 验收方式:在两种工具中运行同一测试平台,得到完全一致的波形输出(例如与门真值表正确)。
实施步骤
工程结构
vhdl_tutorial/
├── src/
│ └── and_gate.vhdl
├── tb/
│ └── and_gate_tb.vhdl
├── sim/
│ ├── modelsim_run.do (ModelSim 脚本)
│ └── ghdl_run.sh (GHDL 脚本)
└── results/
└── (波形文件存放处)逐行说明
- 第 1 行:
src/目录存放所有设计源文件(.vhdl)。 - 第 2 行:
and_gate.vhdl是二输入与门的实现。 - 第 3 行:
tb/目录存放测试平台文件。 - 第 4 行:
and_gate_tb.vhdl是测试平台。 - 第 5 行:
sim/目录存放仿真脚本,便于重复执行。 - 第 6–7 行:ModelSim 和 GHDL 的自动化脚本。
- 第 8 行:
results/目录存放生成的波形文件(如 .vcd 或 .wlf)。
关键模块:设计文件 (and_gate.vhdl)
-- and_gate.vhdl
library ieee;
use ieee.std_logic_1164.all;
entity and_gate is
port (
a : in std_logic;
b : in std_logic;
y : out std_logic
);
end entity and_gate;
architecture rtl of and_gate is
begin
y <= a and b;
end architecture rtl;逐行说明
- 第 1 行:注释,说明文件名。
- 第 2–3 行:声明使用
ieee库和std_logic_1164包,这是 VHDL 标准逻辑类型库。 - 第 5 行:定义实体
and_gate,这是设计的外部接口。 - 第 6–9 行:端口声明,
a和b是输入(in),y是输出(out),类型均为std_logic(标准逻辑位)。 - 第 10 行:结束实体声明。
- 第 12 行:定义架构
rtl,描述内部行为。 - 第 14 行:并发赋值语句,
y等于a和b的逻辑与。综合时会生成一个与门。 - 第 15 行:结束架构。
关键模块:测试平台 (and_gate_tb.vhdl)
-- and_gate_tb.vhdl
library ieee;
use ieee.std_logic_1164.all;
entity and_gate_tb is
end entity and_gate_tb;
architecture sim of and_gate_tb is
signal a, b, y : std_logic;
begin
-- 实例化被测设计
dut : entity work.and_gate
port map (
a => a,
b => b,
y => y
);
-- 激励生成
process is
begin
a <= '0'; b <= '0'; wait for 10 ns;
a <= '0'; b <= '1'; wait for 10 ns;
a <= '1'; b <= '0'; wait for 10 ns;
a <= '1'; b <= '1'; wait for 10 ns;
wait; -- 仿真结束
end process;
end architecture sim;逐行说明
- 第 1 行:注释。
- 第 2–3 行:库和包声明。
- 第 5 行:实体
and_gate_tb没有端口(测试平台是顶层)。 - 第 7 行:架构
sim。 - 第 8 行:声明内部信号
a、b、y,用于连接被测设计。 - 第 10–14 行:使用直接实体例化方式实例化
and_gate,端口映射通过=>连接。 - 第 16–23 行:无敏感列表的进程,用于生成激励。
wait for语句控制时间间隔。 - 第 18–21 行:依次施加四种输入组合,每个组合持续 10 ns。
- 第 22 行:
wait;使进程永远挂起,仿真停止。
时序/CDC/约束
对于入门级组合逻辑设计,无需考虑时序约束或跨时钟域(CDC)问题。仿真时,ModelSim 和 GHDL 默认使用 delta 延迟模型,所有信号赋值在 delta 周期内更新,确保行为正确。若设计中包含时钟,需在测试平台中显式生成时钟信号(例如 clk <= not clk after 5 ns;)。
验证
运行仿真后,观察波形:
- ModelSim:在波形窗口中检查
y是否在a和b均为 '1' 时输出 '1',否则为 '0'。 - GHDL + GTKWave:打开
result.vcd,同样检查波形。 - 若波形不正确,检查端口映射顺序或信号赋值。
上板(可选)
若要将设计下载到 FPGA 开发板(例如 Intel Cyclone IV),需添加约束文件(.sdc)并综合/实现。但本文聚焦仿真对比,上板步骤从略。
常见坑与排查
- 坑 1:ModelSim 编译时提示“library not found”。检查是否执行了
vlib work创建工作库。 - 坑 2:GHDL 运行时提示“cannot open vcd file”。确保目录有写权限,或指定绝对路径。
- 坑 3:波形中信号显示为“U”(未初始化)。检查测试平台是否给所有输入信号赋了初值。
原理与设计说明
为什么选择 ModelSim 和 GHDL 进行对比?
- ModelSim:工业标准仿真器,支持 VHDL/Verilog/SystemVerilog,图形界面完善,调试功能强大(如波形、断点、Tcl 脚本)。但商业软件,免费版有性能限制(如代码行数限制)。
- GHDL:开源仿真器,基于 GCC 或 LLVM 后端,速度快(尤其对于大型设计),支持 VHDL-2008 大部分特性。无图形界面,需配合 GTKWave 查看波形。适合自动化测试和 CI/CD 流程。
关键 trade-off:
- 资源 vs Fmax:仿真器不涉及 Fmax(那是综合工具的事)。但 GHDL 的内存占用通常低于 ModelSim,适合资源受限环境。
- 吞吐 vs 延迟:GHDL 编译速度更快(LLVM 后端),但调试时缺乏图形化波形检查;ModelSim 编译稍慢,但调试效率高。
- 易用性 vs 可移植性:ModelSim 开箱即用,适合初学者;GHDL 需命令行操作,但脚本化后易于集成到自动化流程。
验证与结果
| 指标 | ModelSim (Intel FPGA Starter 2024.1) | GHDL 4.0.0 (LLVM) |
|---|---|---|
| 编译时间 | 约 0.8 秒 | 约 0.3 秒 |
| 仿真时间 (100 ns) | 约 0.2 秒 | 约 0.1 秒 |
| 内存占用 (仿真时) | 约 180 MB | 约 45 MB |
| 波形查看 | 内置波形窗口,即时更新 | 需 GTKWave 打开 .vcd 文件 |
| VHDL-2008 支持 | 完整 | 大部分(除少数特性如 protected types) |
测量条件:同一台 Windows 11 机器(Intel i7-12700, 32 GB RAM),设计为上述与门测试平台。数值为示例典型值,以实际工程为准。
故障排查 (Troubleshooting)
- 现象:ModelSim 启动时提示“License check failed”。原因:环境变量 LM_LICENSE_FILE 未设置或无效。检查点:确认安装了免费版并正确设置 license。修复建议:重装或使用 Intel FPGA 版(无需 license)。
- 现象:GHDL 编译时报告“error: cannot find std_logic_1164”。原因:未正确链接标准库。检查点:GHDL 安装路径是否在 PATH 中。修复建议:重新安装 GHDL 或设置 GHDL_PREFIX 环境变量。
- 现象:GTKWave 打开 .vcd 文件后无波形。原因:仿真未生成信号变化。检查点:确认测试平台中 wait for 语句是否执行。修复建议:在 GHDL 运行时添加
--stop-time=100ns参数。 - 现象:ModelSim 波形中信号显示为“X”(未知)。原因:信号冲突或未驱动。检查点:检查端口映射是否遗漏。修复建议:确保所有输入信号在测试平台中被赋值。
- 现象:GHDL 运行时报“segmentation fault”。原因:编译器 bug 或内存不足。检查点:尝试降低优化级别(如
-O0)。修复建议:升级到最新 GHDL 版本。 - 现象:ModelSim 编译 VHDL-2008 语法失败。原因:免费版可能限制某些特性。检查点:检查是否使用了
-2008编译选项。修复建议:在vcom命令后添加-2008标志。 - 现象:GHDL 不支持
ieee_proposed库。原因:该库非标准。检查点:改用ieee标准库。修复建议:使用numeric_std代替。 - 现象:仿真结果与预期不符(如与门输出始终为 '0')。原因:测试平台中信号赋值顺序错误。检查点:检查是否在
process中使用了wait for。修复建议:确保所有输入组合都被覆盖。
扩展与下一步
- 扩展 1:参数化设计——将与门改为通用逻辑门(如
generic指定门类型)。 - 扩展 2:带宽提升——学习使用
for generate构建多比特总线逻辑。 - 扩展 3:跨平台——在 Linux 下使用 GHDL + Makefile 实现自动化仿真。
- 扩展 4:加入断言——在测试平台中使用 VHDL 断言(
assert)自动检查结果。 - 扩展 5:覆盖率——使用 GHDL 的
--coverage选项生成代码覆盖率报告。 - 扩展 6:形式验证——结合 SymbiYosys 和 GHDL 进行属性检查(需额外工具链)。
参考与信息来源
- GHDL 官方文档:https://ghdl.readthedocs.io/
- ModelSim Intel FPGA 版下载与用户指南:https://www.intel.com/content/www/us/en/software/programmable/quartus-prime/model-sim.html
- GTKWave 用户手册:http://gtkwave.sourceforge.net/
- VHDL 标准 IEEE 1076-2008 摘要:https://ieeexplore.ieee.org/document/4772740
- 成电国芯 FPGA 学习平台 VHDL 入门课程(内部资料,仅作背景参考)。
技术附录
术语表
| 术语 | 解释 |
|---|---|
| VHDL | VHSIC Hardware Description Language,硬件描述语言 |
| Entity | VHDL 中定义模块接口的关键字 |
| Architecture | VHDL 中描述模块内部行为或结构的关键字 |
| Testbench | 测试平台,用于验证设计的 VHDL 代码 |
| Delta 延迟 | VHDL 仿真中的无限小时间单位,用于处理并发赋值 |
| VCD | Value Change Dump,波形文件格式 |
检查清单
- 设计文件语法正确(无编译错误)
- 测试平台覆盖所有输入组合
- ModelSim 和 GHDL 仿真结果一致
- 波形中无 'U' 或 'X' 状态
关键约束速查
- ModelSim 编译命令:
vcom -2008 file.vhdl - GHDL 编译命令:
ghdl -a --std=08 file.vhdl - GHDL 运行命令:
ghdl -r entity_name --vcd=output.vcd



