2009-06-22 319 views
10

原始问题是:VHDL的隐藏功能

VHDL中的一些真正有用但深奥的语言功能,您实际上可以用来做有用的工作吗?

原来的问题被删除了,我只是在回答。我认为这是一个有趣的问题,尤其是当您将VHDL与其他(普通)编程语言进行比较时。

声明:我只在VHDL中做了一些简单的例子。

但我特别喜欢,相比其他编程语言(这可能不是你问什么,但我认为只是这些东西每个程序员都应该知道VHDL了一下):

  1. 具有单个接口的几个不同实现(体系结构)并能轻松交换的能力。

  2. 语言模型固有的低开销并行性。它让我想起了数据流语言。

+0

使它成为CW ...你正在诱惑我关闭。 – Shoban 2009-06-22 06:23:03

+0

我不知道该怎么做。如果可以的话,请这样做。 – 2009-06-22 06:24:06

回答

5

VHDL的最佳特性 - 它被用来设计和实现硬件。 :)

能够有几个不同的实现(体系结构)的单个接口,并轻松地交换它们。

与C++中的OOP相同:您可以定义一个接口和许多实现。在VHDL中为同一设备创建模拟和综合模型非常有用。

语言模型固有的低开销并行性。它让我想起了数据流语言。

实际上,C++有SystemC库,它实现了并行执行语义。您可以轻松下载并尝试:http://www.systemc.org。我正在研究C++ - RTL综合。所以我希望在4 - 5年内所有的硬件开发都将使用SystemC和C++来完成。

+3

为什么? VHDL由EE的EE创建。它包含了它所需要的一切,并且非常简单。为什么要在其上添加其他图层? – 2011-11-18 06:00:25

2

什么是一些真正有用的,但在VHDL

首先 深奥的语言功能,我不买的理论,VHDL具有“深奥”的特点。然而,野外存在的VHDL流行“风格”最常受到硬件合成器支持VHDL子集的影响。

VHDL世界中的等式非常简单:如果工具支持语言子集,它将被使用。否则,该功能可能会被滥用。

尤其是当您将VHDL与其他(普通)编程语言进行比较时。

请注意,VHDL不是一种编程语言。相反,它是一种描述离散事件系统的语言(具有可以用来描述数字硬件的“偶然”后果)。我认为与编程语言的比较源于VHDL,看起来像一些实际的编程语言。

现在来解释OP的问题的一些实际答案。

什么是VHDL一些真的很有用,但深奥的语言功能...

这里是我的选择,没有特定的顺序。

  1. 体系结构:到目前为止,选择不同的结构为一个接口的能力是最有用的功能VHDL拥有和正在随时使用。
  2. 生成器:使用生成器可以非常容易地描述复杂的常规硬件结构。考虑乘数,​​加法器,复杂流水线等。不幸的是,许多工具使生成的输出变得糟糕。
  3. 块:一种便宜的方法,将您的设计细分为子块;不是所有的工具都支持它。
  4. 信号分辨率:在仿真电路等时非常有用,而不适用于硬件综合。
  5. 属性:将指令附加到模拟器/合成器以帮助找出实现电路的最佳方式的好方法。尽管在大多数情况下,这可以通过命令行选项来完成,但因为生成硬件所需的所有信息都局限于一个地方,所以属性会更加自然。
7

什么是VHDL一些真的很有用,但深奥的语言功能...

用户定义的物理类型,如“角”,“电压”,“temperature_coefficient”,在这里你可以再写东西像temp <= 45 deg;volt <= 3.3 V;

2

VHDL的许多“深奥”特征都源于Ada。我提到这一点是因为我不是Ada的专家,但是学习Ada极大地改进了我对VHDL中可以完成的任务的看法。

6

有时,有不止一种方法可以做某件事。好的,大部分时间是,你可以在很多方面用VHDL做事情。根据另一个信号的值,查看您想要为信号分配不同值的情况。

选择的信号分配

最具体的方式做到这一点是因为选择的信号分配。根据b的几个可能值,您将值分配给a。这里的代码没有冗余。

with a select b <= 
     "1000" when "00", 
     "0100" when "01", 
     "0010" when "10", 
     "0001" when "11"; 

条件信号分配

一个条件信号分配的构建体是一个小更普遍。对于每个选项,您必须提供一个条件。这意味着你可以写任何布尔表达式作为条件,这给你比平等检查更多的自由。虽然这个构造会给你更多的自由,但也有更多的冗余。我们必须在每一行上写相等检查(a =)。如果你使用一个名字很长的信号,这会让你的代码变得笨重。此外,在选定的信号分配中使用的分隔符是逗号。在条件信号确认中,您需要else关键字。更多相同功能的代码。

b <= "1000" when a = "00" else 
     "1000" when a = "01" else 
     "1000" when a = "10" else 
     "1000" when a = "11"; 

与Case语句

最通常使用的构建体组合型过程是一个过程。在这个过程中,你可以编写一个case语句或if语句级联。这里有更多的冗余。你是一个进程的框架代码(开始,结束)和敏感列表。这不是一个很大的努力,但是当我起草这个时,我已经把b放在灵敏度列表中,而不是a。容易犯小错误。您还需要指定other个案中发生的情况。

process(a) 
begin 
     case a is 
       when "00" => b <= "1000"; 
       when "01" => b <= "0100"; 
       when "10" => b <= "0010"; 
       when "11" => b <= "0001"; 
       when others => assert "unreachable" severity failure; 
     end case; 
end process; 

尽管这最后的代码片段是最大的,也许是最容易出错的,但它也可能是最常见的。它使用两个熟悉的和经常使用的构造:过程和案例陈述。

与所选择的条件和信号分配的问题是,有在它们的语法没有系统。含义是几乎与相同,但是语法不同,足以让你失望。我知道许多工程师永久拥有VHDL的Doulos黄金参考指南的副本躺在他们的办公桌上。这对Doulos来说很好,因为他们的名字一直都被提及。

1

有条件的信号分配与case语句相同 - 即等权重分支。所选择的信号分配是优先级编码器结构 - 即相当于嵌套的if/then/else语句。请注意,vhdl中的所有并发赋值语句与具有由赋值运算符右侧的信号组成的灵敏度列表的进程完全相同。

我最喜欢深奥的功能配置(这是当你有同一个实体的多个架构特别有用)和接入类型。这些允许创建动态数据结构。不适用于硬件设计,但对测试平台创建非常有用。重载我的参数类型签名的方法也使非常可读的代码 - 并且是SystemVerilog中令人遗憾的特性。

Paul。

+0

糟糕 - 我有它倒退。当然,选择的信号分配等同于case语句,而条件赋值相当于嵌套的if/then/else。 – 2011-06-01 19:53:39

0

我所知道的最深奥的就是三项原则的组合:

  1. 字符文字: '\'
  2. 扩展标识符:\'吧\
  3. 属性:identifier'attribute

这是什么表达?:foo'\'bar \ 这是foo的\ bar \属性。

我想没有vhdl lexer能够幸存下来。

0
  1. 你可以在一个包中有信号。

  2. 您可以在配置中创建新端口。

  3. 您可以根据返回类型重载函数。

  4. 您可以在实体中定义信号,该信号可以从体系结构中使用。这对我所知道的任何事都没有用,但它在那里。