library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; -- Объявление интерфейса модуля entity your_project_name_2 is -- Статические параметры. Наподобе template в C++ generic ( DATA_WIDTH : natural := 8 ); -- Объявление порта модуля. Входные и выходные линии, их имена и типы. port ( -- тактовый сигнал. одноразрядная входная логическая линия clock : in std_logic; -- Три входа данных a, b и c. Логические вектора размера WIDTH. a : in std_logic_vector ((DATA_WIDTH-1) downto 0); b : in std_logic_vector ((DATA_WIDTH-1) downto 0); c : in std_logic_vector ((DATA_WIDTH-1) downto 0); -- Сигнал асинхронного выхода result_async : out std_logic_vector ((DATA_WIDTH-1) downto 0); -- Сигнал синхронного выхода. (синхронизирован по тактовому сигналу clock) result_sync : out std_logic_vector ((DATA_WIDTH-1) downto 0) ); end entity; -- Определение архитектуры модуля architecture rtl of your_project_name_2 is -- Объявление сигнала(линий) разрядностью WIDTH. Просто передаёт сигнал. Меняет своё значение мгновенно. Не хранит данных. signal a_and_b : std_logic_vector ((DATA_WIDTH-1) downto 0); signal a_and_b_or_c : std_logic_vector ((DATA_WIDTH-1) downto 0); -- Объявление регистра разрядностью WIDTH. Меняет значение только по фронту тактового сигнала. (В VHDL не совсем очевидно отличие регистра от линии) -- Хранит последнее присвоенное значение от присвоения до присвоения. signal result_sync_reg : std_logic_vector ((DATA_WIDTH-1) downto 0); begin -- Асинхронное присвоение линии a_and_b логического выражения (data_a "И" data_b). -- Теперь линия a_and_b всегда будет равна логическому произведению (data_a "И" data_b). -- a_and_b меняет своё значение мгновенно, по изменении значения любого из сигналов, от которых зависит. a_and_b <= a and b; -- Асинхронный процесс. Содержит Псевдо-последовательный код, который выполняется постоянно. -- Код может содержать ряд присвоений, условные операторы, циклы и т.д. -- Но, асинхронный процесс должен быть написан так, что бы по нему можно было построить полную таблицу истинности. -- Компилируется в комбинационную логику или логическую таблицу. process(a_and_b, c) begin a_and_b_or_c <= a_and_b or c; result_async <= a_and_b_or_c; end process; -- Синхронный процесс. Содержит Псевдо-последовательный код, который выполняется только по фронту clock. -- Код может содержать ряд присвоений, условные операторы, циклы и т.д. -- Синхронный процесс не обязан полностью сводиться к полной таблице истинности. -- При компиляции, те части, по которым можно построить полную таблицу истиннсти, выносятся в отдельный асинхронный процесс. -- Остальное же компилируется в массивы триггеров (регистры), синхронизированные по соответствующему тактовому сигналу. process(clock) begin -- Именно, благодаря этому условному оператору процесс становится синхронным. if rising_edge(clock) then result_sync_reg <= a_and_b_or_c; end if; end process; -- Ещё одно асинхронное присвоение. result_sync <= result_sync_reg; end rtl;