«Бог не меняет того, что (происходит) с людьми, пока они сами не изменят своих помыслов.» Коран, Сура 12:13

Проектирование цифровых систем на языках описания аппаратуры/Лекция 2

Материал из Wiki
Перейти к: навигация, поиск
Лекции ПЦСЯОА

Лекции

Практические

Доп. материалы

Заголовок
Основы языка 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;
Здесь шесть лексических элементов "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 – это число 9610 в десятичной системе счисления: 9610 = 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;
 
* важен порядок, срабатывает первое верное условие

Оператор 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]... ) ] ;


Слайд: Типы данных языка VHDL

Поскольку этот язык используется для представления аппаратных проектов в самых разных вариантах, средства типизации данных приобретают здесь особенно важное значение. Например, они дают разработчику возможность представить группу линий (проводников) шины в виде

  • массива битов;
  • целого числа.

В языке VHDL реализована строгая типизация. Это означает, что смешение различных типов в одной операции является ошибкой. Средства строгого контроля типов играют ответственную роль, поскольку позволяют уточнять намерения разработчика.
Тип – поименованное множество значений с некоторыми общими характеристиками.
Подтип – подмножество значений данного типа.
Например, тип NATURAL есть подтип типа INTEGER.
Ниже дана классификация типов языка VHDL.

[svg]

Типы определяются обычно в

  • пакете;
  • процессе;
  • архитектурном теле.

Слайд: Типы данных языка VHDL

Примеры декларации целых типов.
type byte_int is range 0 to 255;
type signed_word_int is range32768 to 32767;
type bit_index is range 31 downto 0;

В пакете STANDARD ('93), поставляемом с системами моделирования и синтеза, декларируются типы 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;             -- 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;
В качестве базовой выбрана фемтосекунда (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’

Слайд: Типы данных языка VHDL

Пример двумерного массива.

   Type TWO_DIMENSION is array (natural range <>, natural range <>) of bit;

Записи Тип "запись" – это составной тип, состоящий из ряда полей. Примеры декларации типа "запись".

   type instruction is
       record
           op_code : processor_op;
           address_mode : mode;
           operand1, operand2: integer range 0 to 15;
       end record;
   type Instr_T is record
       Mnemonic: String (0 to 5);
       Code: Bit_vector (3 downto 0);
       ExeCycles: Integer;
   end record;

signal Instr1, Instr2, Instr3: Instr_T;

Например, тип DATE (дата) можно описать как тип "запись" следующим образом:

   type DATE is
       record
           DAY: INTEGER range 1 to 31;
           MONTH: MONTH_TYPE;
           YEAR:INTEGER range 0 to 3000;
       end record;

Здесь MONTH_TYPE (имя месяца) – это перечислимый тип, содержащий имена месяцев.

VHDL предусматривает определенные типы файлов (FILE) и типы доступа (ACCSESS).

Слайд: Типы данных языка VHDL / Подтипы, конверсия типов

Подтип определяется как тип с ограничением (уточнением) следующим образом

   subtype имя подтипа is базовый тип [уточнение];

Например, пусть базовый тип определен так

   Type big_integer is range 0 to 2000;

Тогда подтип small_integer может быть определен так

   Subtype small_integer is big_integer range 0 to 15;

Смешение типов в VHDL – это ошибка. Однако значения подтипа могут быть переданы типу (конверсия типов). Пример.

   Type big_integer is range 0 to 2000;
   Subtype small_integer is big_integer range 0 to 15;
   Signal intermediate : small_integer;
   Signal final : big_integer;
   . . .
   Final <= intermediate * 5; -- нет ошибки, конверсия типов

В данном фрагменте VHDL-кода нет ошибки, так как small_integer есть подтип базового типа big_integer. Если же типы определяются независимо друг от друга, то присвоение значений одного типа другому невозможно, т.е. приводит к ошибке. Пример.

   Type big_integer is range 0 to 2000;
   Type small_integer is range 0 to 15;
   Signal intermediate : small_integer;
   Signal final : big_integer;
   . . .
   Final <= intermediate * 5; -- ошибка, смешение типов

Слайд: Типы сигналов и портов

  • стандартные (библиотека/пакет 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

Слайд: Объекты языка: сигналы, переменные и константы. Декларации объектов языка.

Имеются три класса объектов языка VHDL:

  • константы;
  • сигналы;
  • переменные.

С помощью объектов языка VHDL описываются объекты проекта, т.е. различные подсистемы проектируемой (моделируемой) цифровой системы.

Декларация константы.
Общий вид конструкции, употребляемой при декларации констант одного и того же типа

   constant список констант : тип [ := выражение] ;

В VHDL константы подобны константам в других языках программирования. Примеры декларации констант.

   constant PERIOD: time:=100 ns;
   constant PI: real:= 3.14159;
   constant WIDTH: integer:=32;
   constant DEFAULT: bit_vector(0 to 3):= "0101";
   constant a, b, c, d : integer := 5;

Каждая из декларированных в последней строке констант a, b, c, d равна 5. Если символов ":=" нет в декларации константы, то константа называется задержанной. Такие константы могут быть в разделе деклараций пакета. Соответствующая полная декларация появляется в теле пакета. Если в VHDL-коде символы ":=" следуют после выражения, то выражение принимает значение объекта, находящегося справа от данных символов, при этом, естественно, не должно быть смешения типов.

Слайд: Объекты языка: сигналы, переменные и константы. Декларации объектов языка.

Декларация переменной
Общий вид конструкции, употребляемой при декларации переменных

   variable список переменных : тип [ := выражение];

Переменная в VHDL подобна идентификатору, употребляемому в других языках программирования высокого уровня. Значение переменной может быть инициализировано и изменено немедленно после выполнения предложения, присваивающего переменной новое значение. Примеры декларации переменных.

   variable ROM, COLUMN: integer range 0 to 31;
   variable COUNT : positive :=100;
   variable MEMORY : TWO_DIMENSION (0 to 15, 0 to 31);
   variable a, b, c, d: bit :='1';

Каждая из декларированных в последней строке битовых переменных a, b, c, d равна '1'.

Декларация сигнала
Общий вид конструкции, употребляемой при декларации сигналов одного типа

   signal список сигналов : тип [register | bus] [ :=выражение];

В необязательной опции [register | bus] может быть указано только одно из ключевых слов – либо слово register, либо слово bus. Концепция сигнала в VHDL является одной из самых важных. Сигналы подобны (соответствуют) физическим линиям (проводникам), которые соединяют элементы схемы. Сигналы и переменные будут рассмотрены далее. Примеры декларации сигналов.

   signal CLK, RESETn: bit;
   signal COUNTER: integer range 0 to 31;
   signal RAM : TWO_DIMENSION (0 to 15, 0 to 31);
   signal INSTRUCTION: bit_vector (15 downto 0);
   signal a, b, c, d: bit :='0';

Как видно из последней строки примера, сигналам при декларации может быть присвоено начальное значение.

Слайд: Объекты языка: сигналы, переменные и константы. Декларации объектов языка.

Декларация компонента
Общий вид конструкции, употребляемой при декларации компонента

   component имя компонента
       generic (список параметров);
       port (список портов);
   end component;

Список портов, начинающийся с ключевого слова port, определяет имя, направление (режим – mode) и тип каждого порта. Тип порта – это тип сигнала, ассоциированного с данным портом. Направление порта может быть: in – входной порт, out – выходной, inout – двунаправленный, linkage, buffer. Компоненты, имеющие направления портов linkage или buffer, рассматриваться не будет. Компоненты декларируются в архитектурном теле прежде оператора begin. Ключевое слово generic служит для передачи параметров, чаще всего таких, как разрядность, число полюсов и других настраиваемых параметров. Примеры настраиваемых параметров будут даны позже. Компонент является частью проекта. Его реализация осуществляется соответствующим entity и одним либо несколькими архитектурными телами.
! В entity и декларируемом компоненте должны совпадать спецификации.