我想知道,如何在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;
这个概念是否正确?如果没有,第一个代码示例实际上做了什么?
答案 0 :(得分:2)
“最后一次分配胜利”......正如你所做的那样扭转条件是正确的......但是由于最后一个if语句在两个臂中都有一个赋值,它会覆盖两个先前的语句:你永远不会看到它们的执行(除非它由于某些其他条件而未执行)
输出仅为"11"
或"00"
。
要理解的关键术语:增量周期,推迟分配。
您可能会发现我的standard answer类似问题的有用背景。理解信号是什么关键 - 它们是VHDL如何解决进程间通信的问题。