代码之家  ›  专栏  ›  技术社区  ›  Wad

VHDL块和保护输入-这段代码做什么?

  •  2
  • Wad  · 技术社区  · 8 年前

    我从初学者的VHDL教程中获得了以下内容:

       rising_edge: block(clk’event and clk = ‘1’)
        begin
            result <= guarded input or force after 10ns;
        end block rising_edge
    

    解释文本为

    “基本上,我有一个名为rising\u edge的块,这是一个具有保护条件的块,它执行以下操作,它检查时钟上是否有一个事件,并且时钟是否等于1,因此我们实际上在寻找所谓的rising\u edge。我们在寻找时钟从0变为1的事件,如果有,那么我们可以有条件地分配结果,因此您可以看到这里的结果变量表示,这是一个受保护的输入或10 ns后的强制可能看起来有点混乱,但请考虑它没有受保护的关键字。我们所做的就是分配输入或力的评估结果,我们在一个有防护的环境中进行。因此,在这种情况下,仅当保护信号实际为真时才执行信号结果的赋值,在我们的示例中,这意味着表达式的赋值,即输入或强制,将只发生在时钟的上升沿,因为这是在保护条件下。"

    现在我已经读了一遍又一遍,在网上搜索了一遍,但对于这到底在做什么,我还是一无所获。有人能温和地解释一下它的用途吗?

    2 回复  |  直到 8 年前
        1
  •  4
  •   DLnd    8 年前

    块本质上是一组并发语句。就实际使用而言,它与 process ,只有有限的范围 component -样式信号映射(带 port port map ). 它可用于提高可读性(请参阅 this question )其实没什么别的。块很少使用,通常不支持合成(参见 here ). 据我(有限)所知,块的使用除了可读性之外没有其他优势。

    因为您的block语句包含一个保护条件( clk'event and clk='1' 是此处的防护条件),它是一个防护块。在受保护的块中,声明为受保护的信号(如您的示例中所示) 仅当防护条件评估为 true

    被保护的整个声明(即在您的情况下 input or force after 10ns )仅在防护条件评估为时执行 真的 ,即位于 clk . 因此,出于所有意图和目的,此块的行为与

    process(clk)
    begin
        if clk'event and clk = '1' then
            result <= input or force after 10ns;
        end if;
    end process;
    

    我要说的是,这是一个可怕的例子。一方面,正如其他人所言 block 非常罕见,通常只在非常先进的设计中使用。的用法 clk'event and clk = '1' 自1993年以来一直受到阻碍(见 here ). 还应再次提及 rising_edge 作为一个标签是一个可怕的想法,使用 force 对于信号名称(在VHDL 2008中, 武力 是一个保留关键字,可用于将信号强制为值)。

        2
  •  4
  •   scary_jeff    8 年前

    从这个想法出发 初学者 本教程中,由于没有解释为什么会使用这种不寻常的样式,更为传统的实现是:

    process : (clk)
    begin
      if (rising_edge(clk)) then
        result <= input or force after 10 ns;
      end if;
    end process;
    

    需要注意的几点:

    1. 这假设 input force 是实体的信号或输入。
    2. 如果您的代码将在真实的硬件设备中实现,那么对信号分配延迟进行建模是不常见的。
    3. 问题中的代码使用 after 10ns; ,无效;在值和单位之间需要一个空格(就像在我的代码中一样)。
    4. 问题中的代码使用 rising_edge 作为一个标识符,当这实际上已经定义为一个函数时,假设您包含的标准IEEE库比我认为的VHDL93更新。
    5. 问题中的代码使用 武力 作为信号名称,当这也是自VHDL2008以来保留的语言关键字时。

    我给你的建议是找一个不同的教程。您发布的报价写得不清楚,您发布的代码似乎让您走上了一条奇怪的道路。我所能想到的是,这本教程实际上非常非常古老。