2012-12-19 29 views
10

对于VHDL中的过程是否可以执行两个或多个顺序运行?在VHDL中可重入进程吗?

如果在顺序执行过程未完成时发生另一事件(在灵敏度信号列表中)会发生什么?

是否有可能或者我的VHDL模型记住过程是完全错误的?

+0

你可能想澄清一下你的问题 – briantyler

+0

你能用一些示例代码来说明情况吗?我相信我知道你在问什么,但是如果没有具体问题就很难回答。 –

回答

39

当进程正在运行时,不会发生任何事件!

当一个进程被某个事件唤醒时,它会运行到完成状态(“结束进程”)或显式的“等待”语句,然后进入休眠状态。从理论上讲,这需要零时间。这意味着如果您的流程中存在循环,它们将完全展开,并且当您合成时,您将生成足够的硬件来并行运行每次迭代。而且,任何过程,函数等都需要零时间 - 除非它们包含明确的“等待”语句(在这种情况下,过程在“等待”中挂起,就像过程已被内联一样)。

在整个过程中,所有信号都具有它们最初在过程醒来时所具有的值,并且任何信号分配都被存储起来,以便稍后发生。 (变量立即更新;后面的语句在过程中看到新的值)。

当进程挂起时(在“等待”或“结束进程”),没有任何反应,直到所有其他进程也暂停。 (但请记住,他们都需要零时间!)。如果一个进程在“结束进程”中挂起,它将在其敏感列表唤醒时从头开始重新启动。如果它以明确的“等待”挂起,那么“等待”将指定事件或未来时间,这将在“等待”之后重新启动它。 (注意:1:不要在同一个过程中混合灵敏度列表和等待样式!2:等到某个事件可合成为止(尽管有些工具可能会反对);等待一段时间只是模拟)

然后所有信号分配被执行。由于所有的过程都是睡着的,这消除了所有的竞争条件和时间危害。其中一些赋值(如“1”到时钟)将导致事件在对其敏感的进程上安排。

完成所有信号分配后,时间步进一个无限短的记号(称为增量循环),然后唤醒所有具有计划事件的进程。

这一直持续到出现一个Δ周期,其中没有新的事件被安排,最后仿真可以通过实时步骤前进。

因此

process(clk) 
begin 
if rising_edge(clk) then 
    A <= B; 
    B <= A; 
end if; 
end process; 

在VHDL无危险的。

如果您需要使用Verilog,请注意,其中的一些情况会以不同的方式发生,并且您不能依靠仿真结果中的相同级别的可预测性。


在综合中,当然,我们生成的硬件需要一些实时的时间来执行这个过程。然而,综合和后端工具(地点和路线)保证忠实地服从这种模型,或者失败并报告失败的原因。例如,他们会将所有实际延迟加起来,并确认总和小于您指定的时钟周期。 (除非你把时钟速度设得太高!)。所以结果是,只要工具报告成功(并且你正在设置时钟速度正确的时钟约束),你可以假设上面的“零时间”模型是真实的,真实的硬件行为将匹配模拟。保证,禁止工具错误!

+4

为什么这个答案不在每个VHDL教程中?我有一段时间一直在用VHDL做一些事情,但你仍然为我澄清了一些基础知识! –

+0

感谢您的赞美! –

+0

“例如,他们会将所有实际延迟加起来,并确认总和小于您指定的时钟周期(除非您将时钟速度设置得太高!)。”我不明白。所以如果你设置的时钟速度太高,那么他们将允许一个高于时钟周期的总和,并且不会验证? –

5

当开始出使用VHDL(或任何其它HDL就此而言),它丢弃的连续代码的所有概念,而是着眼于数据的通过硬件的流动是非常重要的。在硬件中,所有东西本质上是平行的(一切都是同时发生的),但是使用不断变化的数据(输入信号)来计算不断变化的结果(输出信号)!

没有进入更高级的主题,如变量,等待命令等,一个进程内的所有内容都同时发生。如果在相同的过程中发生冲突(对相同信号进行多次写入),则过程中的最后一个语句会胜出,这通常是对VHDL中“顺序”代码的混淆所在。

由于值被分配给信号的方式,这起作用。当为信号赋值时,信号的值不会立即改变!取而代之的是,分配的值被记住,并且将在稍后作为实际信号值被提交(准备下一个增量循环,这实际上是下一个时间量)。

由于下一个增量循环在上一个增量循环的所有过程完成之前不会开始,所以信号值只会在没有过程运行时才会改变。一旦所有信号发生变化,下一个增量循环开始,任何对某个变化信号敏感的处理都将被执行。

如果一个进程是它也写入信号敏感,你有什么被称为一个组合循环,例如,栅极其中输出馈送的输入。这在您的电路中(几乎)总是一个错误,并且通常会导致模拟器进入无限的增量循环循环。

这就是我会为写信,布赖恩德拉蒙德的答案只是弹出当我在写这一点,但随时发表评论,我会添加一些更多的细节。一旦过程开始运行(由于事件)http://www.sigasi.com/content/vhdls-crown-jewel

3

你应该阅读这篇博客。

2

,它运行到完成,允许任何其他事件之前触发别的:

+0

整个“实体”中还是在“进程”内都是这样的呢? – atomh33ls

+1

只是过程。一旦流程完成,您无法知道准备运行哪个流程,接下来将安排相同的增量循环。它可能来自同一个实体,也可能不是。而且(只要你不使用共享变量),这并不重要 –

相关问题