对进程内信号的顺序分配如何表现

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 解决进程间通信问题的方式。