我刚刚写了一个简单的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中简单流程语句输出的延迟.