VHDL block 和 protected 输入 - 此代码的作用是什么?

标签 vhdl

我从初学者的 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/

相关文章:

vhdl - 32x8 寄存器文件 VHDL 测试台

Emacs VHDL 跳转报错

vhdl - DDR3 MIG Vivado IP

vhdl - 将整数写入文件 vhdl

range - VHDL 范围分配

vhdl - VHDL 中的类型枚举

vhdl - 合并两个数组

vhdl - 在 VHDL 中实现状态机的替代方法

asynchronous - Verilog/VHDL - 如何避免在单个 always block 中重置数据寄存器?