Проектирование цифровых систем на языках описания аппаратуры/Лекция 2
- Заголовок
- Основы языка VHDL
- Автор
- Ланкевич Ю.Ю.
- Нижний колонтитул
- Проектирование цифровых систем на языках описания аппаратуры/Лекция 2
- Дополнительный нижний колонтитул
- Ланкевич Ю.Ю., 10:07, 8 сентября 2020
Слайд:Языки HDL (Hardware Description Language)
- Проблемы проектирования СБИС:
- несоответствие формы, в которой ставится задача (обычно задается поведение), и схемы проекта (сеть взаимосвязанных компонентов)
- «ручной» перевод описания проекта в набор логических выражений и схему
- работа со сложными (тысячи и более компонентов) проектами
- Наиболее часто используемые HDL-языки: VHDL, Verilog, SystemC
Слайд: Язык VHDL
- VHDL
- Very high speed integration circuits (VHSIC) Hardware Description Language предложен Министерством обороны США (The United States Department of Defense) в начале 80-х:
- Первые симуляторы появились в начале 90-х
- ПО для ПК – в середине 90-х
- Основное применение сейчас – PLD, FPGA, разработка заказных/полузаказных СБИС
Слайд: Стандарты языка VHDL
Ревизии языка: IEEE Standard VHDL Language Reference Manual
- 1076-1987 Первая версия стандарта
- 1076-1993 (ISBN 1-55937-376-8) Значительные улучшения после нескольких лет использования. Наиболее используемая и поддерживаемая САПР версия.
- ГОСТ Р 50754-95 Язык описания аппаратуры цифровых систем VHDL. Описание языка
- 1076-2000 Небольшие изменения. Предложен защищенный тип (protected).
- 1076-2002 Небольшие изменения
- 1076-2008 Существенные изменения (опубликован 2009-01-26).
- 1076-2019 Обновление версии 1076-2008 (принят 05.09.2019, опубликован 12.2019).
Связанные стандарты:
- IEEE 1076.1 VHDL Analog and Mixed-Signal (VHDL-AMS)
- IEEE 1076.1.1 VHDL-AMS Standard Packages (stdpkgs)
- IEEE 1076.2 VHDL Math Package (math)
- IEEE 1076.3 VHDL Synthesis Package (vhdlsynth)
- IEEE 1076.3 VHDL Synthesis Package - Floating Point (fphdl)
- IEEE 1076.4 Timing (VHDL Initiative Towards ASIC Libraries: vital)
- IEEE 1076.6 VHDL Register Transfer Level Synthesis, 1998 – синтезируемое подмножество VHDL
- IEEE 1164 VHDL Multivalue Logic (std_logic_1164) Packages
Слайд: Для чего используется VHDL?
- описание поведения цифровых устройств во времени и при изменении входных воздействий;
- описание структуры цифровых устройств с различной степенью детализации (на системном и блочном уровнях, на уровне регистровых передач, на уровне вентилей);
- моделирование цифровых устройств;
- описание тестовых воздействий при моделировании устройств;
- автоматизации преобразования исходного описания схемы в описание на более низком уровне (вплоть до вентильного).
Слайд: Преимущества VHDL-проекта
- Проектирование больших ЦУ
- объединяет структуру ЦУ и алгоритм функционирования
- самодокументированность
- высокая надежность (быстрый поиск ошибок синтаксиса)
- универсальность и переносимость (произвольная элементая база)
- следовательно долгоживущий (гибкий) проект
- поддержка всеми САПР
Слайд: Стили описания VHDL-моделей
Описывать ЦУ можно, используя разные стили:
- поведенческий стиль, при котором для описания проекта используются причинно-следственные связи между событиями на входах устройства и событиями на его выходах (без уточнения структуры);
- структурный стиль, при котором устройство представляется в виде иерархии взаимосвязанных простых устройств (подобно стилю, принятому в схемотехнике);
- потоковый стиль описания устройства, основанный на использовании логических уравнений, каждое из которых преобразует один или несколько входных информационных потоков в выходные потоки.
Слайд: Элементы синтаксиса языка VHDL
- Лексические элементы:
- идентификатор: Abc1
- разделитель
- ключевое (зарезервированное) слово: entity, if, then
- литерал (десятичный, базовый, символьный, строковый, строка бит):
- 123, 1E2, 123.4, 1.2e-3;
- 2#1111_1100#, 10#252#;
- ’A’, ’a’;
- “abcdefg”; B“1010_1010_1010”
- комментарий
- Лексические элементы разделяются:
- разделителями: & ( ) * + ? - . / : ; < = >
- концами строк
- знаками форматирования
- составными разделителями (композиция двух смежных cпециальных символов): => ** := >=
A <= B and C;
Два из шести лексических элементов являются разделителем:
- " <= " (составной разделитель – оператор назначения сигнала);
- " ; "
В качестве разделителей в данном примере используются пробелы, однако нет необходимости иметь разделитель между оператором " ; " и лексическим элементом "C".
Комментарий начинается с двух смежных дефисов и продолжается до конца строки. Комментарии не учитываются при моделировании VHDLописаний и синтезе схем по VHDL-описаниям.
Слайд: Элементы синтаксиса языка VHDL/ Форма Бэкуса-Наура
Для задания синтаксических конструкций языка VHDL используются так называемые формы Бэкуса-Наура, служащие для описания грамматик формальных языков. Для определения синтаксической конструкции используется выражение
<синтаксическая конструкция>::=<определение>
Используемые фигурные скобки служат для обозначения повторения выражения, заключенного в них. Выражение может повторяться k раз (k=0,1,2, ...). При k=0 выражение отсутствует.
Вертикальная черта служит для обозначения альтернативных случаев. Например,
letter_or_digit ::= letter|digit,
т.е. синтаксическая конструкция символ_или_число определяется как символ (letter) или цифра (digit).
В случае, например,
choices::=choice{|choise},
когда в фигурных скобках стоит то же выражение (с символом «вертикальная черта»), это означает повторение того же выражения. В данном примере повторяется выражение «choice».
Квадратные скобки служат для обозначения необязательного выражения или необязательного слова. Например, запись
return_statement::=return[expression];
эквивалентна записи
return_statement::=return;|return[expression];
Например, элементы type_name и subtype_name могут рассматриваться просто как name (имя). В случае type_name подчеркивается, что это имя типа, в случае subtype_name, что это имя подтипа.
Слайд: Элементы синтаксиса языка VHDL/ Идентификаторы
Определение идентификатора
basic_identifier ::= letter { [ underline ] letter_or_digit }
Идентификаторы употребляются как пользовательские имена и ключевые слова.
Идентификатор должен начинаться с буквы (не цифры). Может употребляться кроме букв и цифр, знак подчеркивания. Два подряд идущих подчеркивания не допускаются.
! В VHDL-коде нет различия между прописными и строчными буквами. AbC7 эквивалентно aBC7, A_3 не эквивалентно A3.
Идентификатор не должен оканчиваться подчеркиванием.
Неправильные идентификаторы
7AB (начинается с цифры) A@B (специальный символ @) SUM_(кончается подчеркиванием) PI__A (два подчеркивания подряд)
Правильные идентификаторы
Carry_OUT Dim_Sum Count7SUB_2goX AaBBb
Слайд: Элементы синтаксиса языка VHDL/ Зарезервированные (ключевые) слова
Как и многие другие языки программирования, VHDL имеет ключевые (специальные) слова.
Список ключевых слов (стандарт VHDL’87)
abs | access | after | alias | all |
and | architecture | array | assert | attribute |
begin | block | body | buffer | bus |
case | component | configuration | constant | disconnect |
downto | else | elsif | end | entity |
exit | file | for | function | generate |
generic | guarded | if | in | inout |
is | label | library | linkage | loop |
map | mod | nand | new | next |
nor | not | null | of | on |
open | or | others | out | package |
port | procedure | process | range | record |
register | rem | report | return | select |
severity | signal | subtype | then | to |
transport | type | units | until | use |
variable | wait | when | while | with |
xor |
В стандарт VHDL’93 добавлены следующие слова:
group | impure | inertial | literal | postponed |
pure | reject | rol | ror | shared |
sla | sll | sra | srl | unaffected |
xnor |
Слайд: Элементы синтаксиса языка VHDL/ Литералы
Литералы - константные числовые значения в языке VHDL. Десятичный литерал может быть целым, вещественным или вещественным с экспонентой.
Примеры
Целые литералы:
21, 0, 1Е2, 3e4, 123_000.
Вещественные литералы:
11.0, 0.0, 0.468, 3.141_592_6.
Вещественные литералы с экспонентой:
1.23E-11, 1.0E+4, 3.024E+23.
Знак экспоненты E может быть строчным либо прописным. Подчеркивание в десятичном литерале не является значащим. Экспонента для целого литерала не должна иметь знак минус. Базовый литерал указывает на систему счисления: от двоичной до шестнадцатеричной:
Двоичная | 2# 1111_1100# | Все эти литералы имеют значение 252 |
Шестнадцатеричная | 16# fc# | |
Шестнадцатеричная | 016# 0FC# | |
Десятичная | 10#252# | |
Семеричная | 7# 510# |
Число 16#6#E1 означает 6*16**1 – это число 96 в десятичной системесчисления: 96 = 6 × 161. Символ * – знак умножения, ** – возведение в степень. Число 2E-3 не является целым, 3e4 – это число 3 × 104
Слайд: Элементы синтаксиса языка VHDL/ Литералы
Символьный литерал формируется одним из символов (букв) между апострофами:
'A','a','%', (литерал - апостроф), ' ' (пробел);
'A' отличается от 'a' в случае символьного литерала.
Строковый литерал формируется как последовательность букв (возможно пустая) между двумя кавычками, употребляемыми как строковые скобки.
Строковый литерал должен располагаться в одной строке. Для формирования "длинных" строковых литералов может быть употреблена операция конкатенации & (напомним, что для оператора логического И употребляется оператор AND).
Литерал "строка бит"
Литерал "строка бит" формируется как последовательность цифр 0, ... , 9, A, ... ,F (или a, ... , f) между двумя кавычками. Подчеркивание в таком литерале не является значащим.
Литерал "строка бит" может быть
B – бинарным; O – восьмеричным; X – шестнадцатеричным.
Очевидно, вместо прописных букв B, O, X могут употребляться строчные буквы b, o, x.
Длина строкового битового литерала есть число бит в последовательности, представляющей литерал. Для примера:
ниже все литералы имеют длину 12
X"F_FF", O"7777", B"1111_1111_1111"
Примеры
B"1010110" -- длина 7 O"126" -- эквивалентно B"001_010_110", длина 9 X"56" -- эквивалентно B"0101_0110", длина 8
Слайд: Операторы языка VHDL
Приоритет | Классы операторов |
Операторы |
---|---|---|
0 (низкий) | Логические | and, or, nand, nor, xor, xnor |
1 | Отношения | =, <, >, <=, >=, /= |
2 | Сдвиги | sll, srl, sla, sra, rol, ror |
3 | Сложение | +, –, & |
4 | Унарные | +, – |
5 | Умножение | *, /, mod, rem |
6 (высокий) | Вспомогательные | **, abs, not |
Слайд: Структура VHDL программы
Описание системы на VHDL реализуется в двух основных частях:
Подключение библиотеки IEEE и пакета std_logic_1164 из неё. | library ieee; use ieee.std_logic_1164.all; |
интерфейс (entity) – описание взаимодействия между системой и ее окружением |
entity block2 is port ( x : in std_logic_vector(2 downto 0); y : out std_logic_vector(1 downto 0)); end block2; |
архитектура (architecture) – описание поведения (функциональности) системы | architecture beh of block2 is begin -- beh y(0) <= (not x(2) and not x(1)) or (x(1) and not x(0)); y(1) <= not x(1) and not x(0); end beh; |
Слайд: Оператор присваивания when..else
architecture tabl of block1 is begin -- комментарий y <= "11" when x = "000" else "01" when x = "001" else "01" when x = "010" and x = "110" else "00"; end tabl; * важен порядок, срабатывает первое верное условие
Слайд: Типы данных языка VHDL
Поскольку этот язык используется для представления аппаратных проектов в самых разных вариантах, средства типизации данных приобретают здесь особенно важное значение. Например, они дают разработчику возможность представить группу линий (проводников) шины в виде
- массива битов;
- целого числа.
В языке VHDL реализована строгая типизация. Это означает, что смешение различных типов в одной операции является ошибкой. Средства строгого контроля типов играют ответственную роль, поскольку позволяют уточнять намерения разработчика.
Тип – поименованное множество значений с некоторыми общими характеристиками.
Подтип – подмножество значений данного типа.
Например, тип NATURAL есть подтип типа INTEGER.
Ниже дана классификация типов языка VHDL.
Типы определяются обычно в
|
Слайд: Типы данных языка VHDL
Примеры декларации целых типов.
type byte_int is range 0 to 255; type signed_word_int is range –32768 to 32767; type bit_index is range 31 downto 0;
В пакете STANDARD, поставляемом с системами моделирования и синтеза, декларируются типы BOOLEAN, BIT, BIT_VECTOR, INTEGER, POSITIV, NATURAL, CHARACTER, STRING, а также тип TIME.
Логические Типы | Арифметические типы | Символьные типы |
BOOLEAN(булев) | INTEGER(целый) | CHARACTER(символьный) |
BIT(битовый) | POSITIV(положительный) | STRING(строковый) |
BIT_VECTOR(битовый вектор) | NATURAL(натуральный) | - |
- | REAL (вещественный) | - |
Числовые типы имеют диапазон (range), или область значений. Примеры.
type INDEX is range 0 to 9; -- тип целый, type VOLTAGE is range 0.0 to 10.0; -- тип вещественный.
Слайд: Типы данных языка VHDL
Физический тип
Поскольку VHDL – это язык описания аппаратуры, в нем предусмотрены физические типы. Например, тип TIME (время) может быть описан следующим образом:
type TIME is range 0 to 1E20 units fs; ps = 1000fs; ns = 1000ps; us = 1000ns; ms = 1000us; s = 1000ms; min = 60s; nr = 60min; end units;
В качестве базовой выбрана фемтосекунда (10-15 с). Диапазон (1E20) обеспечивает максимальный период времени 100 000 с (27,7 ч). Естественно, диапазон ограничивается длиной слова инструментальной машины.
Слайд: Типы данных языка VHDL
Перечислимые типы
Примеры перечислимых типов.
type logic_level is (unknown, low, undriven, high); type alu_function is (disable, pass, add, subtract, multiply, divide); type octal_digit is ('0', '1', '2', '3', '4', '5', '6', '7');
Определения некоторых перечислимых типов:
type severity_level is (note, warning, error, failure); type boolean is (false, true); type bit is ('0', '1');
Составные типы – это тип "массив" (индексируемый тип) и тип "запись" (структурный тип).
Слайд: Типы данных языка VHDL
Массивы
Примеры декларации типа "массив".
type word is array (31 downto 0) of bit; type memory is array (address) of word; type transform is array (1 to 4, 1 to 4) of real; type register_bank is array (byte range 0 to 132) of integer;
Тип BIT_VECTOR определяет массив битов, например BIT_VECTOR (0 to 7). Тип BIT_VECTOR есть тип массива, который неявно описывается следующим образом:
type BIT_VECTOR is array (NATURAL range <>) of BIT;
BIT – базовый тип элементов массива, выражение NATURAL range (диапазон натуральный) – это стандартный способ указать, что длина массива будет задаваться диапазоном натуральных чисел. Пользователь должен задавать конкретный диапазон при применении такого типа, например,
- BIT_VECTOR (0 to 3) – возрастающий диапазон,
- BIT_VECTOR (7 downto 0) – убывающий диапазон.
Пример.
signal DataBus: bit_vector (7 downto 0);
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | |
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | номер разряда |
DataBus = "10010101" DataBus(7)=’1’ DataBus(6)=’0’ DataBus(5)=’0’ DataBus(4)=’1’ DataBus(3)=’0’ DataBus(2)=’1’ DataBus(1)=’0’ DataBus(0)=’1’
Слайд: Типы сигналов и портов
- стандартные (библиотека/пакет standard)
- bit (bit_vector): 0, 1
- boolean (boolean_vectorVHDL`08): true, false
- integer (INTEGER_VECTORVHDL`08): -2147483648 to 2147483647
- natural: 0 to 2147483647
- real (REAL_VECTORVHDL`08): -1.0E308 to 1.0E308
- TIME (TIME_VECTORVHDL`08): -2147483647 to 2147483647 units fs; ps = 1000 fs; ns = 1000 ps; us = 1000 ns; ms = 1000 us; sec = 1000 ms; min = 60 sec; hr = 60 min; end units;
- character, string и др.
- библиотека std_logic_1164
- std_ulogic (std_ulogic_vector)
- std_logic (std_logic_vector)
- библиотека numeric_std
- signed
- unsigned
Слайд: Тип std_logic (std_logic_vector)
Сигнал типа std_logic может принимать значения:
- 'U': Не инициализировано (ещё не было задано)
- 'X': Неопределённое значение
- '0': Логический 0
- '1': Логическая 1
- 'Z': Высокий импеданс (третье состояние)
- 'W': Слабая неопределённость (слабый 'X')
- 'L': Слабый '0'
- 'H': Слабая '1'
- '–': Don't care.
Особенности:
- является промышленным стандартом (стандарт IEEE)
- поддерживается всеми САПР
- входит в библиотеку std_logic_1164
- данные значения соответствуют и типам signed и unsigned из библиотеки numeric_std
Оператор port map
instantiation_label : component_name port map (port list);
instantiation_label : [ component ] component_name | entity entity_name [ ( architecture_identifier ) ] | configuration configuration_name [ generic map ( generic_association_list ) ] [ port map ( [ port_name => ] signal_name [, [ port_name => ] signal_name]... ) ] ;