我在VHDL中遇到了两种流程语句。
process(clk)
begin
if rising_edge(clk)
....do something....
另一个是
process
begin
wait until rising_edge(clk)
....do something....
每种方法的优缺点是什么。
答案 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语句需要时间在进程内的不同语句之间流动,这与硬件合成过程不同。它通常出现在模拟刺激或诊断过程中。在第一种形式中,该过程由时钟事件触发,并在单个步骤中运行,表示同步逻辑。