Проблема с выводом мультиплексора 4to1, сделанного с использованием мультиплексора 2to1 в Modelsim - PullRequest
0 голосов
/ 04 июля 2019

После успешной компиляции и моделирования с использованием Modelsim из кода ниже, который представляет собой простой мультиплексор 4to1, построенный с использованием двух мультиплексоров 2to1, я запустил тест формы волны, чтобы увидеть, как это будет выглядеть, вывод был непрерывно в состоянии Uнезависимо от значений входных данных, здесь приведен код вместе с результатами:

a. Код для мультиплексора 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;

b. Код для мультиплексирования 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;

Вот консольный отчет сразу после моделирования:

enter image description here

Инаконец, осциллограммы с непоследовательным выходным сигналом:

enter image description here

Ответы [ 2 ]

1 голос
/ 07 июля 2019

Я полагаю, что ошибка связана с оператором wait в вашем формате 2: 1.Пожалуйста, удалите его.

Вот примечание: используйте операторы ожидания в максимально возможной степени только в testbench.Поскольку ожидания не могут быть синтезированы, вы столкнетесь с несколькими ошибками.

Спасибо

0 голосов
/ 05 июля 2019

Сначала я предлагаю вам прочитать код 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;
...