2016-03-08 30 views
3

我在想,如何按照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

“最后分配胜” ......扭转像你一样的条件是正确的......然而作为最后'if'语句具有双臂的分配,它会覆盖前面的语句:你永远不会看到它们的执行。输出只能是“11”或“00”。关键术语理解:增量循环,推迟分配。 –

+1

@BrianDrummond:谢谢,那正是我想知道的。如果压倒前面的ifs,我没有想过最后一次,但考虑一下,这很明显。你为什么不发表这个评论作为答案? – FSMaxB

回答

2

“最后分配胜” ......扭转了条件,你做是正确的......不过好像语句双臂的分配,它会覆盖先前的发言最后:你永远不会看到它们的执行(除非它不会作为一些其他条件的结果执行)

输出将只是"11""00"

要了解的关键术语:增量循环,推迟赋值。

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

+0

在问这个问题之前,我实际上读过“标准答案”,但没有说明在一个过程的一次运行过程中信号的分配可以被覆盖。再次感谢这个答案。 – FSMaxB

+0

对于被称为*投射输出波形*的过程中分配的每个信号,都有一个预定值队列。它在任何特定的模拟时间内只保留一个条目。计划值的分配会取代特定时间或更早时间的投影值(如果存在)。参见IEEE Std 1076-2008 10.5.2.2为深入描述执行一个简单的赋值语句。 – user1155120

相关问题