VHDL的隐藏特性

VHDL的隐藏特性,vhdl,Vhdl,原来的问题是: VHDL中有哪些真正有用但深奥的语言特性,您可以利用它们来做有用的工作 原来的问题被删除了,我只是在回答。我认为这是一个有趣的问题,特别是当您将VHDL与其他(普通)编程语言进行比较时 免责声明:我只使用VHDL编写了几个微不足道的示例 但与其他编程语言相比,我特别喜欢的是(这可能不是您要问的问题,但我认为,就这些方面而言,每个程序员都应该懂一点VHDL): 能够在一个接口上有多个不同的实现(体系结构),并且可以轻松地进行交换 语言模型固有的低开销并行性。这让我想起了数据流语言

原来的问题是:

VHDL中有哪些真正有用但深奥的语言特性,您可以利用它们来做有用的工作

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

免责声明:我只使用VHDL编写了几个微不足道的示例

但与其他编程语言相比,我特别喜欢的是(这可能不是您要问的问题,但我认为,就这些方面而言,每个程序员都应该懂一点VHDL):

  • 能够在一个接口上有多个不同的实现(体系结构),并且可以轻松地进行交换

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


  • VHDL的最佳功能—用于设计和实现硬件。:)

    能够在一个接口上有多个不同的实现(体系结构),并且可以轻松地进行交换

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

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

    实际上,有一个C++实现并行执行语义的SystemC库。您可以轻松下载并尝试以下内容:。我正在研究C++到RTL的综合。因此,我希望在4-5年内,所有的硬件开发都将使用SystemC和C++来完成。 什么是真正有用的,但是 VHDL中的深奥语言特性

    首先,我不相信VHDL具有“深奥”特性的理论。然而,广泛存在的VHDL的流行“风格”最常受到硬件合成器支持的VHDL子集的影响

    VHDL世界中的等式非常简单:如果工具支持语言子集,则将使用它。否则,该功能很可能未得到充分利用

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

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

    现在来看看OP问题的一些实际答案

    VHDL中有哪些真正有用但深奥的语言特性

    这是我的选择,没有特别的顺序

  • 体系结构:到目前为止,为接口选择不同体系结构的能力是VHDL最有用的特性,并且一直在使用
  • 生成器:使用生成器,您可以非常轻松地描述复杂的常规硬件结构。想想乘法器、加法器、复杂管道等等。不幸的是,许多工具将生成的输出弄得一团糟
  • 积木:一种将你的设计分成积木的廉价方法;但并非所有工具都支持它
  • 信号分辨率:在模拟电路等时非常有用,而在硬件合成时则不然
  • 属性:将指令附加到模拟器/合成器以帮助它找到实现电路的最佳方法的一种好方法。虽然在大多数情况下,这可以通过synthesizer/mapper/p&r工具的命令行选项来完成,但属性感觉更自然,因为生成硬件所需的所有信息都局限于一个地方
  • VHDL中有哪些真正有用但深奥的语言特性


    用户定义的物理类型,如“角度”、“电压”、“温度系数”,您可以在其中编写
    temp之类的内容。相当多的VHDL“深奥”特性都源自Ada。我之所以提到这一点,是因为我不是Ada专家,但学习Ada极大地提高了我对用VHDL可以完成的事情的认识。

    有时候,做某事的方法不止一种。大多数时候,你可以用VHDL做很多事情。看看您希望根据另一个信号的值为一个信号分配不同值的情况

    所选信号分配

    实现这一点的最具体方法是使用as selected信号分配。根据
    b
    的几个可能值,您可以为
    a
    指定一个值。这里的代码没有冗余

    with a select b <=
            "1000" when "00",
            "0100" when "01",
            "0010" when "10",
            "0001" when "11";
    
    带有案例陈述的组合过程

    最普遍可用的构造是进程。在这个过程中,您可以编写case语句或if语句的级联。这里甚至有更多的冗余。您可以创建流程的框架代码(开始、结束)和敏感度列表。这不是一个很大的努力,但是当我起草这篇文章时,我把
    b
    放在敏感度列表中,而不是
    a
    。容易犯小错误。您还需要指定在
    其他
    情况下发生的情况

    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;
    
    过程(a)
    开始
    案例a是
    当“00”=>b断言“无法访问”严重性故障时;
    终例;
    结束过程;
    
    虽然最后一个代码段是最大的,可能也是最容易出错的,但它可能也是最常见的。它使用两种常见且常用的结构:流程和案例语句


    所选信号和条件信号分配的问题在于其语法中没有系统。意思几乎是一样的,但语法上的不同足以让你大吃一惊。我认识许多工程师,他们的办公桌上放着一本《杜洛斯VHDL黄金参考指南》。这对Doulos很好,因为他们的名字一直被提及

    条件信号分配与case stateme相同
    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;