我在想,如何按照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;
是这个概念是否正确?如果不是,第一个代码示例实际上做了什么?
“最后分配胜” ......扭转像你一样的条件是正确的......然而作为最后'if'语句具有双臂的分配,它会覆盖前面的语句:你永远不会看到它们的执行。输出只能是“11”或“00”。关键术语理解:增量循环,推迟分配。 –
@BrianDrummond:谢谢,那正是我想知道的。如果压倒前面的ifs,我没有想过最后一次,但考虑一下,这很明显。你为什么不发表这个评论作为答案? – FSMaxB