在VHDL中以两个进程分配信号

时间:2014-04-30 23:36:56

标签: vhdl

我是VHDL的新手。我知道进程是同时执行的。但是我没有掌握以下程序的输出:

-- library declaration
library IEEE;
use IEEE.std_logic_1164.all;
use ieee.numeric_std.all;

entity Ex2 is
end Ex2;

architecture behav of Ex2 is
 signal A : std_logic;
begin

 proc1 : process is
 begin
  wait for 20 ns;
  A <= '1';
  wait for 20 ns;
  A <= 'Z';
  wait for 20 ns;
  A <= '0';
 end process proc1;

 proc2 : process is

 begin
  wait for 10 ns;
  A <= '0';
 end process proc2;
end behav;

&#34; A&#34;随着时间的推移具有以下值:

  • 0 ns - 20 ns - &gt; û
  • 20 ns - 30 ns - &gt; X
  • 30 ns - 40 ns - &gt; 1
  • 40 ns - 80 ns - &gt; 0
  • 80 ns - 90 ns - &gt; X

我的想象力输出应该如何:

  • 在proc2&#34; A&#34; 10ns后得0。这个过程就这样结束了。&#34; A&#34; 10ns后应为0。
  • 20ns后,两个过程都恢复,两个人都在写#34; A&#34;同时X也没关系。
  • 在30ns之后,proc2再次写0,所以&#34; A&#34;应该变为0但它是1。

2 个答案:

答案 0 :(得分:3)

每个进程都有自己的A驱动程序.A的有效值是两个驱动程序的已解析值。这些过程是彼此同时进行的,就像采用两个不同的IC并将两者上的引脚连接到同一网络(在本例中命名为A)。

std_logic的解析函数可在库ieee中的软件包std_logic_1164中找到。

要解析的值一次取两个并输入到分辨率表:

-------------------------------------------------------------------
-- resolution function
-------------------------------------------------------------------
CONSTANT resolution_table : stdlogic_table := (
--      ---------------------------------------------------------
--      |  U    X    0    1    Z    W    L    H    -        |   |
--      ---------------------------------------------------------
        ( 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U' ), -- | U |
        ( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ), -- | X |
        ( 'U', 'X', '0', 'X', '0', '0', '0', '0', 'X' ), -- | 0 |
        ( 'U', 'X', 'X', '1', '1', '1', '1', '1', 'X' ), -- | 1 |
        ( 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H', 'X' ), -- | Z |
        ( 'U', 'X', '0', '1', 'W', 'W', 'W', 'W', 'X' ), -- | W |
        ( 'U', 'X', '0', '1', 'L', 'W', 'L', 'W', 'X' ), -- | L |
        ( 'U', 'X', '0', '1', 'H', 'W', 'W', 'H', 'X' ), -- | H |
        ( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' )  -- | - |
    );

显示的水平和垂直值的交点是已解析的值。

如果A未使用已解析的基本类型声明,则会收到一条错误消息,抱怨该而不是已解析的值。

答案 1 :(得分:2)

每个进程都有一个A的驱动程序,以及从这两个进程驱动的结果 进程由std_logic的解析函数生成。

如果您从两个进程中创建A的单独版本,名为A_1和。{ A_2,然后使用代码驱动进程外的公共A

A <= A_1;
A <= A_2;

然后,您可以看到图中每个进程所驱动的值 下方。

enter image description here

然后,解析功能解决了两个来源A_1A_2 根据下表驱动A

    U X 0 1 Z W L H -
    -----------------
U | U U U U U U U U U  
X | U X X X X X X X X    
0 | U X 0 X 0 0 0 0 X
1 | U X X 1 1 1 1 1 X
Z | U X 0 1 Z W L H X
W | U X 0 1 W W W W X
L | U X 0 1 L W L W X
H | U X 0 1 H W W H X
- | U X X X X X X X X

从模拟开始到第一次显式驱动的初始值 在过程中分配是'U'(未初始化)。

因此,例如,10 ns后A不为'0'的原因是该值 从A驱动到proc1的是'U',上面的分辨率表显示了这一点 ('U','0')导致'U'。