我一般都在考虑信号分配,但我陷入了两难境地。
如果我有一些项目,我有以下代码:
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
答案 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'决议的结果
波形如下所示。
答案 2 :(得分:1)
虽然VHDL是一种硬件描述语言,但你所记录的内容与实际电路略有不同。
并发分配通常代表组合逻辑。但是,这并不意味着您在进行像sendA
这样的并发分配后无法修改sendA <= '0';
的值,正如MortenZdk所提到的那样。类型为std_logic
的信号的值由名为resolved function
的函数确定,因为std_logic是resolved type
。例如,如果sendA在两个不同的进程中有两个与之关联的驱动程序(sendA <= '0'
;&amp; sendA <= '1';
),它最终会得到一个'X'。
编辑:
另请参阅delta time和multiple drivers。