У вас древний проект? Все зовут его «Legacy», а вас «неудачник»? Возможно они даже смеются над вами.
Давайте взглянем на ситуацию с другого ракурса. Все (все, Карл!) успешные проекты рано или поздно превращаются в Legacy-проекты.
Я затрону тему Legacy не просто как явление, а как возможность быть постоянно в тренде, прослыть супер-спецом (даже если ты знаешь всего два фреймворка), сделать карьеру, как делать, то что ты хочешь, а не то что тебя просят. Ладно, ладно, я наврал про два фреймворка, но все остальное чистая правда. Я покажу, что вы можете творить, имея правильный подход к Legacy коду.
Суть в том, что Legacy — это не грустно/уныло/немодно, это просто/клево/весело, если с умом подойти к задаче!
У вас древний проект? Все зовут его «Legacy», а вас «неудачник»? Возможно они даже смеются над вами.
Давайте взглянем на ситуацию с другого ракурса. Все (все, Карл!) успешные проекты рано или поздно превращаются в Legacy-проекты.
Я затрону тему Legacy не просто как явление, а как возможность быть постоянно в тренде, прослыть супер-спецом (даже если ты знаешь всего два фреймворка), сделать карьеру, как делать, то что ты хочешь, а не то что тебя просят. Ладно, ладно, я наврал про два фреймворка, но все остальное чистая правда. Я покажу, что вы можете творить, имея правильный подход к Legacy коду.
Суть в том, что Legacy — это не грустно/уныло/немодно, это просто/клево/весело, если с умом подойти к задаче!
OOP in JavaScript - Presentation by Eugene KaloshaRostyslav Siryk
Евгений Калоша рассказывает о том, как выглядит объектно-ориентированное программирование в JavaScript. Его видение сформировано также под влиянием многолетнего опыта разработки на Flex, PHP и Java.
Запись доклада:
http://flash-ripper.com/oop-in-javascript
TMPA-2013 Anureyev: On the Road to Technology of Developing the Means of Dedu...Iosif Itkin
TMPA-2013 Conference in Kostroma
Anureyev, I., A.P.Ershov Institute of Informatics Systems
On the Road to Technology of Developing the Means of Deductive Program Verification
"Вингардиум Левиоса”. Или основы декларативной магии (Матвеенко Сергей)IT-Доминанта
Матвеенко Сергей - Ведущий разработчик / Positive Technologies / Россия, Санкт-Петербург
Декларативное программирование на Python, метаклассы, YAML и прочие неприятности.
Популярные применения. Подводные камни.
http://www.it-sobytie.ru/events/2040
Statements in VHDL - Sequential Statementsvitaliykulanov
The lecture is about statements in VHDL - classification and principles of work. Sequential statements (operators) in VHDL: principles, operators, examples
OOP in JavaScript - Presentation by Eugene KaloshaRostyslav Siryk
Евгений Калоша рассказывает о том, как выглядит объектно-ориентированное программирование в JavaScript. Его видение сформировано также под влиянием многолетнего опыта разработки на Flex, PHP и Java.
Запись доклада:
http://flash-ripper.com/oop-in-javascript
TMPA-2013 Anureyev: On the Road to Technology of Developing the Means of Dedu...Iosif Itkin
TMPA-2013 Conference in Kostroma
Anureyev, I., A.P.Ershov Institute of Informatics Systems
On the Road to Technology of Developing the Means of Deductive Program Verification
"Вингардиум Левиоса”. Или основы декларативной магии (Матвеенко Сергей)IT-Доминанта
Матвеенко Сергей - Ведущий разработчик / Positive Technologies / Россия, Санкт-Петербург
Декларативное программирование на Python, метаклассы, YAML и прочие неприятности.
Популярные применения. Подводные камни.
http://www.it-sobytie.ru/events/2040
Statements in VHDL - Sequential Statementsvitaliykulanov
The lecture is about statements in VHDL - classification and principles of work. Sequential statements (operators) in VHDL: principles, operators, examples
2. Что такое «тип данных»?
Тип данных (тип) — множество значений и
операций на этих значениях (IEEE Std 1320.2-1998).
Тип данных характеризует одновременно:
множество допустимых значений, которые
могут принимать данные, принадлежащие к
этому типу;
набор операций, которые можно осуществлять
над данными, принадлежащими к этому типу.
3. Типы данных в языке VHDL
Язык VHDL основан на строгой типизации данных
+ =
+ =
4. Типы данных в языке VHDL
Язык VHDL основан на строгой типизации данных
VARIABLE counter: INTEGER := 0;
VARIABLE step: INTEGER := 0;
VARIABLE offset: NATURAL := 0;
SIGNAL z_flag : BIT;
counter := counter + 1;
counter := counter + step;
counter := offset;
counter <= 5;
z_flag <= 1;
z_flag <= ‘0’;
counter := step + offset;
5. Типы данных в языке VHDL
Язык VHDL основан на строгой типизации данных
TYPE state1 IS (IDLE, ERROR, GO);
TYPE state2 IS (IDLE, ERROR, GO);
VARIABLE sys1_state, sys2_state: state1;
VARIABLE module_state: state2;
sys1_state := ERROR;
sys2_state := GO;
sys2_state := ERROR;
module_state := IDLE;
sys1_state := module_state;
6. Типы данных в языке VHDL
Предопределенные типы данных
Определены в стандартах IEEE 1076
Не требуется подключения сторонних пакетов/библиотек
• Находятся в пакете STANDARD и TEXTIO (библиотека STD),
который подключается неявно
Типы данных вводимые пользователем
Определены в пользовательских и других сторонних
пакетах/библиотеках
При использовании необходимо явно указывать
подключаемые пакеты/библиотеки
Обязательно должны быть известны на этапе декларации
объектов языка (переменных, сигналов, констант и т.д.)
8. Численные типы данных
INTEGER
целочисленный тип данных
{-231+1, +231-1} (-2 147 483 647 до 2 147 483 647)
REAL
действительный тип данных
{-238, +238}
CONSTANT PI : REAL := 3.14159;
CONSTANT HALF_PI : REAL := Pi/2.0;
CONSTANT N, N5 : INTEGER := 5;
VARIABLE count : INTEGER := 0;
VARIABLE flag : INTEGER := 1.5;
9. Численные типы данных
Арифметические операции
«+» – сложение или повторение;
«-» – вычитание или инверсия;
«*» - умножение;
«/» - деление;
mod – число по модулю (5 mod 3 = 2);
rem – остаток от деления;
abs – модуль (абсолютное значении числа);
** - возведение в степень.
Операции арифметического отношения
=, /=, <, <=, >=, >, которые дают результат типа BOOLEAN
CONSTANT DATA_WIDTH: NATURAL := 8;
VARIABLE address_width: NATURAL := 2**DATA_WIDTH;
10. Физические типы данных
TYPE TIME IS RANGE -2147483647 TO 2147483647
UNITS
fs; -- femtosecond
ps = 1000 fs; -- picosecond
ns = 1000 ps; -- nanosecond
us = 1000 ns; -- microsecond
ms = 1000 us; -- millisecond
sec = 1000 ms; -- second
min = 60 sec; -- minute
hr = 60 min; -- hour
END UNITS;
представляется целым числом, единица которого имеет вес
единицы измерения некоторой физической величины
перечислимый тип данных
могут задаваться пользователями
предопределенный тип TIME
11. Перечислимые типы данных
BIT
перечислимый тип данных
{' 1', ' 0 '}
Логические операции
not – инверсия;
or – операция ИЛИ;
nor – операция ИЛИ-НЕ;
and – операция И;
nand – операция И-НЕ;
xor – неравнозначность; (VHDL`87 не определены)
xnor – равнозначность; (VHDL`87 не определены)
Операции определены по правилам положительной
логики (a AND b дает значение '1', только если оба члена
выражения равны '1' и т.д.)
TYPE bit IS ('0', '1');
SIGNAL x,y,z: BIT;
x <= '0';
y <= '1';
z <= x and y;
12. Перечислимые типы данных
BOOLEAN
перечислимый тип данных
{TRUE, FALSE}
Логические операции
not – инверсия;
or – операция ИЛИ;
nor – операция ИЛИ-НЕ;
and – операция И;
nand – операция И-НЕ;
xor – неравнозначность; (VHDL`87 не определены)
xnor – равнозначность; (VHDL`87 не определены)
FALSE AND '1';
TYPE boolean IS (FALSE, TRUE);
SIGNAL x,y,z: BOOLEAN;
x <= FALSE;
y <= TRUE;
z <= x and y;
13. Перечислимые типы данных
CHARACTER
перечислимый тип данных
объединяет все символы, определенные в используемой
операционной системе – буквы, цифры, специальные
символы (VHDL`87 только первые 128 символов ASCII)
В тексте программы символьная константа записывается как
стандартный символ, заключенный в одинарные кавычки ('a', '
' b', ';' и т.д.)
Поддерживают операцию конкатенации (&)
Символы '0' и '1' имеют двойное назначение – и как символ,
и как логическое значение. В каждом конкретном случае тип
определяется исходя из контекста.
14. Перечислимые типы данных
SEVERITY_LEVEL
используется только в операторе ASSERT
определяет уровни «критичности» ситуаций, возникающих в
процессе моделирования системы
TYPE SEVERITY_LEVEL IS (
NOTE, -- just report
WARNING, -- warning and continue simulation
ERROR, -- forces simulation to stop
FAILURE -- stop simulation
);
ASSERT i < 5 REPORT
"Unexpected value, i = " & INTEGER'IMAGE(i);
15. Перечислимые типы данных
FILE_OPEN_STATUS
Определяет наборы возможных значений при работе с файлами
TYPE FILE_OPEN_STATUS IS (
OPEN_OK, -- File open was successful.
STATUS_ERROR, -- File object was already open.
NAME_ERROR, -- External file not found or
-- inaccessible.
MODE_ERROR -- Could not open file with
-- requested access mode.
);
VARIABLE open_status : FILE_OPEN_STATUS;
...
IF open_status /= OPEN_OK THEN
...
END If;
16. Перечислимые типы данных
FILE_OPEN_KIND
Определяет набор допустимых значений множества режимов
открытия файлов
TYPE FILE_OPEN_KIND IS (
READ_MODE, -- Resulting access mode is read-only.
WRITE_MODE, -- Resulting access mode is write-only.
APPEND_MODE -- Resulting access mode is write-only;
-- information is appended to the end
-- of the existing file.
);
PROCEDURE file_open (
FILE f : file_type;
external_name : IN STRING;
open_kind : IN FILE_OPEN_KIND := READ_MODE
);
17. Перечислимые типы данных
STD_ULOGIC, STD_LOGIC
Стандартом IEEE 1164 определена замена типа BIT на более
«гибкий» тип STD_LOGIC (в том числе позволяет уменьшить
количество ошибок моделирования)
Тип STD_LOGIC является разрешимым (resolved) подтипом
типа STD_ULOGIC
Не являются предопределенными типами данных, а требуют
явного подключения в проект пакета std_logic_1164
STD_ULOGIC
Unresolved
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
Библиотека Пакет
18. Перечислимые типы данных
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
);
Понятия «слабых» (weak)
сигналов соответствуют
источникам логических
уровней с повышенным
сопротивлением по
сравнению с обычными
логическими элементами
Для синтеза логических схем используются только четыре:
• '0' – логический "0"
• '1' – логическая "1"
• 'Z' – «третье» состояние
• '–' – не подключен
19. Перечислимые типы данных
Time step 0
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
);
20. Перечислимые типы данных
Time step 0
1 U U U
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
);
21. Перечислимые типы данных
Time step 1
0 1 U U
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
);
22. Перечислимые типы данных
Time step 2
1 0 1 U
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
);
23. Перечислимые типы данных
Time step 3
1 1 0 1
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
);
24. Перечислимые типы данных
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
);
Time step 3
1 1 0 1
0 1
X
25. Перечислимые типы данных
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
);
Time step 3
1 1 0 1
0 1
X
1
0
26. Перечислимые типы данных
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
);
Time step 4
1 1 1 X
0 0
X
1
X
27. Перечислимые типы данных
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
);
Time step 0
‘1’ Подтягивающий резистор
28. Перечислимые типы данных
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
);
Time step 0
0 U H U
‘1’ Подтягивающий резистор
29. Перечислимые типы данных
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
);
Time step 1
1 0 H 1
‘1’ Подтягивающий резистор
30. Перечислимые типы данных
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
);
Time step 2
0 1 0 1
‘1’
Resolution(H, 0) = 0
Подтягивающий резистор
31. Перечислимые типы данных
STD_ULOGIC, STD_LOGIC
Операции арифметического отношения
=, /=, <, <=, >=, >, которые дают результат типа BOOLEAN
Логические операции
AND, OR, XOR, …
Операция конкатенации (объединения) - &
q <= in_x WHEN sel = '1' ELSE 'Z';
SIGNAL s1, s2 : STD_LOGIC;
VARIABLE v1, v2 : STD_LOGIC;
...
s1 <= '0'; v1 := '1'; s2 <= 'X';
WAIT FOR 10 ns;
s2 <= s1 AND v1; -- '0'
v2 := s1 OR v1; -- '1'
32. Скалярные типы данных, вводимые
пользователем
Способы задания скалярных
типов данных
Диапазоном
(численные типы)
Списком значений
(перечислимы типы)
TYPE name IS type_definition;
Синтаксис в общем виде:
имя типа задание типа
33. Скалярные типы данных, вводимые
пользователем
Задание типа списком значений:
TYPE name IS (value1, value2, …, value_n);
TYPE FSM_states IS (START, STOP, IDLE);
TYPE digits IS ('1', '2', '3', '4', '5');
TYPE LED_lights IS (RED, GREEN, BLUE);
Примеры:
VARIABLE led1, led2 : LED_lights := RED;
…
led1 := BLUE;
led2 := YELLOW;
led2 := led1;
-- недопустимое значение
-- led1 и led2 -> BLUE
34. Скалярные типы данных, вводимые
пользователем
Задание типа диапазоном значений:
TYPE name IS RANGE expression (TO|DOWNTO) expression;
TYPE unsigned_short IS RANGE 0 TO 255;
TYPE data IS RANGE -2**(n-1)+1 to 2**(n-1)-1;
TYPE levels IS RANGE -10.0 TO 10.0;
TYPE wrong_range IS RANGE 15 TO 10; -- DOWNTO
…
VARIABLE curr_level : levels := 0;
CONSTANT FIXED_DATA : data := 10.0;
VARIABLE: a, b, c : unsigned_short;
c := a + b; -- ‘0’
a := 200; b := 100;
c := a + b;
Примеры:
Value 300 for c is out of range 0 to 255.
35. Подтипы
Объекты, отнесенные к подтипу, сохраняют совместимость с
данными базового типа, на основе которого был создан
подтип
В общем случае подтип ограничивает диапазон допустимых
значений базового типа
Определен такой же набор допустимых операций, как и для
базового типа
Для подтипа могут быть введены дополнительные,
свойственные только ему, функции преобразования
SUBTYPE name_of_subtype IS name_of_base_subtype RANGE
simple_expression (TO|DOWNTO) simple_exression;
Имя подтипа Имя базового типа
Диапазон значений подтипа
36. Подтипы
SUBTYPE short IS INTEGER RANGE 0 TO 255;
SUBTYPE word IS STD_LOGIC_VECTOR(31 DOWNTO 0);
TYPE FSM_states IS (START, RUN, STOP, IDLE, ERROR);
SUBTYPE sys_status IS FSM_states RANGE START TO STOP;
SIGNAL reg_value: short := 128;
COSNTANT MASK: word := X"0000FFFF";
VARIABLE pipeline: sys_status;
VARIABLE worker: FSM_states;
...
pipeline := RUN;
-- совместимость между базовым типом и подтипом сохранена
worker := pipeline;
worker := IDLE;
-- ошибка в процессе выполнения, т.к. диапазон значений
pipeline := worker; -- подтипа не включает значение IDLE
-- запрещено, т.к. значение ERROR не входит в
-- диапазон значений подтипа sys_status
pipeline := ERROR;
37. Подтипы
-- 'HIGH – атрибут скалярного типа, который определяет
-- максимальное значение в типе (см. атрибуты)
SUBTYPE natural IS INTEGER RANGE 0 TO INTEGER'HIGH;
SUBTYPE positive IS INTEGER RANGE 1 TO INTEGER'HIGH;
SUBTYPE delay_length IS TIME RANGE 0 FS TO TIME'HIGH
В языке VHDL имеются предопределенные подтипы
Базовый тип и ограничение диапазона могут быть
заданы непосредственно при объявлении объекта:
VARIABLE pipeline: FSM_states RANGE START TO STOP;
SIGNAL reg_value: INTEGER RANGE 0 TO 255;
-- у подтипов тоже могут быть подтипы
VARIABLE symbol IS NATURAL RANGE 0 TO 255;
PORT(clk : IN STD_LOGIC;
cnt_out: OUT INTEGER RANGE 0 TO 9);