- •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?
ОТВЕТЫ НА КОНТРОЛЬНЫЕ ВОПРОСЫ
1) Как организовать последовательное выполнение двух явно заданных процессов?
Если необходимо запустить 2 процесса подряд один за другим, то в 1 процессе следует перед его окончанием задать какой-либо сигнал (и изменить его). А второй процесс сделать активным по изменению данного сигнала. Таким образом, второй процесс будет выполнять строго после выполнения первого процесса.
Кроме того, в VHDL существует понятие вложенного процесса. Следовательно можно запускать последовательное выполнение таким образом.
2) Какие конструкции языка позволяют реализовать генератор с легко изменяемыми периодом генерации и соотношением длительностей низкого и высокого уровней?
Вариант 1 - задаются сигналы за счет задержек:
i1 <= '0' after 100 ns, '1' after 300 ns;
i2 <= '0' after 100 ns, '1' after 150 ns;
Вариант 2 - задаются паузы:
sig_gen : process
begin
--
-- below: generator sequence
gen <= 0;
wait for 10 ns;
gen <= 1;
wait for 10 ns;
3) Почему описание содержащее два процесса для генерации сигнала clk (один для инициализации и второй для периодического изменения) не работоспособно?
Процесс в VHDL определяет независимую повторяющуюся последовательность операторов и представляет поведение некоторой части проекта. После того, как последний оператор последовательности выполнен, выполнение начинается с первого оператора процесса. Для определения процесса используется оператор process , который состоит из объявлений (после ключевого слова process) и операторной части, которая начинается после слова begin. В объявлении процесса допускается создавать переменные, в то время как объявлять сигналы в этой части нельзя.
Поэтому, если каждый из процессов работает независимо, то инициализация сигнала в одном из процессов не даст никакого выходного результата, а использование сигнала в другом - не даст результат, так как тот не объявлен в данном процессе.
4) Чем будет отличаться выполнение двух нижеприведённых конструкций модели?
t <= ’1’ after 3 ns;
---------------------
t <= ’1’;
wait for 3 ns;
after – задержка назначения сигнала, т.е. сигнал будет присвоен через 3нс.
wait for – после присвоения сигнала приостанавливает процесс на 3 нс.
5) Каким образом реализуются функции rising_edge и falling_edge для типа std_logic?
Передний фронт
Ниже показано задание переднего фронта тактового сигнала для использования в качестве условия в условном операторе ( if statement)
(positive <clock_edge>):
RISING_EDGE(clk_signal_name)
clk_signal_name'EVENT and clk_signal_name = '1'
clk_signal_name = '1' and clk_signal_name'EVENT
not clk_signal_name'STABLE and clk_signal_name = '1'
clk_signal_name = '1' and not clk_signal_name'STABLE
Для использования в качестве условия в операторе wait until используются следующие конструкции для задания переднего фронта
RISING_EDGE(clk_signal_name)
clk_signal_name = '1'
clk_signal_name'EVENT and clk_signal_name = '1'
clk_signal_name = '1' and clk_signal_name'EVENT
not clk_signal_name'STABLE and clk_signal_name = '1'
clk_signal_name = '1' and not clk_signal_name'STABLE
Задний фронт
Ниже показано задание заднего фронта тактового сигнала для использования в качестве условия в условном операторе ( if statement)
FALLING_EDGE(clk_signal_name)
clk_signal_name'EVENT and clk_signal_name = '0'
clk_signal_name = '0' and clk_signal_name'EVENT
not clk_signal_name'STABLE and clk_signal_name = '0'
clk_signal_name = '0' and not clk_signal_name'STABLE
Для использования в качестве условия в операторе wait until используются следующие конструкции для задания заднего фронта
FALLING_EDGE(clk_signal_name)
clk_signal_name = '0'
clk_signal_name'EVENT and clk_signal_name = '0'
clk_signal_name = '0' and clk_signal_name'EVENT
not clk_signal_name'STABLE and clk_signal_name = '0'
clk_signal_name = '0' and not clk_signal_name'STABLE
