macos - 如何使用 ghdl 在 Mac 上编译和运行 VHDL 程序?

标签 macos vhdl ghdl

我刚刚写了一个简单的 VHDL 程序。我将文件保存为 .vhd 文件。然后我编译它

ghdl -a test.vhd

然后构建和可执行文件
ghdl -e test

最后尝试运行它
ghdl -r test

发生的事情是我现在有一个 work-obj93.cf可见的文件和另外两个文件,即 ...不知何故是隐形的。

有人能告诉我如何在我的 Mac 上测试 vhdl 程序吗?也许与 GTKWave 结合使用。

最佳答案

正如他们所说,这是一个很大的问题!

可以从 ghdl.free.fr 获得适用于 10.5、10.6、10.7 和 10.8 版英特尔处理器的 OS X ghdl 版本。 (可以在 GHDL for Mac OS X 下载)。它是 mcode 版本(如在 Windows 上),这意味着它不会生成目标代码或 VHDL 模型的独立可执行文件,因此您无法将外部对象(子程序)绑定(bind)到模型。

详细模型仅在运行时存在于内存中,除了工作库 .cf 文件中的条目之外,-e 详细命令是多余的。在 ghdl 的 mcode 版本中,-r run 命令也有详细说明。您将看到的只是工作目录的 work-obj93.cf 文件和预分析库的任何 .cf 文件,默认情况下,这些将显示在/usr/local/ghdl/libraries 中,可执行文件 ghdl 位于/usr/local/bin 链接到/usr/local/ghdl/translate/ghdldrv/ghdl_mcode,而/usr/local/ghdl 是由 ghdl_mcode 版本编译产生的精简树。

此版本源自 svn129(遵循 ghdl-0.29 版本),并包含 i386 二进制文件。

ghdl 的文档可在/usr/local/ghdl/doc/中找到,ghdl 手册页在别处链接,ghdl.html 和 ghdl.texi 是 ghdl 手册,在别处没有链接。在 ghdl.html 中,您可以搜索每次出现的“Windows”以找到对 mcode 版本的引用。作为一个疏忽,我不认为修改 ghdl 手册以在 Windows 出现的任何地方包含 mcode 一词并发布修改后的手册。

任何出现“Windows”的地方都应该读作“Windows 或其他 mcode 版本”。

在 ghdl 手册中,请参阅 1.3 什么是 GHDL?(GHDL 的 Windows(TM) 版本不是基于 GCC,而是基于内部代码生成器)。还有 2.1 hello world 程序:

2.1 The hello world program

为了说明 VHDL 的重要用途,这里有一个带注释的 VHDL “Hello world”程序。
 --  Hello world program.
 use std.textio.all; --  Imports the standard textio package.

 --  Defines a design entity, without any ports.
 entity hello_world is
 end hello_world;

 architecture behaviour of hello_world is
 begin
    process
       variable l : line;
    begin
       write (l, String'("Hello world!"));
       writeline (output, l);
       wait;
    end process;
 end behaviour;

假设这个程序包含在文件 hello.vhdl 中。首先,您必须编译文件;这在 VHDL 术语中称为设计文件分析。
 $ ghdl -a hello.vhdl

此命令创建或更新文件 work-obj93.cf,该文件描述了库“work”。在 GNU/Linux 上,此命令会生成一个文件 hello.o,它是与您的 VHDL 程序对应的目标文件。目标文件不是在 Windows 上创建的。

然后,您必须构建一个可执行文件。
 $ ghdl -e hello_world

“-e”选项意味着精心制作。使用此选项,GHDL 创建代码以详细说明设计,“hello”实体位于层次结构的顶部。

在 GNU/Linux 上,结果是一个名为 hello 的可执行程序,它可以运行:
 $ ghdl -r hello_world

或直接:
 $ ./hello_world

在 Windows 上,不创建文件。使用以下命令启动模拟:
 > ghdl -r hello_world

模拟结果出现在屏幕上:
 Hello world!

将 hello_world 命令的源代码保存到文件 hello.vhdl 并执行命令:

david_koontz@Macbook:ghdl -a hello.vhdl

david_koontz@Macbook:ghdl -e hello_world

david_koontz@Macbook:ghdl -r hello_world

产量:

世界你好!

在标准输出(终端窗口中的 TTY session )上。

您将在当前工作目录中得到一个 work-obj93.cf 库配置文件,而没有其他输出文件。您还需要了解 -r run 命令(第 3.1.3 节)的含义,命令行上没有传递可选的辅助单元 VHDL 默认为最后编译的架构。

获得 Tony Bybell 的 gtkwave gtkwave.app ,该文档位于/Applications/gtkwave.app/Contents/Resources/doc,包括 .odt 源文件和 PDF 文件。 (您可以在 Applications 文件夹中选择一个应用程序,然后选择“显示包内容”以导航到 doc 目录)。

ghdl 有一种独特的波形格式,称为 ghw,可以使用运行命令选项“--wave=.ghw”调用。参见 ghdl 手册 4.1 模拟选项。如果您选择使用 VCD,另请参阅该目录中的 vcd 选项。

如果您的测试台提供自由运行的时钟,您还应该使用保护计时器限制运行时间。 VHDL 只会在不再有计划的信号更新或执行时间最长时停止执行。这是一个类似于“--stop-time=587200ns”的运行命令选项。

OS X gtkwave.app 对扩展名为 .ghw 和 .gtkw 的两种文件类型敏感,第一种是 ghdl 波形转储文件,第二种是带有 OS X 后缀的 gtkwave 配置文件,允许通过单击 gtkw 文件调用 gtkwave。配置文件必须在 gtkwave 中设置波形显示后保存,然后才会存在。请参阅 gtkwave 手册。可以单击 ghw 文件,gtkwave 有一组规则用于搜索适用的 gtkw 文件。

使用 ghw 文件格式有几个优点。通过单击文件自动调用 gtkwave 应用程序是其中之一。另一个是 ghdl 将所有信号事务保存到它的 ghw 转储文件中。您可以随时在 gtkwave 中选择更多以显示更多信息。虽然这在大型模型中可能是一个缺点,但 ghw 格式允许任何类型或子类型枚举文字显示。

加盟GHDL discuss list发布问题是吸引 ghdl 专业人士关注的好方法。 (是的,gna.org 的证书已过期或无效)。 Tony Bybell 在 gtkwave 网页上提供了电子邮件联系方式,但有偿工作的紧急情况限制了他的可用性。

举例说明 ghdl 和 gtkwave 的使用。

原始海报要求提供一些带有命令行值的真实示例。有一个可怜的GHDL/GTKWave Tutorial (PDF,234 KB),其中包含一个示例和使用过的 VCD。

我将列出 GHDL 波形格式版本的命令行:

david_koontz@Macbook:ghdl -a CarryRipple.vhd

david_koontz@Macbook:ghdl -a CarryRipple_tb.vhd

david_koontz@Macbook:ghdl -e CarryRipple_tb

david_koontz@Macbook: ghdl -r CarryRipple_tb --wave=carryRipple_tb.ghw

调用 gtkwave.app 可以通过单击生成的 CarryRipple_tb.ghw 或使用 OS X 的 open 命令来完成:

david_koontz@Macbook: open -a gtkwave CarryRipple_tb.ghw

Gtkwave 的 SST 窗口(左上角)将显示在顶部,单击 + 框展开。对显示的carryripple_tb 执行相同操作。单击一个。在信号窗口中选择 a[3:0] 并点击插入按钮。对 b 重复。

在 SST 窗口中选择 U0,然后在信号窗口中选择 cin 点击插入按钮,然后对 cout 相同。

在 SST 窗口中选择 s,在信号窗口中选择 s[3:0] 并点击插入。

是的,从“教程”中获取两个 VHDL 文件的源代码很痛苦。我没有做。

您可能还会注意到 gtkwave 显示中在 60 ns 时将“X”分配给 Cin,我这样做是为了显示测试台中分配的最后一个值。

我不会声称这是一个很好的教程,但你在这里得到了你付出的代价。做得更好会是一个更大的要求。

测试台 (carryRipple_tb.vhd) 提供了在仿真过程中驱动模型 (CarryRipple.vhd) 的刺激。模型在最后一个信号事件后退出执行,因此不需要将停止时间传递给运行命令(例如 --stop-time=587200ns)。

Youtube 上还有由 Chad Kersey 提供的五部分 GHDL/GTKWave 教程.分辨率不是很好,它以 Linux 为中心。第 0 部分是关于安装这两个工具的。我的示例中唯一真正的区别是使用 ghw 波形格式。大多数浏览器都允许您以全尺寸查看下面的 gtkwave 窗口。

enter image description here

已添加

最近有一个答案显示了一个 Toggle Flip Flop 的演示,显示了原始 VHDL 代码中的一个错误,以及三个可能的修复方法。它使用配置声明来运行各种固定版本。见 how to avoid delay in the output of simple process statement in VHDL .

关于macos - 如何使用 ghdl 在 Mac 上编译和运行 VHDL 程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17069939/

相关文章:

file-io - 如何在VHDL中读取一行中的元素?

vhdl - 如何使用 GHDL 运行具有特定架构的 VHDL 测试平台?

c - 如何在 nginx 中使用 c/c++ 模块

java - OSX 上 JAR 文件的推荐位置

python - 链接/usr/local/Cellar/python3/3.5.1...错误: Permission denied -/usr/local/Frameworks

windows - 为什么 Windows 上的 llvm-config 不为 clang++.exe 发出正确的参数?

vhdl - GHDL 模拟器不支持没有错误的 vhdl 属性?

python - OSX Python系统框架意外覆盖

VHDL 状态机差异(用于综合)

syntax - VHDL - 在计算通用参数后调整端口大小