VHDL中的并发信号分配

时间:2013-09-10 08:02:41

标签: concurrency signals variable-assignment vhdl reset

我一般都在考虑信号分配,但我陷入了两难境地。

如果我有一些项目,我有以下代码:

ARCHITECTURE wait_example of wait_example IS
SIGNAL sendB, sendA : std_logic;
BEGIN

sendA <= ‘0’;

A : PROCESS
BEGIN
-- something
END PROCESS A;

B : PROCESS
BEGIN
-- something
END PROCESS B;

C : PROCESS
BEGIN
-- something
END PROCESS C;

依此类推......我在考虑什么时候“sendA&lt; ='0';”部分发生?一开始只有一次?它会不断将sendA重置为0吗?或其他什么?

提前致谢, Bojan Matovski

3 个答案:

答案 0 :(得分:2)

任何并发语句都有一个等效的过程。如果没有右侧的信号,则等效的是由WAIT终止的过程;声明。它会执行一次。

答案 1 :(得分:1)

除了David Koontz的好答案之外,它可能会补充说即使通过了 sendA <= '0'仅执行一次,它将持续驱动sendA '0'。在测试平台设计中,sendA上的最终值由分辨率函数给出 在sendA的所有驱动器上,在可综合设计中,不应有多个驱动器。

如果您还尝试从以下某个过程中驾驶sendA

sendA <= '0';

A : PROCESS
BEGIN
  wait for 100 ns;
  sendA <= '0';
  wait for 100 ns;
  sendA <= '1';
  wait for 100 ns;
  sendA <= 'Z';
  wait;
END PROCESS A;

然后,您将获得sendA的最终值为:

  • 0 ns:'U',由于尚未分配的'0'和'U'的分辨率 A进程中的信号驱动。

  • 100 ns:'0',由'0'和'0'决议的结果

  • 200 ns:'X',由'0'和'1'决议的结果

  • 300 ns:'0',由'0'和'Z'决议的结果

波形如下所示。

enter image description here

答案 2 :(得分:1)

虽然VHDL是一种硬件描述语言,但你所记录的内容与实际电路略有不同。

并发分配通常代表组合逻辑。但是,这并不意味着您在进行像sendA这样的并发分配后无法修改sendA <= '0';的值,正如MortenZdk所提到的那样。类型为std_logic的信号的值由名为resolved function的函数确定,因为std_logic是resolved type。例如,如果sendA在两个不同的进程中有两个与之关联的驱动程序(sendA <= '0';&amp; sendA <= '1';),它最终会得到一个'X'。

编辑:
另请参阅delta timemultiple drivers