VHDL: проблемы с объединением сущностей (компонентов)

Мне еще раз!

Я написал что-то СУПЕР простое, чтобы продемонстрировать, как объединяются сущности. Однако мне трудно понять, почему вывод объединенных сущностей никогда не принимает никакого значения (кроме U). Вот код (он очень простой, обещаю!)

library ieee;
use ieee.std_logic_1164.all;

entity OR_LOGIC is
    port(
        in_a  : in  std_logic;
        in_b  : in  std_logic;
        out_c : out std_logic
    );
end entity;

architecture OR_LOGIC_ARCH of OR_LOGIC is
begin
    out_c <= in_a or in_b;
end OR_LOGIC_ARCH;


library ieee;
use ieee.std_logic_1164.all;

entity AND_LOGIC is
    port(
        in_a  : in  std_logic;
        in_b  : in  std_logic;
        out_c : out std_logic
    );
end entity;

architecture AND_LOGIC_ARCH of AND_LOGIC is
begin
    out_c <= in_a and in_b;
end AND_LOGIC_ARCH;


library ieee;
use ieee.std_logic_1164.all;

entity COMBO is
    port(
        in_a  : in  std_logic;
        in_b  : in  std_logic;
        in_c  : in  std_logic;
        out_d : out std_logic
    );
end entity;

architecture COMBO_ARCH of COMBO is
    signal wire1 : std_logic;
    signal wire2 : std_logic;
    component OR_LOGIC
        port(
            in_a  : in  std_logic;
            in_b  : in  std_logic;
            out_c : out std_logic
        );
    end component;
    component AND_LOGIC
        port(
            in_a  : in  std_logic;
            in_b  : in  std_logic;
            out_c : out std_logic
        );
    end component;
begin

    or1 : OR_LOGIC port map (in_a, in_b, wire1);
    and1 : AND_LOGIC port map(in_c, wire1, wire2);
end COMBO_ARCH;

а потом:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity TEST_ENTITY is
end entity TEST_ENTITY;

architecture TEST_ENTITY_ARCH of TEST_ENTITY is    
    component ANDandOR
        port(
            in_a  : in  std_logic;
            in_b  : in  std_logic;
            in_c  : in  std_logic;
            out_d : out std_logic
        );
    end component; 
    signal in_a, in_b, in_c, out_d : std_logic;

begin

    combination : ANDandOR port map (in_a, in_b, in_c, out_d);

    process
    begin
        in_a <= '0';
        in_b <= '0';
        in_c <= '0';
        wait for 5ns;

        in_a <= '1';
        in_b <= '0';
        in_c <= '1';
        wait for 5ns;

        in_a <= '0';
        in_b <= '1';
        in_c <= '0';
        wait for 5ns;
    end process;

end architecture TEST_ENTITY_ARCH;

person Alek988Alek    schedule 15.02.2015    source источник
comment
ПРИМЕЧАНИЕ. Только что я попытался протестировать только объект AND_LOGIC, и я получаю вывод 0, когда один вход равен «0», как и ожидалось, но вывод X, когда оба входа равны «1». Почему!?   -  person Alek988Alek    schedule 15.02.2015
comment
Вы не назначили out_d в верхнем модуле (COMBO). out_d <= wire2;   -  person Amir    schedule 15.02.2015
comment
В тестовом стенде имя компонента должно быть COMBO. Модуль ANDandOR не существует.   -  person Amir    schedule 15.02.2015


Ответы (1)


Во-первых, вы назначили выход логического элемента И на wire2, но wire2 является плавающим. Вы должны либо назначить его своему выходу, как это

out_d <= wire2;

ИЛИ удалите wire2 из ваших внутренних сигналов и назначьте свой выход напрямую.

and1 : AND_LOGIC port map(in_c, wire1, out_d);

Во-вторых, ваш тестовый стенд должен иметь правильное имя компонента COMBO, чтобы правильно его отобразить. Quartus может сгенерировать для вас шаблон тестового стенда, в который вы затем можете добавить тестовый код.

Обработка --> Пуск --> Запустить средство записи шаблонов тестового стенда

Это очень удобно :)

person Lamaseed    schedule 15.02.2015
comment
Спасибо, я ценю вашу помощь, хотя это была такая глупая оплошность :D - person Alek988Alek; 16.02.2015