После успешной компиляции и симуляции с помощью Modelsim приведенного ниже кода, представляющего собой простой мультиплексор 4to1, построенный с использованием двух мультиплексоров 2to1, я провел тест формы сигнала, чтобы увидеть, как он будет выглядеть, выход постоянно находился в состоянии U независимо от значения входных данных, вот код вместе с результатами:
а. Код мультиплексора 2to1:
entity mux2_1 is
port( a,b:in std_logic_vector(2 downto 0);
s:in std_logic;
e:out std_logic_vector(2 downto 0));
end mux2_1;
architecture wx of mux2_1 is
begin
process
begin
if (s='0') then
e<=a;
else
e<=b;
end if;
wait;
end process;
end wx;
б. Код для мультиплексора 4to1:
entity mux4_1 is
port( a,b,c,d:in std_logic_vector(2 downto 0);
s1,s0:in std_logic;
e :out std_logic_vector (2 downto 0));
end mux4_1;
architecture nj of mux4_1 is
signal t1,t2:std_logic_vector (2 downto 0);
begin
k1: entity work.mux2_1 port map (a,b,s0,t1);
k2: entity work.mux2_1 port map (c,d,s0,t2);
k3: entity work.mux2_1 port map (t1,t2,s1,e);
end nj;
Вот консольный отчет сразу после симуляции:
И, наконец, осциллограммы с непоследовательным выходом:
Что ты делаешь с c
и d
в mux4_1
? (Подсказка: ничего)
А за что вы объявили j
?
@mkrieger1 mkrieger1 Я только что отредактировал код и перезапустил симуляцию, и, по-видимому, проблема все еще сохраняется (я также обновил сообщение), я не могу найти способ открыть ошибку, о которой сообщается в стенограмму, простой щелчок по ней ничего не делает, а двойной щелчок перенаправит меня в самый низ окна стенограммы.
Укажите минимальный воспроизводимый пример. Обратите внимание, что непомеченный процесс в архитектуре wx из mux2_1 не имеет списка конфиденциальности, но включает окончательный оператор ожидания без условия тайм-аута и не возобновится после приостановки в начале моделирования. Этот проект не может реагировать на изменения на его входах (экземпляр k3) в следующем дельта-цикле.
@user1155120 user1155120 Пожалуйста, простите мою неопытность, потому что я новичок в этой области. Спасибо, ваше предложение действительно решило проблему.
Сначала я предлагаю вам прочитать код VHDL от других и попытаться понять, что они делают. У вас есть код, который будет что-то делать, но не обязательно то, что вы хотите. Большая ошибка, которую люди совершают, когда начинают кодировать VHDL, состоит в том, что они думают, что это программное обеспечение и что его можно запрограммировать так же, как программное обеспечение; это не так. Чтобы преуспеть в этом, вы должны думать с точки зрения аппаратного обеспечения и того, какая логика объявляется для вашего кода.
Оператор ожидания является проблемой. Единственное место, где следует использовать оператор ожидания, - это тестовая среда, поскольку они не могут быть сопоставлены с логическими ячейками. Итак, что вы хотите сделать, это удалить оператор ожидания и создать список чувствительности процесса (где в этом случае вам это даже не нужно, но это хорошая практика).
p_MUX_2x1 : process (a, b, s)
begin
if (s = '0') then
e <= a;
else
e <= b;
end if;
end process p_MUX_2x1;
Я считаю, что ошибка связана с оператором ожидания в мультиплексоре 2:1. Пожалуйста, удалите его.
Вот еще одно замечание: используйте операторы ожидания как можно чаще только в тестовом стенде. Поскольку ожидания не синтезируются, вы столкнетесь с несколькими ошибками.
Спасибо
Ошибок: 4, Предупреждений: 2 - вы их читали?