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

use*_*316 11 macos vhdl ghdl

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

ghdl -a test.vhd
Run Code Online (Sandbox Code Playgroud)

然后用.构建和执行文件

ghdl -e test
Run Code Online (Sandbox Code Playgroud)

最后试着用它来运行它

ghdl -r test
Run Code Online (Sandbox Code Playgroud)

发生了什么事是我现在有一个work-obj93.cf文件,它是可见的,其他两个文件,即...那些不知何故不可见的.

有人能说出我在Mac上测试vhdl程序到底有多准确吗?也许与GTKWave结合使用.

use*_*120 18

他们说这是一个很大的问题!

在英特尔处理器上运行的OS X版本的ghdl版本为10.5,10.6,10.7和10.8,可从ghdl.free.fr获得(可在GHDL for Mac OS X下载).它是mcode版本(就像在Windows上一样),这意味着它不会生成目标代码或VHDL模型的独立可执行文件,结果是您无法将外来对象(子程序)绑定到模型.

精心设计的模型仅在运行时存在于内存中,除了工作库.cf文件中的条目之外,-e elaborate命令是多余的.在mhd版本的ghdl中,-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你好世界的节目:

2.1 The hello world program
Run Code Online (Sandbox Code Playgroud)

为了说明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;
Run Code Online (Sandbox Code Playgroud)

假设该程序包含在文件hello.vhdl中.首先,你必须编译文件; 这称为VHDL术语的设计文件分析.

 $ ghdl -a hello.vhdl
Run Code Online (Sandbox Code Playgroud)

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

然后,您必须构建一个可执行文件.

 $ ghdl -e hello_world
Run Code Online (Sandbox Code Playgroud)

'-e'选项意味着精心制作.使用此选项,GHDL创建代码以便详细设计,其中"hello"实体位于层次结构的顶部.

在GNU/Linux上,结果是一个名为hello的可执行程序,可以运行:

 $ ghdl -r hello_world
Run Code Online (Sandbox Code Playgroud)

或直接:

 $ ./hello_world
Run Code Online (Sandbox Code Playgroud)

在Windows上,不会创建任何文件.使用以下命令启动模拟:

 > ghdl -r hello_world
Run Code Online (Sandbox Code Playgroud)

模拟结果显示在屏幕上:

 Hello world!
Run Code Online (Sandbox Code Playgroud)

将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会话).

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

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

ghdl有一个独特的波形格式,称为ghw,可以使用run命令选项'--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讨论列表并发布问题是吸引ghdl专业知识关注的好方法.(是的,gna.org的证书已过期或无效).Tony Bybell在gtkwave网页上提供了一个电子邮件联系人,但有薪就业的紧急情况限制了他的可用性.


用一个例子来阐述ghdl和gtkwave的使用.

原始海报要求提供一些命令行值的实例.但是有一个很差的GHDL/GTKWave教程(PDF,234 KB)包含一个示例和使用过的VCD.

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

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执行相同的操作.点击一个.在信号窗口中选择[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).

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

在此输入图像描述

添加

最近的答案显示了使用Toggle Flip Flop的演示,显示了原始VHDL代码中的错误,以及三种可能的修复.它使用配置声明来运行各种固定版本.了解如何避免VHDL中简单流程语句输出的延迟.