Начальные значения, присвоенные сигналам conn*
, для обеспечения четко определенного условия запуска в симуляции, при запуске перезаписываются 'U'
, управляемым OUTPUT
в модуле DEL_INV
, и симуляция, таким образом,в конечном итоге застрял во всех U
.
Одним из решений является обработка начального значения через модуль DEL_INV
с помощью универсального, который допускает различные начальные значения OUTPUT
, а затем использование этого начального значения в OUTPUT
до тех пор, пока значение не будет четко определено как '0'
или '1'
, что можно обнаружить с помощью функции is_x
.
Обновленный код для этого показан ниже.Обратите внимание, что я добавил предложения Рено Пакале для for all: DEL_INV use entity work.DEL_INV(s);
и инвертора (not
) в DEL_INV
.
library ieee;
use ieee.std_logic_1164.all;
entity DEL_INV is
generic(
D: time;
XOUT: std_logic);
port(
INPUT: in std_logic;
OUTPUT: out std_logic);
end entity DEL_INV;
architecture s of DEL_INV is
signal PRE : std_logic;
begin
PRE <= (not INPUT) after D;
OUTPUT <= XOUT when is_x(PRE) else PRE; -- Drive XOUT if is_x to clean up
end architecture s;
library ieee;
use ieee.std_logic_1164.all;
entity OSCILLATOR is
port(
OUTPUT: out std_logic);
end entity OSCILLATOR;
architecture structural of OSCILLATOR is
component DEL_INV is
generic(
D: time;
XOUT: std_logic);
port(
INPUT: in std_logic;
OUTPUT: out std_logic);
end component DEL_INV;
for all: DEL_INV use entity work.DEL_INV(s);
signal conn : std_logic;
signal conn1 : std_logic;
signal conn2 : std_logic;
constant DE : time := 2 ns;
begin
INV1: DEL_INV generic map(de, '0') port map (conn, conn1);
INV2: DEL_INV generic map(de, '1') port map (conn1, conn2);
INV3: DEL_INV generic map(de, '0') port map (conn2, conn);
OUTPUT <= conn;
end architecture;