SlideShare a Scribd company logo
Куланов В.А.
[v.kulanov@csn.khai.edu]
Операторы языка
описания аппаратуры
VHDL. Последовательные
операторы.
«Технологии проектирования
компьютерных систем»
Операторы в языке VHDL
Последовательные операторы
 выполняются друг за другом в порядке их
записи в исходном коде
 традиционные для большинства языков
программирования высокого уровня
 используются только внутри составного
параллельного оператора PROCESS или
внутри подпрограмм (функции и процедуры)
Параллельные операторы
 инициируется по событийному принципу, т. е.
они исполняются тогда, когда посредством
реализации других операторов программы
создаются условия для их исполнения
 представляют части алгоритма, которые в
реальной системе могут исполняться
одновременно
 бывают простыми и составными
 используются только в архитектурном теле
(ARCHITECTURE) или внутри составного
оператора BLOCK
Операторы в языке VHDL
ARCHITECTURE identifier OF entity_name IS
-- объявление типов, подтипов, сигналов и т.д.
BEGIN
END ARCHITECTURE identifier;
Простой параллельный
оператор (WHEN)
Простой параллельный
оператор (<=)
Составной параллельный
оператор (PROCESS)
Последовательный
оператор 1
Последовательный
оператор 2
Последовательный
оператор 3
Операторы в языке VHDL
PROCEDURE procedure_name (parameter_list) IS
-- объявление типов, подтипов, сигналов и т.д.
BEGIN
END procedure_name;
Последовательный
оператор 1
Последовательный
оператор 2
Последовательный
оператор 3
Простой параллельный
оператор (WHEN)
Простой параллельный
оператор (<=)
Последовательные операторы
 Оператор WAIT
 Последовательный оператор ASSERT
 Оператор REPORT
 Последовательный оператор присваивания значения
сигналу (<=)
 Оператор присваивания значения переменной (:=)
 Последовательный вызов процедуры
 Условный оператор IF
 Оператор выбора CASE
 Оператор цикла LOOP
 Оператор NEXT
 Оператор EXIT
 Оператор RETURN
 Оператор NULL
Оператор присваивания значения
переменной (:=)
[label:] variable_name := expression;
inc: count := count + 2;
data_vector := low_bytes & X"FF";
d_bus := B"1111_1111";
TMP := TMP XOR X(j);
msg := integer'image(count)
-- В правой части выражения используется функция shift
shift_val := shift(data_bus, left);
метка
Последовательный оператор присваивания
значения сигналу (<=)
signal_name <= [delay_mechanism]waveform;
имя сигнала тип задержки
 TRANSPORT
 INERTIAL (по умолчанию)
 механизм инерционной задержки позволяет
фильтровать входные сигналы, изменение которых
происходит «слишком быстро»
 транспортная задержка чаще используется на этапе
функциональной отладки проекта
TRANSPORT | [REJECT time_expression] INERTIAL
значение
(транзакции)
Последовательный оператор присваивания
значения сигналу (<=)
flag_z <= '1';
-- Эквивалентно примеру выше
flag_z <= INERTIAL '1' AFTER 0 ns;
data_bus <= B"0000_1111";
-- Эквивалентно примеру выше
data_bus <= INERTIAL X"0F" AFTER 0 ns;
flag_o <= TRANSPORT '1' AFTER 1 ns;
e_out <= "0000" AFTER 2 ns, "1111" AFTER 7 ns;
-- Инициализация матрицы N x M значением '1'
matrix <= (OTHERS => (OTHERS => '1'));
Последовательный оператор присваивания
значения сигналу (<=)
Z1 <= TRANSPORT X AFTER 10 ns; -– транспортная задержка
Z2 <= X AFTER 10 ns; -– инерционная задержка
Z2 <= REJECT 4 ns X AFTER 10 ns; -– задержка
-- с указанным интервалом фильтрации
Условный оператор IF
[if_label:] IF condition THEN
{sequential_statement}
{ELSIF condition THEN
{sequential_statement}}
[ELSE
{sequential_statement}]
END IF [if_label];
метка тип BOOLEAN
 проверка различных условий, в зависимости от
которых формируется соответствующий результат
Последовательные
операторы
Условный оператор IF
PROCESS(reset, clk) IS
BEGIN
IF reset = '1' THEN -- асинхронный сброс
…
ELSIF clk'event AND clk = '1' THEN
…
END IF;
END PROCESS;
IF address = X"FF00" THEN
stack_overflow := '1'; -- переменная
except_vector <= X"FFFA"; -- сигнал
ELSE
stack _overflow := '0';
except_vector <= X"0000";
END IF;
Условный оператор IF
-- check_overflow(inc) – функция с параметром inc
-- в заголовке условного оператора IF
step_inc: IF step /= check_overflow(inc) THEN
… -- тело оператора
END IF step_inc;
VARIABLE z_flag : BOOLEAN;
…
IF z_flag THEN
… -- тело оператора
END IF step_inc;
Оператор выбора CASE
 определение поведения устройства (модели) в зависимости
от некоторого выражения
 значение этого выражения сравнивается со значениями,
стоящими после ключевого слова WHEN (их тип должен
совпадать)
 при первом же совпадении выполняется последовательность
действий sequential_statements
[case_label:] CASE expression IS
(WHEN (simple_expression | discrete_range | OTHERS)
=> {sequential_statement})
{…}
END CASE [case_label];
дискретный набор
значенийметка
Оператор выбора CASE
TYPE fsm_states IS (IDLE, START, STOP, PROCESSING);
VARIABLE fsm: fsm_states;
CASE fsm IS
WHEN IDLE => flag_idle := '1';
WHEN PROCESSING => flag_processing := '1';
WHEN OTHERS => flag_idle := '0';
flag_processing := '0';
END CASE;
CASE fsm IS
…
WHEN START | STOP => -- одинаковая
flag_idle := '0'; -- последовательность
flag_processing := ′0′; -- действий
WHEN OTHERS =>
…
END CASE;
Оператор выбора CASE
SUBTYPE index_mode IS INTEGER RANGE 0 TO 15;
VARIABLE selector: index_mode;
VARIABLE do_check: BOOLEAN := TRUE;
VARIABLE data_val: STD_LOGIC_VECTOR(7 DOWNTO 0);
…
CASE selector IS
WHEN 0 => data_val := X"00";
do_check := FALSE;
WHEN 1 => data_val := X"01";
do_check := FALSE;
WHEN 2 TO 5 | 9 TO 12 =>
data_val := X"10";
do_check := FALSE;
WHEN OTHERS =>
data_val := X"11";
do_check := TRUE;
END CASE;
Оператор цикла FOR
 простейшая форма задания [бесконечного] цикла:
метка
[loop_label:] LOOP
{sequential_statemeny}
END LOOP [loop_label];
 циклы LOOP могут быть любой вложенности
 бесконечные циклы не являются синтезируемыми и
используются для моделирования поведения
проектных решений
 для ограничения количества итераций цикла
используются дополнительные операторы
Оператор прерывания
текущей итерации цикла NEXT
 если метка [loop_label] не определена, то прерывается
текущее выполнение того цикла, в котором непосредственно
указан оператор
 указание метки цикла позволяет прерывать текущую
итерацию сразу нескольких вложенных друг в друга циклов
 логическое выражение boolean_expression может
дополнительно определять условия прерывания выполнения
текущей итерации:
• если условие не задано, то прерывание выполняется
безусловно
NEXT [loop_label] [WHEN boolean_expression]
метка логическое выражение
Оператор завершения цикла EXIT
 если метка [loop_label] не определена, то завершается
выполнение того цикла, в котором непосредственно указан
оператор
 указание метки цикла позволяет завершить выполнение
нескольких вложенных друг в друга циклов
 логическое выражение boolean_expression может
дополнительно определять условия завершения (выхода из)
цикла:
• если условие не задано, то завершение цикла выполняется
безусловно
EXIT [loop_label] [WHEN boolean_expression]
метка логическое выражение
Операторы NEXT/EXIT
...
outer: LOOP
...
inner : LOOP
-- выход из внутреннего и внешнего циклов
EXIT outer WHEN condition_1
-- выход из внутреннего цикла
EXIT WHEN condition_2;
END LOOP inner;
...
-- прерывание текущей итерации внешнего цикла
NEXT WHEN condition_3;
END LOOP outer;
...
...
Циклы с предусловием WHILE
[loop_label:] WHILE condition LOOP
{sequential_statement}
END LOOP [loop_label];
 предполагается, что в процессе выполнения цикла объекты,
входящие в условие (condition) заголовка, меняют свое
значение в теле цикла
 если перед началом очередной итерации условие истинно,
то она выполняется, в противном случае цикл завершается
L3: WHILE i <= 8 LOOP
output_X(i) <= onput_X(i+8) AFTER 5 ns;
i := i + 1;
END LOOP L3;
метка условие
Объект-идентификатор
 может быть любого дискретного типа
 не требует предварительного описания
 является определенным только на время выполнения цикла
 имя может совпадать с именем другого объекта в модели
 нельзя изменять значение в теле цикла
Циклы с указанием
количества повторений FOR
 получил наибольшее распространение при реализации
«синтезируемых» проектных решений (количество итераций
в цикле должно быть определено заранее)
[label:] FOR identifier IN (expr TO|DOWNTO expr) LOOP
{sequential_statement}
END LOOP [label];
метка
Циклы с указанием
количества повторений FOR
L4: FOR cnt_val IN 1 TO 8 LOOP
output_X(cnt_val) := input_X(cnt_val + 8);
cnt_val := cnt_val + 1; -- запрещено изменять
END LOOP L4;
VARIABLE a, b: INTEGER;
a := 10;
FOR a IN 0 TO 7 LOOP
b := a;
END LOOP;
-- после выполнения цикла b = 7, a = 10
 присвоенные в теле цикла значения переменных могут
быть исходными данными для очередной итерации
 при присваивании в теле цикла значения сигналов
используются «старые» значения, если только тело цикла
не содержит операторов ожидания
Циклы с указанием
количества повторений FOR
-- Декларация перечислимого типа system_state
TYPE system_state IS (INITIAL, IDLE, ACTIVE, ERROR);
FOR state IN system_state LOOP
... -- цикл будет иметь 4 итерации
END LOOP;
-- Недопустимое указание диапазона, вместо TO
-- должно быть DOWNTO
FOR i IN 10 TO 1 LOOP
... -- цикл не выполнится ни разу
END LOOP;
SIGNAL data_bus: STD_LOGIC_VECTOR(N-1 DOWNTO 0);
FOR item IN data_bus'range LOOP
... -- используем атрибуты массивов
END LOOP;
Оператор NULL
 при описании поведения моделей устройств иногда
возникает ситуация, когда для какого-либо из его
состояний не определено никаких действий
 Начальные этапы разработки, когда структура и
поведение устройства еще детально не проработаны
[label:] NULL;
метка
CASE opcode IS
WHEN ADD => Acc := Acc + operand;
WHEN MUL => Acc := Acc * operand;
WHEN SUBTRACT => Acc := Acc - operand;
WHEN NOP => NULL;
END CASE;
Оператор ожидания WAIT
 Используется в теле параллельного оператора PROCESS
 В теле процесса может быть несколько операторов WAIT
 Использование оператора WAIT приводит к приостановке
выполнения параллельного оператора на некоторое время
или до возникновения некоторого условия
WAIT [ON signal_name {,…}]
[UNTIL boolean_expression]
[FOR time_expression];
Список сигналов, на которые
будет реагировать процесс
Логическое выражение, которое
должно иметь значение TRUE
Позволяет определить интервал времени, на который
процесс приостанавливается в модельном времени
Оператор ожидания WAIT
WAIT ON signal_name
UNTIL boolean_expression;
Логическое выражение, стоящее в UNTIL, проверяется только
при условии, что произошло изменение какого-либо сигнала,
стоящего в списке секции ON
WAIT ON signal_name
FOR time_expression;
WAIT UNTIL boolean_expression
FOR time_expression;
Процесс возобновит исполнение, как только условие,
заданное в одной из секций ON, UNTIL будет выполнено
1
2
Оператор ожидания WAIT
Условие секции UNTIL проверяется только при изменении
одного из сигналов, указанных в секции ON
3 WAIT ON signal_name
UNTIL boolean_expression
FOR time_expression;
4 WAIT Остановка выполнения процесса до конца
моделирования
bin_comp: PROCESS
BEGIN
WAIT ON A, B UNTIL clk = '1' FOR 10 ns;
...
WAIT FOR 50 ns;
END PROCESS;
Оператор ожидания WAIT
WAIT FOR 50 ns;
--
WAIT UNTIL enable = '1';
-- Процесс формирования (генерации) синхроимпульсов
-- для модуля тестирования (test-bench)
PROCESS
BEGIN
clk <= '0';
LOOP
clk <= NOT clk;
EXIT WHEN end_of_simulation;
WAIT FOR 10 ns;
END LOOP;
WAIT;
END PROCESS;
Оператор ожидания WAIT
CONSTANT period : TIME := 20 ns;
SIGNAL clk : STD_LOGIC;
...
clock_driver : PROCESS
BEGIN
clk <= '0';
WAIT FOR period / 2;
clk <= '1';
WAIT FOR period / 2;
END PROCESS clock_driver;
20 ns
ASSERT boolean_expression[REPORT expression]
[SEVERITY expression]
Оператор проверки ASSERT
 Не входит в синтезируемое подмножество операторов
 Используютдлявыявленияспецифическихситуаций,которые
могутвозникатьнаэтапекомпиляцииивпроцессемоделирования
Проверяется истинность
(TRUE) условия. Если
TRUE, тогда «Все ОК»
Выдает сообщение expression,
если «Не все ОК»
(по умолчанию - “Assertion violation”)
Определяет дальнейшее
поведения процесса
моделирования, если
«Не все ОК»
(по умолчанию - ERROR)
NOTE - просто информативное сообщение
WARNING - произошла внештатная ситуация, но
процесс моделирования может быть продолжен
ERROR - свидетельствует об ошибке, дальнейший
процесс моделирования может не иметь значения
FAILURE - нарушении целостности, и процесс
моделирования должен быть остановлен немедленно
Оператор проверки ASSERT
 Константы «уровня важности» определены в библиотеке
STD пакета STANDARD
TYPE severity_level IS (NOTE, WARNING, ERROR, FAILURE);
ASSERT a = b
REPORT "a and b are not equal" SEVERITY WARNING;
ASSERT op_code = "0000"
REPORT "Illegal Code of Operation" SEVERITY FAILURE;
Как сделать вывод в «консоль» значений чисел
a и b? (см. атрибуты)
NOTE, WARNING, ERROR, FAILURE
Оператор сбора информации REPORT
 Выполняется безусловно
 Указанное сообщение (expression) выводится на терминал
REPORT expression [SEVERITY expression];
TYPE int_arr IS ARRAY (natural RANGE <>) OF integer;
VARIABLE data_arr: int_arr(7 DOWNTO 0);
FOR i IN data_arr'range LOOP
REPORT "Index value = " & integer'image(i)
& " element value = "
& integer'image(data_arr(i))
SEVERITY NOTE;
...
END LOOP;
Statements in VHDL - Sequential Statements

More Related Content

PPTX
Subprograms in VHDL, Functions in VHDL
PPTX
Subprograms in VHDL, Procedures in VHDL
PPTX
Statements in VHDL - Concurrent Statements
PPTX
Structural project description in VHDL
PPTX
Basic principles of projects description in VHDL - ENTITY, ARCHITECTURE, LIBR...
PPTX
File input/output in VHDL
PPT
02 if for
PPTX
Attributes in VHDL
Subprograms in VHDL, Functions in VHDL
Subprograms in VHDL, Procedures in VHDL
Statements in VHDL - Concurrent Statements
Structural project description in VHDL
Basic principles of projects description in VHDL - ENTITY, ARCHITECTURE, LIBR...
File input/output in VHDL
02 if for
Attributes in VHDL

What's hot (20)

PDF
апкс 2011 05_verilog
PPT
Операторы в Turbo Pascal
PPT
практика 4
PPTX
Урок 8. Введение в редукцию графов
PPT
22 pascal urok_6
PPT
язык програмирования
PPT
10 10 pascal_urok_
PPT
подпрограммы в языке программирования паскаль
PPTX
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
PPT
4 4 pascal_urok_1
PDF
Типы данных (продолжение). Операторы. Стандартные библиотеки
PPTX
Подпрограммы
PDF
апкс 2011 02_verilog
PDF
TMPA-2013 Vert Krikun: Finding Defects in C and C++ Pointers Using Static Ana...
PPTX
Cpp/cli types
PPTX
функции в Java script
PDF
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
PDF
апкс 2011 04_verilog
PPTX
этапы написания программы
PDF
C# Desktop. Занятие 16.
апкс 2011 05_verilog
Операторы в Turbo Pascal
практика 4
Урок 8. Введение в редукцию графов
22 pascal urok_6
язык програмирования
10 10 pascal_urok_
подпрограммы в языке программирования паскаль
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
4 4 pascal_urok_1
Типы данных (продолжение). Операторы. Стандартные библиотеки
Подпрограммы
апкс 2011 02_verilog
TMPA-2013 Vert Krikun: Finding Defects in C and C++ Pointers Using Static Ana...
Cpp/cli types
функции в Java script
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
апкс 2011 04_verilog
этапы написания программы
C# Desktop. Занятие 16.
Ad

Similar to Statements in VHDL - Sequential Statements (20)

PDF
моап 2011 04
PPT
20100927 28 reqformalization-kuliamin
PPT
цикл в блог
PPTX
Программирование циклов
PPT
WhileRepeat
PPT
While
PPT
02 if for
PPTX
ветвление.условный оператор.циклы
PDF
апкс 2011 04_verilog_продолж
PPT
алгоритмическая структура «цикл»
PPTX
цикл в блог
PDF
331 информатика. 8кл. миняйлова, вербовиков и др-минск, 2010 -189с
PPTX
Урок 7. Интерпретация и компиляция функциональных программ.
PPT
условные и безусловные операторы
PPT
Презентация на тему: Управляющие операторы языков программирования C, C++, VB...
PPTX
Базовые операторы Java
PPT
циклы
PDF
Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...
PPT
паскаль 10кл 14
моап 2011 04
20100927 28 reqformalization-kuliamin
цикл в блог
Программирование циклов
WhileRepeat
While
02 if for
ветвление.условный оператор.циклы
апкс 2011 04_verilog_продолж
алгоритмическая структура «цикл»
цикл в блог
331 информатика. 8кл. миняйлова, вербовиков и др-минск, 2010 -189с
Урок 7. Интерпретация и компиляция функциональных программ.
условные и безусловные операторы
Презентация на тему: Управляющие операторы языков программирования C, C++, VB...
Базовые операторы Java
циклы
Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...
паскаль 10кл 14
Ad

Statements in VHDL - Sequential Statements

  • 1. Куланов В.А. [v.kulanov@csn.khai.edu] Операторы языка описания аппаратуры VHDL. Последовательные операторы. «Технологии проектирования компьютерных систем»
  • 3. Последовательные операторы  выполняются друг за другом в порядке их записи в исходном коде  традиционные для большинства языков программирования высокого уровня  используются только внутри составного параллельного оператора PROCESS или внутри подпрограмм (функции и процедуры)
  • 4. Параллельные операторы  инициируется по событийному принципу, т. е. они исполняются тогда, когда посредством реализации других операторов программы создаются условия для их исполнения  представляют части алгоритма, которые в реальной системе могут исполняться одновременно  бывают простыми и составными  используются только в архитектурном теле (ARCHITECTURE) или внутри составного оператора BLOCK
  • 5. Операторы в языке VHDL ARCHITECTURE identifier OF entity_name IS -- объявление типов, подтипов, сигналов и т.д. BEGIN END ARCHITECTURE identifier; Простой параллельный оператор (WHEN) Простой параллельный оператор (<=) Составной параллельный оператор (PROCESS) Последовательный оператор 1 Последовательный оператор 2 Последовательный оператор 3
  • 6. Операторы в языке VHDL PROCEDURE procedure_name (parameter_list) IS -- объявление типов, подтипов, сигналов и т.д. BEGIN END procedure_name; Последовательный оператор 1 Последовательный оператор 2 Последовательный оператор 3 Простой параллельный оператор (WHEN) Простой параллельный оператор (<=)
  • 7. Последовательные операторы  Оператор WAIT  Последовательный оператор ASSERT  Оператор REPORT  Последовательный оператор присваивания значения сигналу (<=)  Оператор присваивания значения переменной (:=)  Последовательный вызов процедуры  Условный оператор IF  Оператор выбора CASE  Оператор цикла LOOP  Оператор NEXT  Оператор EXIT  Оператор RETURN  Оператор NULL
  • 8. Оператор присваивания значения переменной (:=) [label:] variable_name := expression; inc: count := count + 2; data_vector := low_bytes & X"FF"; d_bus := B"1111_1111"; TMP := TMP XOR X(j); msg := integer'image(count) -- В правой части выражения используется функция shift shift_val := shift(data_bus, left); метка
  • 9. Последовательный оператор присваивания значения сигналу (<=) signal_name <= [delay_mechanism]waveform; имя сигнала тип задержки  TRANSPORT  INERTIAL (по умолчанию)  механизм инерционной задержки позволяет фильтровать входные сигналы, изменение которых происходит «слишком быстро»  транспортная задержка чаще используется на этапе функциональной отладки проекта TRANSPORT | [REJECT time_expression] INERTIAL значение (транзакции)
  • 10. Последовательный оператор присваивания значения сигналу (<=) flag_z <= '1'; -- Эквивалентно примеру выше flag_z <= INERTIAL '1' AFTER 0 ns; data_bus <= B"0000_1111"; -- Эквивалентно примеру выше data_bus <= INERTIAL X"0F" AFTER 0 ns; flag_o <= TRANSPORT '1' AFTER 1 ns; e_out <= "0000" AFTER 2 ns, "1111" AFTER 7 ns; -- Инициализация матрицы N x M значением '1' matrix <= (OTHERS => (OTHERS => '1'));
  • 11. Последовательный оператор присваивания значения сигналу (<=) Z1 <= TRANSPORT X AFTER 10 ns; -– транспортная задержка Z2 <= X AFTER 10 ns; -– инерционная задержка Z2 <= REJECT 4 ns X AFTER 10 ns; -– задержка -- с указанным интервалом фильтрации
  • 12. Условный оператор IF [if_label:] IF condition THEN {sequential_statement} {ELSIF condition THEN {sequential_statement}} [ELSE {sequential_statement}] END IF [if_label]; метка тип BOOLEAN  проверка различных условий, в зависимости от которых формируется соответствующий результат Последовательные операторы
  • 13. Условный оператор IF PROCESS(reset, clk) IS BEGIN IF reset = '1' THEN -- асинхронный сброс … ELSIF clk'event AND clk = '1' THEN … END IF; END PROCESS; IF address = X"FF00" THEN stack_overflow := '1'; -- переменная except_vector <= X"FFFA"; -- сигнал ELSE stack _overflow := '0'; except_vector <= X"0000"; END IF;
  • 14. Условный оператор IF -- check_overflow(inc) – функция с параметром inc -- в заголовке условного оператора IF step_inc: IF step /= check_overflow(inc) THEN … -- тело оператора END IF step_inc; VARIABLE z_flag : BOOLEAN; … IF z_flag THEN … -- тело оператора END IF step_inc;
  • 15. Оператор выбора CASE  определение поведения устройства (модели) в зависимости от некоторого выражения  значение этого выражения сравнивается со значениями, стоящими после ключевого слова WHEN (их тип должен совпадать)  при первом же совпадении выполняется последовательность действий sequential_statements [case_label:] CASE expression IS (WHEN (simple_expression | discrete_range | OTHERS) => {sequential_statement}) {…} END CASE [case_label]; дискретный набор значенийметка
  • 16. Оператор выбора CASE TYPE fsm_states IS (IDLE, START, STOP, PROCESSING); VARIABLE fsm: fsm_states; CASE fsm IS WHEN IDLE => flag_idle := '1'; WHEN PROCESSING => flag_processing := '1'; WHEN OTHERS => flag_idle := '0'; flag_processing := '0'; END CASE; CASE fsm IS … WHEN START | STOP => -- одинаковая flag_idle := '0'; -- последовательность flag_processing := ′0′; -- действий WHEN OTHERS => … END CASE;
  • 17. Оператор выбора CASE SUBTYPE index_mode IS INTEGER RANGE 0 TO 15; VARIABLE selector: index_mode; VARIABLE do_check: BOOLEAN := TRUE; VARIABLE data_val: STD_LOGIC_VECTOR(7 DOWNTO 0); … CASE selector IS WHEN 0 => data_val := X"00"; do_check := FALSE; WHEN 1 => data_val := X"01"; do_check := FALSE; WHEN 2 TO 5 | 9 TO 12 => data_val := X"10"; do_check := FALSE; WHEN OTHERS => data_val := X"11"; do_check := TRUE; END CASE;
  • 18. Оператор цикла FOR  простейшая форма задания [бесконечного] цикла: метка [loop_label:] LOOP {sequential_statemeny} END LOOP [loop_label];  циклы LOOP могут быть любой вложенности  бесконечные циклы не являются синтезируемыми и используются для моделирования поведения проектных решений  для ограничения количества итераций цикла используются дополнительные операторы
  • 19. Оператор прерывания текущей итерации цикла NEXT  если метка [loop_label] не определена, то прерывается текущее выполнение того цикла, в котором непосредственно указан оператор  указание метки цикла позволяет прерывать текущую итерацию сразу нескольких вложенных друг в друга циклов  логическое выражение boolean_expression может дополнительно определять условия прерывания выполнения текущей итерации: • если условие не задано, то прерывание выполняется безусловно NEXT [loop_label] [WHEN boolean_expression] метка логическое выражение
  • 20. Оператор завершения цикла EXIT  если метка [loop_label] не определена, то завершается выполнение того цикла, в котором непосредственно указан оператор  указание метки цикла позволяет завершить выполнение нескольких вложенных друг в друга циклов  логическое выражение boolean_expression может дополнительно определять условия завершения (выхода из) цикла: • если условие не задано, то завершение цикла выполняется безусловно EXIT [loop_label] [WHEN boolean_expression] метка логическое выражение
  • 21. Операторы NEXT/EXIT ... outer: LOOP ... inner : LOOP -- выход из внутреннего и внешнего циклов EXIT outer WHEN condition_1 -- выход из внутреннего цикла EXIT WHEN condition_2; END LOOP inner; ... -- прерывание текущей итерации внешнего цикла NEXT WHEN condition_3; END LOOP outer; ... ...
  • 22. Циклы с предусловием WHILE [loop_label:] WHILE condition LOOP {sequential_statement} END LOOP [loop_label];  предполагается, что в процессе выполнения цикла объекты, входящие в условие (condition) заголовка, меняют свое значение в теле цикла  если перед началом очередной итерации условие истинно, то она выполняется, в противном случае цикл завершается L3: WHILE i <= 8 LOOP output_X(i) <= onput_X(i+8) AFTER 5 ns; i := i + 1; END LOOP L3; метка условие
  • 23. Объект-идентификатор  может быть любого дискретного типа  не требует предварительного описания  является определенным только на время выполнения цикла  имя может совпадать с именем другого объекта в модели  нельзя изменять значение в теле цикла Циклы с указанием количества повторений FOR  получил наибольшее распространение при реализации «синтезируемых» проектных решений (количество итераций в цикле должно быть определено заранее) [label:] FOR identifier IN (expr TO|DOWNTO expr) LOOP {sequential_statement} END LOOP [label]; метка
  • 24. Циклы с указанием количества повторений FOR L4: FOR cnt_val IN 1 TO 8 LOOP output_X(cnt_val) := input_X(cnt_val + 8); cnt_val := cnt_val + 1; -- запрещено изменять END LOOP L4; VARIABLE a, b: INTEGER; a := 10; FOR a IN 0 TO 7 LOOP b := a; END LOOP; -- после выполнения цикла b = 7, a = 10  присвоенные в теле цикла значения переменных могут быть исходными данными для очередной итерации  при присваивании в теле цикла значения сигналов используются «старые» значения, если только тело цикла не содержит операторов ожидания
  • 25. Циклы с указанием количества повторений FOR -- Декларация перечислимого типа system_state TYPE system_state IS (INITIAL, IDLE, ACTIVE, ERROR); FOR state IN system_state LOOP ... -- цикл будет иметь 4 итерации END LOOP; -- Недопустимое указание диапазона, вместо TO -- должно быть DOWNTO FOR i IN 10 TO 1 LOOP ... -- цикл не выполнится ни разу END LOOP; SIGNAL data_bus: STD_LOGIC_VECTOR(N-1 DOWNTO 0); FOR item IN data_bus'range LOOP ... -- используем атрибуты массивов END LOOP;
  • 26. Оператор NULL  при описании поведения моделей устройств иногда возникает ситуация, когда для какого-либо из его состояний не определено никаких действий  Начальные этапы разработки, когда структура и поведение устройства еще детально не проработаны [label:] NULL; метка CASE opcode IS WHEN ADD => Acc := Acc + operand; WHEN MUL => Acc := Acc * operand; WHEN SUBTRACT => Acc := Acc - operand; WHEN NOP => NULL; END CASE;
  • 27. Оператор ожидания WAIT  Используется в теле параллельного оператора PROCESS  В теле процесса может быть несколько операторов WAIT  Использование оператора WAIT приводит к приостановке выполнения параллельного оператора на некоторое время или до возникновения некоторого условия WAIT [ON signal_name {,…}] [UNTIL boolean_expression] [FOR time_expression]; Список сигналов, на которые будет реагировать процесс Логическое выражение, которое должно иметь значение TRUE Позволяет определить интервал времени, на который процесс приостанавливается в модельном времени
  • 28. Оператор ожидания WAIT WAIT ON signal_name UNTIL boolean_expression; Логическое выражение, стоящее в UNTIL, проверяется только при условии, что произошло изменение какого-либо сигнала, стоящего в списке секции ON WAIT ON signal_name FOR time_expression; WAIT UNTIL boolean_expression FOR time_expression; Процесс возобновит исполнение, как только условие, заданное в одной из секций ON, UNTIL будет выполнено 1 2
  • 29. Оператор ожидания WAIT Условие секции UNTIL проверяется только при изменении одного из сигналов, указанных в секции ON 3 WAIT ON signal_name UNTIL boolean_expression FOR time_expression; 4 WAIT Остановка выполнения процесса до конца моделирования bin_comp: PROCESS BEGIN WAIT ON A, B UNTIL clk = '1' FOR 10 ns; ... WAIT FOR 50 ns; END PROCESS;
  • 30. Оператор ожидания WAIT WAIT FOR 50 ns; -- WAIT UNTIL enable = '1'; -- Процесс формирования (генерации) синхроимпульсов -- для модуля тестирования (test-bench) PROCESS BEGIN clk <= '0'; LOOP clk <= NOT clk; EXIT WHEN end_of_simulation; WAIT FOR 10 ns; END LOOP; WAIT; END PROCESS;
  • 31. Оператор ожидания WAIT CONSTANT period : TIME := 20 ns; SIGNAL clk : STD_LOGIC; ... clock_driver : PROCESS BEGIN clk <= '0'; WAIT FOR period / 2; clk <= '1'; WAIT FOR period / 2; END PROCESS clock_driver; 20 ns
  • 32. ASSERT boolean_expression[REPORT expression] [SEVERITY expression] Оператор проверки ASSERT  Не входит в синтезируемое подмножество операторов  Используютдлявыявленияспецифическихситуаций,которые могутвозникатьнаэтапекомпиляцииивпроцессемоделирования Проверяется истинность (TRUE) условия. Если TRUE, тогда «Все ОК» Выдает сообщение expression, если «Не все ОК» (по умолчанию - “Assertion violation”) Определяет дальнейшее поведения процесса моделирования, если «Не все ОК» (по умолчанию - ERROR) NOTE - просто информативное сообщение WARNING - произошла внештатная ситуация, но процесс моделирования может быть продолжен ERROR - свидетельствует об ошибке, дальнейший процесс моделирования может не иметь значения FAILURE - нарушении целостности, и процесс моделирования должен быть остановлен немедленно
  • 33. Оператор проверки ASSERT  Константы «уровня важности» определены в библиотеке STD пакета STANDARD TYPE severity_level IS (NOTE, WARNING, ERROR, FAILURE); ASSERT a = b REPORT "a and b are not equal" SEVERITY WARNING; ASSERT op_code = "0000" REPORT "Illegal Code of Operation" SEVERITY FAILURE; Как сделать вывод в «консоль» значений чисел a и b? (см. атрибуты)
  • 34. NOTE, WARNING, ERROR, FAILURE Оператор сбора информации REPORT  Выполняется безусловно  Указанное сообщение (expression) выводится на терминал REPORT expression [SEVERITY expression]; TYPE int_arr IS ARRAY (natural RANGE <>) OF integer; VARIABLE data_arr: int_arr(7 DOWNTO 0); FOR i IN data_arr'range LOOP REPORT "Index value = " & integer'image(i) & " element value = " & integer'image(data_arr(i)) SEVERITY NOTE; ... END LOOP;