1

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

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

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 <='0';” 部分发生?一开始只有一次?它会不断将 sendA 重置为 0 吗?或者是其他东西?

在此先感谢博扬·马托夫斯基

4

3 回答 3

2

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

于 2013-09-10T09:20:06.317 回答
2

除了 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”分辨率的结果

波形如下图。

在此处输入图像描述

于 2013-09-10T10:48:21.907 回答
1

虽然 VHDL 是一种硬件描述语言,但是你写下来的和真实的电路还是有点区别的。

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

编辑:
另请参阅delta time and multiple drivers

于 2013-09-11T05:00:39.100 回答