Структурный Кольцевой Генератор VHDL - PullRequest
0 голосов
/ 04 октября 2018

У меня проблемы со следующим кодом кольцевого генератора:

entity OSCILLATOR is
    port(   OUTPUT: out std_logic
    );
end entity OSCILLATOR;

architecture structural of OSCILLATOR is

component DEL_INV is
    generic(D: time);   
    port(   INPUT: in std_logic;
            OUTPUT: out std_logic   
        );
end component DEL_INV;

signal conn: std_logic := '0';
signal conn1: std_logic := '1';
signal conn2: std_logic := '0';
signal de: time := 2 ns;

begin
    INV1: DEL_INV generic map(de) port map (conn, conn1);
    INV2: DEL_INV generic map(de) port map (conn1, conn2);
    INV3: DEL_INV generic map(de) port map (conn2, conn);

    OUTPUT <= conn;

end architecture;

В частности, при его моделировании всегда вывод U. Кто-нибудь может объяснить, почему?

1 Ответ

0 голосов
/ 04 октября 2018

Начальные значения, присвоенные сигналам 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;
...