我在初学者的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上,因为它处于保护状态。“
现在我已经一遍又一遍地阅读并在网上搜索,但是对于这实际上在做什么已经空白了。有人可以温柔地解释一下它的目的吗?
答案 0 :(得分:4)
根据这个应该是初学者教程的想法,并且由于没有解释为什么使用这种不寻常的样式,更传统的实现将是:
process : (clk)
begin
if (rising_edge(clk)) then
result <= input or force after 10 ns;
end if;
end process;
需要注意的几点:
input
和force
是信号或实体的输入。after 10ns;
,该代码无效;你需要在值和单位之间留一个空格(如我的代码所示)。rising_edge
作为标识符,当实际上已将其定义为函数时,假设您包含的标准IEEE库比我认为的VHDL93更新。force
作为信号名称,这也是自VHDL2008以来的保留语言关键字。我给你的建议是找一个不同的教程。您发布的报价不清楚,您发布的代码似乎是在向您发送一条奇怪的路径。我能想到的只是教程非常非常老。
答案 1 :(得分:3)
块本质上是一组并发语句。在实际使用方面,它与process
非常相似,只是它的范围有限,允许component
- 样式信号映射(port
和port 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
是保留的可用于强制信号为值的关键字)。