Я изучаю VHDL, читая книги в Интернете (Free Range VHDL) и выполняя примеры на своем Nexsys2 через Xilinx ISE Webpack 14.7. Я перечитываю текст Free Range VHDL и сейчас обсуждаю в главе процессы. У меня есть четкое представление о том, что такое процесс и как он работает, но я реализовал пример и не понимаю результатов.
Я реализовал мультиплексор 8:1, используя следующий код.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity mux81 is
port( d_in : in std_logic_vector(7 downto 0);
sel : in std_logic_vector(2 downto 0);
ce : in std_logic;
F : out std_logic);
end mux81;
architecture my_mux81 of mux81 is
begin
mux_proc: process(d_in, sel, ce)
begin
if (ce = '1') then
if (sel = "111") then
F <= d_in(7);
elsif (sel = "110") then
F <= d_in(6);
elsif (sel = "101") then
F <= d_in(5);
elsif (sel = "100") then
F <= d_in(4);
elsif (sel = "011") then
F <= d_in(3);
elsif (sel = "010") then
F <= d_in(2);
elsif (sel = "001") then
F <= d_in(1);
elsif (sel = "000") then
F <= d_in(0);
else
F <= '0';
end if;
else
F <= '0';
end if;
end process mux_proc;
end my_mux81;
который выполняет операцию мультиплексирования, только если сигнал «ce» равен «1». Все работало, как и ожидалось. Затем я провел эксперимент, удалив сигнал «ce» из списка чувствительности. Насколько я понимаю оператор процесса, он должен выполняться только в том случае, если изменяется сигнал в списке чувствительности. При удалении сигнала «ce» схема не должна реагировать только на изменения «ce». Вот модифицированная схема:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity mux81 is
port( d_in : in std_logic_vector(7 downto 0);
sel : in std_logic_vector(2 downto 0);
ce : in std_logic;
F : out std_logic);
end mux81;
architecture my_mux81 of mux81 is
begin
mux_proc: process(d_in, sel)
begin
if (ce = '1') then
if (sel = "111") then
F <= d_in(7);
elsif (sel = "110") then
F <= d_in(6);
elsif (sel = "101") then
F <= d_in(5);
elsif (sel = "100") then
F <= d_in(4);
elsif (sel = "011") then
F <= d_in(3);
elsif (sel = "010") then
F <= d_in(2);
elsif (sel = "001") then
F <= d_in(1);
elsif (sel = "000") then
F <= d_in(0);
else
F <= '0';
end if;
else
F <= '0';
end if;
end process mux_proc;
end my_mux81;
Как видите, единственное изменение состоит в том, что «ce» удалено из списка чувствительности. Однако, когда я реализую эту схему, она работает точно так же, как и версия, в которой в списке чувствительности указано «ce». Другими словами, сохранение сигналов «d_in» и «sel» постоянными, но изменение «ce» приводит к выполнению оператора процесса и изменению выходного сигнала, как если бы «ce» все еще был в списке чувствительности. Я не получил никаких предупреждений, когда я запускал синтез. Это похоже на то, что программа сделала предположение, что «ce» также следует отслеживать, но я подумал, что это также должно генерировать предупреждение...
Спасибо за помощь!
if
уменьшится доF <= d_in(sel);
! - person user_1818839   schedule 01.09.2014