等到rising_edge(clk)vs如果rising_edge(clk)

时间:2015-09-22 12:35:48

标签: vhdl

我在VHDL中遇到了两种流程语句。

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

另一个是

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

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

4 个答案:

答案 0 :(得分:3)

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

他们在模拟中的行为相同。

然而,第一种形式是推荐的合成风格,并且被许多人认为更具可读性。

答案 1 :(得分:1)

两种形式都相当于Vivado的合成。第二个wait形式可以被认为更紧凑,因为它“保存”了缩进级别。

答案 2 :(得分:0)

我大体上同意@wap26 的回答,但有一点补充。

我有时喜欢编写一个顶层架构,它既可以作为可综合的顶层设计,也可以作为仿真测试平台 - 通常用于较小的设计。

在此类设计中,您经常在仿真期间自己驱动时钟,使用等待语句,例如:

if IS_SIMULATION then
    wait for SIM_CLK_PERIOD / 2; 
    clk <= '0';
    wait for SIM_CLK_PERIOD / 2;
    clk <= '1';
else
    clk <= external_clk;
end if;

现在的问题是您仍然需要处理可综合部分的初始/重置状态。这需要断言实体的信号已在外部时钟的第一个(或某个)上升沿之前初始化。

但是我们不能使用if rising_edge(external_clk),因为这个进程不能有敏感列表(它在模拟部分使用wait语句)。因此,在这种情况下,需要使用 wait until rising_edge(external_clk)

答案 3 :(得分:-2)

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