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

VHDL块和保护输入-这段代码做什么?,vhdl,Vhdl,我从初学者的VHDL教程中获得以下内容: rising_edge: block(clk’event and clk = ‘1’) begin result <= guarded input or force after 10ns; end block rising_edge 上升沿:块(clk'事件和clk='1') 开始 结果块本质上是一组并发语句。就实际使用而言,它非常类似于过程,只是它的范围有限,允许组件样式的信号映射(使用端口和端口映射)。它

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

   rising_edge: block(clk’event and clk = ‘1’)
    begin
        result <= guarded input or force after 10ns;
    end block rising_edge
上升沿:块(clk'事件和clk='1') 开始
结果块本质上是一组并发语句。就实际使用而言,它非常类似于
过程
,只是它的范围有限,允许
组件
样式的信号映射(使用
端口
端口映射
)。它可以用来提高可读性(请参阅),实际上并没有什么其他用途。可理解的是,块很少使用,并且经常不支持合成(请参阅)。就我(有限的)知识而言,使用块除了可读性之外没有其他优势

因为block语句包含一个保护条件(
clk'event,而clk='1'
是这里的保护条件),所以它是一个保护块。在受保护块内,仅当保护条件的计算结果为
true
时,才会分配声明为受保护(如您的示例中)的信号

仅当保护条件评估为
true
时,即在
clk
的上升沿上,才会执行已保护的整个语句(即在您的情况下
输入或10ns后强制执行)。因此,出于所有意图和目的,该块的行为与

process(clk)
begin
    if clk'event and clk = '1' then
        result <= input or force after 10ns;
    end if;
end process;
过程(clk)
开始
如果clk'事件和clk='1',则

结果从本教程应该是初学者教程的想法出发,在没有解释为什么会使用这种不寻常的风格的情况下,更传统的实现方式是:

process : (clk)
begin
  if (rising_edge(clk)) then
    result <= input or force after 10 ns;
  end if;
end process;
过程:(时钟)
开始
如果(上升沿(clk)),则

结果这是什么样的初学者教程?谨慎的表达是。。。在我的经验中并不常见…
clk'事件和clk='1'
不能保证在模拟中从'0'过渡到'1'(使用
rissing_edge(clk)
哪一个可以)。clk'事件就是在这种情况下clk上的任何事件从任何其他值转换为'1'。上升沿确保“0”到“1”的过渡。IEEE标准1076-2008 11.2块语句“如果在保留字块之后出现保护条件,则在块的声明性部分的开头隐式声明一个具有预定义类型布尔的简单名称guard的信号,并且保护条件在任何给定时间定义该信号的值(见14.7.4)。防护条件的类型应为布尔型。信号保护可用于控制块内某些语句的操作(见11.6)。{11.6并发信号分配语句)。您的教程来自哪里?“rising_edge”是std_logic_1164库中一个常用函数的名称。我不会将该词重复用于某个进程的标签…指向您正在使用的教程的链接可能会有用。啊,吓人的是,jeff抢先告诉我了,您大约提前了半分钟;)“而且…通常只在非常高级的设计中使用”.好的,这些年来,我看到了很多复杂程度不同的代码,但在实际应用程序的代码中从未遇到过任何
block
语句。通常有“更好”的方法来实现您的需求。例如,通过引入额外的层次结构。合成工具似乎更喜欢这种方法。我在VITAL compliant des中看到过这种方法igns,我认为它甚至对那些人都是必需的(尽管我自己从来没有做过任何重要的工作)。除此之外,我非常同意。
force
只是自VHDL-2008以来的一个关键词