VHDL块和保护输入 - 这段代码有什么作用?

时间:2018-01-10 21:44:43

标签: vhdl

我在初学者的VHDL教程中有以下内容:

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

解释性文字是

“基本上我有一个名为rising_edge的块,它是一个具有保护条件的块,它执行以下操作,它检查我们在时钟上有一个事件,并且时钟等于1,所以我们我正在寻找所谓的rising_edge。我们正在寻找时钟从0变为1的事件,如果确实如此,那么我们可以有条件地分配结果,所以你会看到结果变量在这里说在10 ns之后它是一个有保障的输入或强制可能看起来有点混乱,但考虑它没有保护关键字。我们所做的只是我们分配输入或力的评估结果,我们正在做因此,在这种情况下,只有在保护信号实际为真的情况下才会执行信号结果的分配,在我们的例子中,它意味着表达式的分配,即输入或强制,只会发生在时钟的rising_edge上,因为它处于保护状态。“

现在我已经一遍又一遍地阅读并在网上搜索,但是对于这实际上在做什么已经空白了。有人可以温柔地解释一下它的目的吗?

2 个答案:

答案 0 :(得分:4)

根据这个应该是初学者教程的想法,并且由于没有解释为什么使用这种不寻常的样式,更传统的实现将是:

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

需要注意的几点:

  1. 这假设inputforce是信号或实体的输入。
  2. 如果您的代码将在真实硬件设备中实现,那么建模信号分配延迟是不常见的。
  3. 您问题中的代码使用after 10ns;,该代码无效;你需要在值和单位之间留一个空格(如我的代码所示)。
  4. 您的问题中的代码使用rising_edge作为标识符,当实际上已将其定义为函数时,假设您包含的标准IEEE库比我认为的VHDL93更新。
  5. 您的问题中的代码使用force作为信号名称,这也是自VHDL2008以来的保留语言关键字。
  6. 我给你的建议是找一个不同的教程。您发布的报价不清楚,您发布的代码似乎是在向您发送一条奇怪的路径。我能想到的只是教程非常非常老。

答案 1 :(得分:3)

块本质上是一组并发语句。在实际使用方面,它与process非常相似,只是它的范围有限,允许component - 样式信号映射(portport map)。它可用于提高可读性(参见this question),其实并不多。块很少使用,并且通常不支持合成(参见here)。对于我(有限的)知识,块的使用除了可读性之外没有其他优势。

因为你的块语句包含一个保护条件(这里是clk'event and clk='1'是保护条件),所以它是一个受保护的块。在受保护的区域内,只有在保护条件评估为true

的情况下,才会分配声明被保护的信号(如示例中所示)

只有在保护条件评估为input or force after 10ns时,即在true的上升沿时,才会执行已被保护的整个语句(即在您的情况下为clk)。因此,对于所有意图和目的,此块具有与

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

我会说,这是一个可怕的例子。首先,正如其他人所说,block的使用非常罕见,它们通常仅用于非常先进的设计中。自1993年以来,不鼓励使用clk'event and clk = '1'(见here)。还应该再次提到,使用rising_edge作为标签是一个可怕的想法,因为使用force作为信号名称(在VHDL 2008中,force是保留的可用于强制信号为值的关键字)。