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

时间:2016-03-08 17:00:46

标签: 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;

这个概念是否正确?如果没有,第一个代码示例实际上做了什么?

1 个答案:

答案 0 :(得分:2)

“最后一次分配胜利”......正如你所做的那样扭转条件是正确的......但是由于最后一个if语句在两个臂中都有一个赋值,它会覆盖两个先前的语句:你永远不会看到它们的执行(除非它由于某些其他条件而未执行)

输出仅为"11""00"

要理解的关键术语:增量周期,推迟分配。

您可能会发现我的standard answer类似问题的有用背景。理解信号是什么关键 - 它们是VHDL如何解决进程间通信的问题。