安装或设置
可以模拟或合成 VHDL 程序。模拟与其他编程语言中的大多数执行类似。综合将 VHDL 程序转换为逻辑门网络。许多 VHDL 仿真和综合工具是商业电子设计自动化(EDA)套件的一部分。它们还经常处理其他硬件描述语言(HDL),如 Verilog,SystemVerilog 或 SystemC。存在一些免费和开源应用程序。
VHDL 仿真
GHDL 可能是最成熟的免费和开源 VHDL 模拟器。它有三种不同的风格,取决于使用的后端:gcc
,llvm
或 mcode
。以下示例显示如何在 GNU / Linux 操作系统下使用 GHDL(mcode
版本)和 Modelsim(Mentor Graphics 的商业 HDL 模拟器)。与其他工具和其他操作系统非常相似。
Hello World
创建一个文件 hello_world.vhd
,其中包含:
-- File hello_world.vhd
entity hello_world is
end entity hello_world;
architecture arc of hello_world is
begin
assert false report "Hello world!" severity note;
end architecture arc;
VHDL 编译单元是一个完整的 VHDL 程序,可以单独编译。实体是 VHDL 编译单元,用于描述数字电路的外部接口,即其输入和输出端口。在我们的例子中,entity
被命名为 hello_world
并且是空的。我们正在建模的电路是一个黑盒子,没有输入也没有输出。体系结构是另一种类型的编译单元。它们总是与 entity
相关联,它们用于描述数字电路的行为。一个实体可以具有一个或多个体系结构来描述实体的行为。在我们的示例中,实体仅与一个体系结构相关联 ** 名为 arc
,只包含一个 VHDL 语句:
assert false report "Hello world!" severity note;
该语句将在模拟开始时执行,并在标准输出上打印 Hello world!
消息。然后模拟将结束,因为没有更多的事情要做。我们编写的 VHDL 源文件包含两个编译单元。我们可以将它们分成两个不同的文件但我们不能将它们中的任何一个拆分为不同的文件:编译单元必须完全包含在一个源文件中。请注意,此架构无法合成,因为它没有描述可以直接转换为逻辑门的函数。
使用 GHDL 分析并运行程序:
$ mkdir gh_work
$ ghdl -a --workdir=gh_work hello_world.vhd
$ ghdl -r --workdir=gh_work hello_world
hello_world.vhd:6:8:@0ms:(assertion note): Hello world!
gh_work
目录是 GHDL 存储它生成的文件的地方。这就是 --workdir=gh_work
选项所说的。分析阶段检查语法正确性并生成描述源文件中找到的编译单元的文本文件。运行阶段实际上编译,链接和执行程序。请注意,在 mcode
版本的 GHDL 中,不会生成任何二进制文件。每次我们模拟它时都会重新编译程序。gcc
或 llvm
版本表现不同。另请注意,ghdl -r
不接受 VHDL 源文件的名称,如 ghdl -a
,但是不是编译单元的名称。在我们的例子中,我们传递了 entity
的名称。因为它只有一个 architecture
关联,所以不需要指定要模拟哪一个。
使用 Modelsim:
$ vlib ms_work
$ vmap work ms_work
$ vcom hello_world.vhd
$ vsim -c hello_world -do 'run -all; quit'
...
# ** Note: Hello world!
# Time: 0 ns Iteration: 0 Instance: /hello_world
...
vlib
,vmap
,vcom
和 vsim
是 Modelsim 提供的四个命令。vlib
创建一个目录(ms_work
),存储生成的文件。vmap
将 vlib
创建的目录与逻辑名称(work
)相关联。vcom
编译 VHDL 源文件,默认情况下,将结果存储在与 work
逻辑名关联的目录中。最后,vsim
模拟程序并产生与 GHDL 相同类型的输出。再次注意,vsim
要求的不是源文件,而是已编译的编译单元的名称。-c
选项告诉模拟器以命令行模式而不是默认的图形用户界面(GUI)模式运行。-do
选项用于在加载设计后传递 TCL 脚本以执行。TCL 是 EDA 工具中经常使用的脚本语言。-do
选项的值可以是文件的名称,或者像我们的示例中一样,是一串 TCL 命令。run -all; quit
指示模拟器运行模拟,直到它自然结束 - 或者永远持续 - 然后退出。