对进程内信号的顺序分配如何表现
how do sequential assignments to a signal inside a process behave
我想知道,在 VHDL 中如何处理对进程内部相同信号的顺序分配。
我见过如下代码:
ENTITY some_entity IS
...
...
END some_entity;
ARCHITECTURE Behavioral OF some_entity IS
SIGNAL some_signal : STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN PROCESS (clk)
...
...
IF condition1 THEN
some_signal <= "01";
ELSE
some_signal <= (others => '0');
END IF;
IF condition2 THEN
some_signal <= "10";
ELSE
some_signal <= (others => '0');
END IF;
IF condition3 THEN
some_signal <= "11";
ELSE
some_signal <= (others => '0');
END IF;
...
...
END PROCESS;
...
...
END Behavioral;
起初我认为,这并没有什么意义,因为 some_signal
被同时分配了多个值。 Vivado 毫无怨言地对其进行了综合,并且在对流程进行了一些研究之后,我认为它的行为实际上可能等同于以下内容:
ENTITY some_entity IS
...
...
END some_entity;
ARCHITECTURE Behavioral OF some_entity IS
SIGNAL some_signal : STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN PROCESS (clk)
...
...
IF condition3 THEN
some_signal <= "11";
ELSIF condition 2 THEN
some_signal <= "10";
ELSIF condition1 THEN
some_signal <= "01";
ELSE
some_signal <= (others => '0');
END IF;
...
...
END PROCESS;
...
...
END Behavioral;
这个想法对吗?如果不是,第一个代码示例实际上做了什么?
"Last assignment wins" ...像你那样反转条件是正确的...但是由于最后一个 if 语句在两个臂中都有一个赋值,它会覆盖前面的两个语句:你永远不会看到它们的执行(除非由于某些其他条件而未执行)
输出只会是 "11"
或 "00"
。
要理解的关键术语:增量循环、推迟分配。
您可能会发现我的 standard answer 对类似问题有用的背景知识。了解信号的用途非常关键 - 它们是 VHDL 解决进程间通信问题的方式。
我想知道,在 VHDL 中如何处理对进程内部相同信号的顺序分配。
我见过如下代码:
ENTITY some_entity IS
...
...
END some_entity;
ARCHITECTURE Behavioral OF some_entity IS
SIGNAL some_signal : STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN PROCESS (clk)
...
...
IF condition1 THEN
some_signal <= "01";
ELSE
some_signal <= (others => '0');
END IF;
IF condition2 THEN
some_signal <= "10";
ELSE
some_signal <= (others => '0');
END IF;
IF condition3 THEN
some_signal <= "11";
ELSE
some_signal <= (others => '0');
END IF;
...
...
END PROCESS;
...
...
END Behavioral;
起初我认为,这并没有什么意义,因为 some_signal
被同时分配了多个值。 Vivado 毫无怨言地对其进行了综合,并且在对流程进行了一些研究之后,我认为它的行为实际上可能等同于以下内容:
ENTITY some_entity IS
...
...
END some_entity;
ARCHITECTURE Behavioral OF some_entity IS
SIGNAL some_signal : STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN PROCESS (clk)
...
...
IF condition3 THEN
some_signal <= "11";
ELSIF condition 2 THEN
some_signal <= "10";
ELSIF condition1 THEN
some_signal <= "01";
ELSE
some_signal <= (others => '0');
END IF;
...
...
END PROCESS;
...
...
END Behavioral;
这个想法对吗?如果不是,第一个代码示例实际上做了什么?
"Last assignment wins" ...像你那样反转条件是正确的...但是由于最后一个 if 语句在两个臂中都有一个赋值,它会覆盖前面的两个语句:你永远不会看到它们的执行(除非由于某些其他条件而未执行)
输出只会是 "11"
或 "00"
。
要理解的关键术语:增量循环、推迟分配。
您可能会发现我的 standard answer 对类似问题有用的背景知识。了解信号的用途非常关键 - 它们是 VHDL 解决进程间通信问题的方式。