我从初学者的 VHDL 教程中得到以下内容:
rising_edge: block(clk’event and clk = ‘1’)
begin
result <= guarded input or force after 10ns;
end block rising_edge
说明文字是
“本质上,我有一个名为 rising_edge 的 block ,它是一个带有保护条件的 block ,它执行以下操作,它检查时钟上是否有事件,并且时钟是否等于 1,所以我们正在有效地寻找所谓的 rising_edge。我们正在寻找时钟从 0 变为 1 的事件,如果是这样,那么我们可以有条件地分配结果,所以你会看到这里的结果变量说在 10 ns 之后它是一个 protected 输入或力可能看起来有点令人困惑,但考虑一下没有保护关键字。我们所做的就是分配输入或力的评估结果,我们正在做它在 protected 设置中。因此,在这种情况下,信号结果的赋值仅在保护信号实际为真时执行,在我们的示例中,这意味着表达式的赋值,即输入或强制,只会发生在时钟的上升沿,因为它处于保护状态。”
现在我已经一遍又一遍地阅读这篇文章并在网上进行搜索,但对于它的实际作用一无所知。有人可以温和地解释一下它的用途吗?
最佳答案
block 本质上是一组并发语句。在实际使用方面,它与进程
非常相似,只是它有一个有限的范围,允许组件
风格的信号映射(使用端口
和 端口映射
)。它可以用来提高可读性(参见 this question ),除此之外别无其他。 block 很少使用并且经常不支持合成(参见 here)。据我(有限)的了解, block 的使用除了可读性外没有其他优势。
因为你的block语句包含了一个guard condition(clk'event and clk='1'
是这里的guard condition),所以它是一个guarded block。在 protected block 内,声明为 protected 信号(如您的示例中)只有在保护条件评估为 true
被保护的整个语句(即在你的情况下 input or force after 10ns
)只会在保护条件评估为 true
时执行,即在clk
的上升沿。因此,就所有意图和目的而言,此 block 具有与
process(clk)
begin
if clk'event and clk = '1' then
result <= input or force after 10ns;
end if;
end process;
不过我要说,这是一个糟糕的例子。一方面,正如其他人所说,block
的使用非常罕见,它们通常只用于非常高级的设计中。自 1993 年以来,不鼓励使用 clk'event 和 clk = '1'
(参见 here)。还应该再次提到,使用 rising_edge
作为标签是一个糟糕的主意,使用 force
作为信号名称也是如此(在 VHDL 2008 中,force
是一个保留关键字,可用于将信号强制为一个值)。
关于VHDL block 和 protected 输入 - 此代码的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48196596/