inout信号在模拟中不会改变

时间:2013-11-02 09:12:28

标签: simulation vhdl xilinx bidirectional tri-state-logic

假设我有一个名为“HostToDevice”的实体,它有一个“ps2c”输入信号(VHDL)。在这个实体中,我只将此信号设置为'Z'(高阻抗),因为我希望其他实体控制它。

我创建了一个测试平台来检查行为,并发生了一些奇怪的事情(对我来说)。在测试台上我有这个代码:

ps2ctemp_process :process
begin
    ps2ctemp <= '0';
    wait for ps2c_period/2;
    ps2ctemp <= '1';
    wait for ps2c_period/2;
end process;

之后:

stim_proc: process
begin
    ps2c <= ps2ctemp;

    wait;
end process;

当我运行模拟(行为)时,“ps2c”inout信号很低,并且不像ps2ctemp信号那样改变。

相反,如果我在不使用其他信号的情况下手动驱动ps2c信号,它可以正常工作;像这样:

ps2c <= '1';
wait for 10 ns;
ps2c <= '0';
wait for 10 ns;
ps2c <= '1';

1 个答案:

答案 0 :(得分:1)

您的“stim_proc”没有敏感列表,并且没有事件或超时一个“等待”,因此它打算运行一次并永远等待。这似乎是sim正在做的事情,所以很好。

现在我在这里做一个疯狂的猜测,你实际上希望每次ps2ctemp更改时都会唤醒它,并将新值传递给ps2c

有两种方法可以做到:

(1)带有敏感度列表

stim_proc: process(psc2temp)
begin
    ps2c <= ps2ctemp;

    --wait;
    -- no, we want the process to complete, so it can be woken up 
    -- and run from the start again
end process;

(2)等待特定事件...

stim_proc: process
begin
    ps2c <= ps2ctemp;

    wait until ps2ctemp'event;
    -- any activity at all on ps2ctemp should wake this process, 
    -- in case there is something it ought to be doing...
end process;

在这个简单的例子中,这两种形式基本上是等同的。所以更简单的一个(敏感性列表)是首选......