2015-09-22 102 views
4

我碰到过VHDL中的两种风格的进程语句。等到rising_edge(clk)vs如果rising_edge(clk)

process(clk) 
begin 
    if rising_edge(clk) 
....do something.... 

另一种是

process 
begin  
    wait until rising_edge(clk) 
    ....do something.... 

什么是每种方法的优点和缺点。

+0

vs'等到clk ='1'' –

回答

3

假设...第二个示例的一部分没有任何wait语句,这两个表单在语义上是等价的。

它们在模拟中的表现完全相同。

但是,第一种形式是用于合成的推荐样式,并且会被许多人认为更具可读性。

+1

由谁推荐?支持这两种形式,请参阅撤回的IEEE Std 1076.6-2004,6.1.3.1灵敏度列表和一个时钟的进程中的边缘敏感存储,以及使用单个等待语句的6.1.3.2边缘敏感存储。区别在于流程是否有一个灵敏度列表,暗示“等待时钟;'作为流程的最后一个顺序语句(IEEE标准1076-2008 11.3流程语句)。哪种形式是纯粹的编码风格选择, – user1155120

+0

@user我手边没有任何参考,但有_synthesis_工具,它不会用'wait'语法推断出合适的FF。 – wap26

+0

他们不会是1076.6兼容。 – user1155120

-2

基本上,第二种类型只在仿真中有用。等待语句需要时间在流程内的不同语句之间流动,这与硬件合成过程不同。它通常会出现在模拟刺激或诊断过程中。在第一种形式中,进程由时钟事件触发,并在一个步骤中运行,表示同步逻辑。

+1

我不完全同意你答案的第二部分。“wait”确实可以用来产生复杂/异步的刺激,但它也可以用来模拟完全同步的行为,例如触发器。 – wap26

+1

这是不正确的。就“时间流量”而言,两者基本相同,两者之间只有一点次要的(不相关的)区别。我希望大多数综合工具,如果不是全部,都可以接受这两种形式。不过,几乎每个人都使用第一个。 – EML

+1

你被误导了。在之前的项目中,我们使用“等到rising_edge(clk)”,因为它“保存”了缩进级别并且更紧凑。综合工具(例如Vivado)认为两种形式都是等效的。 – kraigher

1

这两种形式在Vivado中都是等效的。第二个wait表单可以被认为更紧凑,因为它“节省”了缩进级别。

+0

恕我直言,保存缩进级别是毫无意义的,除非你的编辑器只显示80列。 – wap26

+0

我不是说它有巨大的价值。这种选择大多是任意的,并且像任何编码标准一样可以根据个人喜好。这些工具不关心。 – kraigher

相关问题