Один из вариантов описания инерционного поведения вентиля AND2 с разными задержками фронта и среза

library IEEE;

use IEEE. STD_LOGIC_1164.all;

entity and2_tpLH_tpHL is

generic (tpLH : time := 15ns; tpHL : time := 20ns);

port( A : in STD_LOGIC;

B : in STD_LOGIC;

Y : out STD_LOGIC :='0' -- нужна начальная инициализация

--Y : inout STD_LOGIC :='0' -- работает без Y'driving_value

--Y : buffer STD_LOGIC :='0' --работает без Y'driving_value );

end and2_tpLH_tpHL;

architecture and2_tpLH_tpHL of and2_tpLH_tpHL is

begin

PROCESS (A, B)

variable Y_INT : std_logic;

begin

Y_INT:=A and B; -- Вычисляем выход без задержки

if Y_INT='1' and Y'driving_value ='0' then --работает с --Y'driving_value

Y<='X','1' after tpLH; -- Выход имеет значение 'X', пока формируется фронт

elsif Y_INT='0' and Y'driving_value ='1' then

Y<='X','0' after tpHL; -- Выход имеет значение 'X', пока формируется срез

end if;

end process;

end and2_tpLH_tpHL;

Атрибут 'driving_value обеспечивает доступ к значению выходного сигнала

Во время переходных процессов формирования фронта или среза на выходе элемента устанавливается неизвестное значение ‘X’.

Генератор сигналов с периодом 200ns, который можно остановить по сигналу stop_gen из другого процесса.

library IEEE;

use IEEE. STD_LOGIC_1164.all;

entity gener is

port(

Y : out STD_LOGIC

);

end gener;

architecture gener of gener is

constant stop_gen : time :=1100ns;

signal done : std_logic;

begin

GEN_PR: process

begin

if NOW=0ns then Y<='0';

НЕ нашли? Не то? Что вы ищете?

end if;

wait for 100ns;

Y<=not Y'driving_value;

if done='1' then wait;

end if;

end process;

STOP_PR: process

begin

done<='0';

wait for stop_gen;

done<='1';

wait;

end process;

end gener;

Инерционная и транспортная задержки. Резекция (порог)

Инерционная задержка предполагает, что элемент не реагирует на сигналы, длительность которых меньше порога, равного времени задержки элемента.

Транспортная модель передаёт на выход импульсы любой длительности, в том числе меньше времени задержки.

Модель инерционной задержки с резекцией (reject) обрезает (не пропускает) сигналы, длительность которых равна или меньше времени резекции. Это своеобразный компромисс между инерционной и транспортной задержками.

library IEEE;

use IEEE. STD_LOGIC_1164.all;

entity and2_I_T is

port(

A : in STD_LOGIC;

B : in STD_LOGIC;

Y_I, Y_T, Y_I_R : out STD_LOGIC);

end and2_I_T;

architecture and2_I_T of and2_I_T is

begin

Y_I <= inertial A and B after 10ns;

Y_T <= transport A and B after 10ns;

Y_I_R <= reject 7ns inertial A and B after 10ns;-- время резекции 5ns

end and2_I_T;

Отыскание иголок

library IEEE;

use IEEE. STD_LOGIC_1164.all;

entity and2_glitch is

port(

A : in STD_LOGIC;

B : in STD_LOGIC;

Y : out STD_LOGIC );

end and2_glitch;

architecture and2_glitch of and2_glitch is

signal Y_I, Y_T : std_logic;

begin

Y_I<= inertial A and B after 10ns;

Y_T<= transport A and B after 10ns;

assert Y_I = Y_T report "Glitch" severity ERROR;

Y<=Y_I;

end and2_glitch;

Контроль минимальной длительности импульса

Длительность импульса не должна быть меньше времени задержки элемента, на вход которого он поступает.

library IEEE;

use IEEE. STD_LOGIC_1164.all;

entity buffer_my is

port(A : in STD_LOGIC;

Y : out STD_LOGIC);

end buffer_my;

architecture model of buffer_my is

begin

PROCESS (A)

variable t_event : time :=0ns; -- Переменную типа время

-- инициализируем нулём

begin

if now > 8ns then

assert (now - t_event >= 8ns) -- вычисляется время

-- между соседними переключениями сигнала A

report "minimum" severity ERROR;

end if;

t_event:=now; -- в t_event заносится время последнего

-- переключения сигнала A

end process;

Y <= A after 8ns; -- задержка буфера 8ns

end model;

Сигналы длительностью больше или равной 8ns (задержка буфера) проходят на выход (первые два импульса в 10ns и 8ns). Импульсы короче 8ns на выходе не появляются (третий и четвёртый соответственно 7ns и 6ns). При этом программа моделирования сообщает о нарушении минимальной длительности импульса.

Контроль времени предустановки данных на входе D-триггера DFF_setup

library IEEE;

use IEEE. STD_LOGIC_1164.all;

entity DFF_setup is

port(

D : in STD_LOGIC;

C : in STD_LOGIC;

Q : out STD_LOGIC

);

end DFF_setup;

architecture DFF_setup of DFF_setup is

begin

process (C)

begin

if C='1' and C'EVENT then

if (D'last_event>=10ns) then Q<=D;

else assert false report "SetUp error"

severity error; Q<='X';

end if;

end if;

end process;

end DFF_setup;