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

What's hot

апкс 2011 05_verilog
апкс 2011 05_verilogапкс 2011 05_verilog
апкс 2011 05_verilogIrina Hahanova
 
Операторы в Turbo Pascal
Операторы в Turbo PascalОператоры в Turbo Pascal
Операторы в Turbo PascalOlgaDask
 
практика 4
практика 4практика 4
практика 4student_kai
 
Урок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графовУрок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графов
Система дистанционного обучения MyDLS
 
22 pascal urok_6
22 pascal urok_622 pascal urok_6
22 pascal urok_6Ann Eres
 
язык програмирования
язык програмированияязык програмирования
язык програмирования
Olegmingalev1997
 
10 10 pascal_urok_
10 10 pascal_urok_10 10 pascal_urok_
10 10 pascal_urok_Ann Eres
 
подпрограммы в языке программирования паскаль
подпрограммы в языке программирования паскальподпрограммы в языке программирования паскаль
подпрограммы в языке программирования паскаль
Artem German
 
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs ReflectionRoslyn API: SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
Denis Tsvettsih
 
4 4 pascal_urok_1
4 4 pascal_urok_14 4 pascal_urok_1
4 4 pascal_urok_1Ann Eres
 
Типы данных (продолжение). Операторы. Стандартные библиотеки
Типы данных (продолжение). Операторы. Стандартные библиотекиТипы данных (продолжение). Операторы. Стандартные библиотеки
Типы данных (продолжение). Операторы. Стандартные библиотеки
Ihor Porotikov
 
Подпрограммы
ПодпрограммыПодпрограммы
Подпрограммы
Colegiul de Industrie Usoara
 
апкс 2011 02_verilog
апкс 2011 02_verilogапкс 2011 02_verilog
апкс 2011 02_verilogIrina Hahanova
 
TMPA-2013 Vert Krikun: Finding Defects in C and C++ Pointers Using Static Ana...
TMPA-2013 Vert Krikun: Finding Defects in C and C++ Pointers Using Static Ana...TMPA-2013 Vert Krikun: Finding Defects in C and C++ Pointers Using Static Ana...
TMPA-2013 Vert Krikun: Finding Defects in C and C++ Pointers Using Static Ana...
Iosif Itkin
 
Cpp/cli types
Cpp/cli typesCpp/cli types
Cpp/cli typesmcroitor
 
функции в Java script
функции в Java scriptфункции в Java script
функции в Java script
Viktor Andreev
 
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
OdessaFrontend
 
апкс 2011 04_verilog
апкс 2011 04_verilogапкс 2011 04_verilog
апкс 2011 04_verilogIrina Hahanova
 
этапы написания программы
этапы написания программыэтапы написания программы
этапы написания программыИрина Чернова
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.
Igor Shkulipa
 

What's hot (20)

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

Similar to Statements in VHDL - Sequential Statements

Использование хранимых процедур в MySQL (Константин Осипов)
Использование хранимых процедур в MySQL (Константин Осипов)Использование хранимых процедур в MySQL (Константин Осипов)
Использование хранимых процедур в MySQL (Константин Осипов)Ontico
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
Platonov Sergey
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
Tech Talks @NSU
 
Базовые операторы Java
Базовые операторы JavaБазовые операторы Java
Базовые операторы Javametaform
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знания
Yandex
 
Михаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxМихаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajax
Yandex
 
javascript_part1
javascript_part1javascript_part1
javascript_part1sovest
 
javascript
javascriptjavascript
javascriptsovest
 
ES6. Генераторы
ES6. ГенераторыES6. Генераторы
ES6. Генераторы
oelifantiev
 
C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.
Igor Shkulipa
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияYandex
 
Cтиль программирования
Cтиль программированияCтиль программирования
Cтиль программирования
Constantin Kichinsky
 
Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2
Oleksii Okhrymenko
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
Oleksii Okhrymenko
 
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Ontico
 

Similar to Statements in VHDL - Sequential Statements (20)

Использование хранимых процедур в MySQL (Константин Осипов)
Использование хранимых процедур в MySQL (Константин Осипов)Использование хранимых процедур в MySQL (Константин Осипов)
Использование хранимых процедур в MySQL (Константин Осипов)
 
Step 2
Step 2Step 2
Step 2
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
Lecture 5
Lecture 5Lecture 5
Lecture 5
 
Lecture 8
Lecture 8Lecture 8
Lecture 8
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
 
Базовые операторы Java
Базовые операторы JavaБазовые операторы Java
Базовые операторы Java
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знания
 
Михаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxМихаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajax
 
javascript_part1
javascript_part1javascript_part1
javascript_part1
 
javascript
javascriptjavascript
javascript
 
ES6. Генераторы
ES6. ГенераторыES6. Генераторы
ES6. Генераторы
 
C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знания
 
Cтиль программирования
Cтиль программированияCтиль программирования
Cтиль программирования
 
Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
 
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
 

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;