- •1) Как организовать последовательное выполнение двух явно заданных процессов?
- •2) Какие конструкции языка позволяют реализовать генератор с легко изменяемыми периодом генерации и соотношением длительностей низкого и высокого уровней?
- •3) Почему описание содержащее два процесса для генерации сигнала clk (один для инициализации и второй для периодического изменения) не работоспособно?
- •4) Чем будет отличаться выполнение двух нижеприведённых конструкций модели?
- •5) Каким образом реализуются функции rising_edge и falling_edge для типа std_logic?
- •6) Как с использованием атрибутов сигналов задать условие фронта для типа bit, для типа std_logic? Чем обуславливается разница этих условий?
- •7) Поясните на примерах работу функции вычисления resolved для типа std_logic.
- •8) По каким принципам строится таблица вычисления для монтажного и для типа std_logic?
- •9) В чём различия между строго структурным, поведенческим и потоковым описаниями моделей?
- •10) Как отсоединить источник от сигнала не используя состояние ’z’ типа std_logic?
6) Как с использованием атрибутов сигналов задать условие фронта для типа bit, для типа std_logic? Чем обуславливается разница этих условий?
Пример |
Тип результата |
Пояснения |
S’QUIET(Т) |
Boolean |
TRUE, если сигнал S пассивен на интервале Т. |
S’TRANSACTION |
Bit |
Инвертируется S каждый раз, когда S активен (изменяется) |
S’STABLE(T) |
Boolean |
TRUE, если не было событий за интервал Т. |
S’DELAYED(T) |
Signal |
Предыдущее значение S в момент NOW-T |
S’ACTIVE |
Boolean |
TRUE, если сигнал активен |
S’LAST_ACTIVE |
Time |
Время, когда сигнал последний раз был активен |
S’EVENT |
Boolean |
TRUE, если происходит cобытие в S |
S’LAST_VALUE |
Signal |
Значение сигнала перед последним событием в нем |
S’LAST_EVENT |
Time |
Время последнего события в S |
Для задания условий фронта можно использовать следующие атрибуты сигналов:
Для типа Bit:
’TRANSACTION
A<=CLK’ TRANSACTION
Для типа std_logic:
’ACTIVE
If CLK’ ACTIVE then
A<=b;
’EVENT
If CLK=1 and CLK’ ACTIVE then
A<=b;
’LAST_value
If clk’last_value /= clk then
A<=b;
’STABLE(T)
If not CLK’STABLE then
A<=b;
7) Поясните на примерах работу функции вычисления resolved для типа std_logic.
8) По каким принципам строится таблица вычисления для монтажного и для типа std_logic?
В языке VHDL функция разрешения используется для определения значения сигнала, имеющего несколько источников.
TYPE std_ulogic IS ( 'U', -- Uninitialized 'X', -- Forcing Unknown '0', -- Forcing 0 '1', -- Forcing 1 'Z', -- High Impedance 'W', -- Weak Unknown 'L', -- Weak 0 'H', -- Weak 1 '-' -- Don't care ); TYPE std_ulogic_vector IS ARRAY ( NATURAL RANGE <> ) OF std_ulogic; FUNCTION resolved ( s : std_ulogic_vector ) RETURN std_ulogic; SUBTYPE std_logic IS resolved std_ulogic; TYPE std_logic_vector IS ARRAY ( NATURAL RANGE <>) OF std_logic; TYPE stdlogic_table IS ARRAY(std_ulogic, std_ulogic) OF std_ulogic; CONSTANT resolution_table : stdlogic_table := ( -- --------------------------------------------------------- -- | U X 0 1 Z W L H - | | -- --------------------------------------------------------- ( 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U' ), -- | U | ( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ), -- | X | ( 'U', 'X', '0', 'X', '0', '0', '0', '0', 'X' ), -- | 0 | ( 'U', 'X', 'X', '1', '1', '1', '1', '1', 'X' ), -- | 1 | ( 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H', 'X' ), -- | Z | ( 'U', 'X', '0', '1', 'W', 'W', 'W', 'W', 'X' ), -- | W | ( 'U', 'X', '0', '1', 'L', 'W', 'L', 'W', 'X' ), -- | L | ( 'U', 'X', '0', '1', 'H', 'W', 'W', 'H', 'X' ), -- | H | ( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ) -- | - | ); FUNCTION resolved ( s : std_ulogic_vector ) RETURN std_ulogic IS VARIABLE result : std_ulogic := 'Z'; -- weakest state default BEGIN -- the test for a single driver is essential otherwise the -- loop would return 'X' for a single driver of '-' and that -- would conflict with the value of a single driver unresolved -- signal. IF (s'LENGTH = 1) THEN RETURN s(s'LOW); ELSE FOR i IN s'RANGE LOOP result := resolution_table(result, s(i)); END LOOP; END IF; RETURN result; END resolved;
Подтип std_logic образуется из типа std_ulogic c помощью разрешающей функции resolved, которая также объявлена и определена в библиотеке std_logic_1164. Для разрешения данных типа std_logic, функция resolved использует разрешающую таблицу, VHDL-код которой приведен ниже.
constant resolution_table : stdlogic_table := (
-- ---------------------------------------------------------
-- | U X 0 1 Z W L H - | |
-- ---------------------------------------------------------
( 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U' ), -- | U |
( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ), -- | X |
( 'U', 'X', '0', 'X', '0', '0', '0', '0', 'X' ), -- | 0 |
( 'U', 'X', 'X', '1', '1', '1', '1', '1', 'X' ), -- | 1 |
( 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H', 'X' ), -- | Z |
( 'U', 'X', '0', '1', 'W', 'W', 'W', 'W', 'X' ), -- | W |
( 'U', 'X', '0', '1', 'L', 'W', 'L', 'W', 'X' ), -- | L |
( 'U', 'X', '0', '1', 'H', 'W', 'W', 'H', 'X' ), -- | H |
( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ) -- | - |
);
Данная таблица определяет, какой сигнал получится в итоге "столкновения" двух сигналов типа std_logic. Например, приходят сигналы '0' и 'H', смотрим, что в месте пересечения соответствующих строки и столбца получается '0'. И это не удивительно, если вспомнить, что сигнал '0' - сильный, а 'H' - слабый.
