The lecture is about statements in VHDL - classification and principles of work. Sequential statements (operators) in VHDL: principles, operators, examples
The lecture is about structural description of projects in VHDL: component declaration, component instantiation, for...generate, if...generate statements
The lecture is about structural description of projects in VHDL: component declaration, component instantiation, for...generate, if...generate statements
Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs ReflectionDenis Tsvettsih
Презентация к докладу «Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs Reflection» с конференции .NEXT SPb 2015 (Санкт-Петербург, 5 июня 2015)
http://spb2015.dotnext.ru/#cvetkih_talk
TMPA-2013 Vert Krikun: Finding Defects in C and C++ Pointers Using Static Ana...Iosif Itkin
Vert, Т., Krikun, Т. и Glukhih, М., St. Petersburg State Polytechnic University, Clausthal Technical University
Finding Defects in C and C++ Pointers Using Static Analysis and Logical Inference
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...OdessaFrontend
Дмитрий Ховрич рассказывает как использовать строгую типизацию TypeScript и писать надёжный код в функциональном стиле. А также делится знаниями как использовать функторы и монады в ежедневной фронтенд разработке.
Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs ReflectionDenis Tsvettsih
Презентация к докладу «Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs Reflection» с конференции .NEXT SPb 2015 (Санкт-Петербург, 5 июня 2015)
http://spb2015.dotnext.ru/#cvetkih_talk
TMPA-2013 Vert Krikun: Finding Defects in C and C++ Pointers Using Static Ana...Iosif Itkin
Vert, Т., Krikun, Т. и Glukhih, М., St. Petersburg State Polytechnic University, Clausthal Technical University
Finding Defects in C and C++ Pointers Using Static Analysis and Logical Inference
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...OdessaFrontend
Дмитрий Ховрич рассказывает как использовать строгую типизацию TypeScript и писать надёжный код в функциональном стиле. А также делится знаниями как использовать функторы и монады в ежедневной фронтенд разработке.
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
В докладе будет рассказано о тех фундаментальных причинах, приводящих к неоптимальному коду в продукте, будет предложен подход, лишённый найденных недостатков.
Докладываемый подход опирается на технологию Expression Templates, которая позволяет уменьшить количество действий и объём ресурсов, которые требуются для выполнения неких промежуточных действий в процессе формирования каждой записи в журнал. Эта технология используется для уменьшения количества промежуточных операций при вычислении сложных математических выражений. Новизна докладываемого подхода в том, что тот же самый принцип, на котором основана технология Expression Templates можно применить для того, чтобы целенаправленно исключить те промежуточные действия, которые в конечном итоге приводят к неоптимальному коду.
Завершается доклад обсуждением полученного эффекта, путей возможного дальнейшего развития и возможностей применения этой же технологии в других задачах.
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU
http://techtalks.nsu.ru
Видеозапись: http://www.youtube.com/watch?v=v7uBLSm6ft8
06 октября 2015. Как приручить дракона: введение в LLVM (Дмитрий Кашицын, HDsoft)
«В этом докладе мы кратко расскажем о таком звере, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.»
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
10 июня 2015. Дмитрий Кашицын (HDsoft) дает обзор LLVM.
http://techtalks.nsu.ru
Видеозапись: https://plus.google.com/events/ctes98f7uhf19t5jlvlbk24dan4
В этом докладе мы кратко расскажем о таком звере, как LLVM, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
В лекции подробно рассмотрены тонкие моменты языка JavaScript, с которыми часто возникают основные проблемы. Наглядные примеры и рецепты помогают лучше понять его особенности.
Клиент-сайд изобилует кучей различных транспортов, и зачастую непонятно, какой взять для решения той или иной задачи. В данной лекции рассказывается об особенности каждого транспорта и области применимости.
* Почему Angular 2 такой быстрый и как его ускорить еще сильнее?
* Как работает Change Detection механизм и как им управлять?
* Зачем нам Zone.js и Функциональное Реактивное Программирование?
* Как работать с Redux и Mobx в Angular 2 и что можно от этого выиграть?
Об этом и ряде других вещей вы узнаете из этого доклада.
* Почему Angular 2 такой быстрый и как его ускорить еще сильнее?
* Как работает Change Detection механизм и как им управлять?
* Зачем нам Zone.js и Функциональное Реактивное Программирование?
* Как работать с Redux и Mobx в Angular 2 и что можно от этого выиграть?
Об этом и ряде других вещей вы узнаете из этого доклада.
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Ontico
* Почему Angular 2 такой быстрый и как его ускорить еще сильнее?
* Как работает Change Detection механизм и как им управлять?
* Зачем нам Zone.js и Функциональное Реактивное Программирование?
* Как работать с Redux и Mobx в Angular 2 и что можно от этого выиграть?
Об этом и ряде других вещей вы узнаете из этого доклада.
Similar to Statements in VHDL - Sequential Statements (20)
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;