Слайд 3
VHDL
VHDL – язык для описания цифровых устройств
VHDL =
VHSIC (Very High Speed Integrated Circuit) Hardware Description Language
Разработан
по заказу DoD для описания ASIC
Промышленный стандарт IEEE:
IEEE 1076-1987
IEEE 1076-1993 используется наиболее широко
IEEE 1076-2000 (незначительные изменения)
IEEE 1076-2002 (незначительные изменения)
Слайд 4
Verilog (vs. VHDL)
Частная разработка (1983 г.) для моделирования
аппаратуры
По функциональности в целом соответствует VHDL
Отсутствует аналог generate
Отличия в
синтаксисе
C-подобный (VHDL – Ada-подобный)
Стандарт IEEE с 1995 г.:
IEEE 1364-1995
IEEE 1364-2001
IEEE 1364-2005 (незначительные изменения)
Слайд 5
always@(posedge clk or negedge rstn)
begin
if (!
rstn)
q
q <= a + b;
end;
process (clk, rstn)
begin
if (rstn = '0') then
q <= '0';
elsif (clk'event and clk = '1') then
q <= a + b;
end if;
end process;
Пример
VHDL
Verilog
Слайд 6
Преимущества VHDL / Verilog
Промышленный стандарт IEEE
Не зависит от
конкретной технологии или производителя
Код может использоваться многократно
Слайд 7
Методология проектирования на VHDL
Слайд 8
Что такое FPGA
FPGA = Field Programmable Gate Array
Микросхема,
конфигурируемая пользователем:
Элементарные функции – Configurable Logic Blocks (CLB)
Внутренние соединения
– Programmable Switch Matrices (PSM)
Слайд 9
Процесс проектирования
Код на VHDL
Синтез до уровня примитивов
Отображение на
ресурсы FPGA
Размещение на кристалле
Трассировка
Генерация битового потока
Передача на FPGA
Разработка
Отладка
Ввод описания
Синтез
Реализация
Программирование
FPGA
Функциональная симуляция
Статический временной анализ
Временная симуляция
Внутрисхемная отладка
Слайд 10
Подмножества VHDL
Не все конструкции VHDL имеют аппаратную реализацию
wait
for
after
report
assert
Слайд 11
Описание на уровне регистровых передач (RTL)
Комбинационная логика
Регистры
Слайд 13
Чувствительность к регистру
VHDL не чувствителен к регистру
databus
Databus
DataBus
DATABUS
эквивалентны
Слайд 14
Имена и метки
Должны быть уникальны в пределах области
видимости
Начинаются с буквы (a-z, A-Z)
Содержат буквы (a-z, A-Z), цифры
(0-9), подчеркивания (_)
Не могут содержать знаков препинания и специальных символов (!, ?, ., &, # и т.д.)
Два и более подчеркивания подряд запрещены
Слайд 15
Формат кода
VHDL не налагает ограничений на форматирование
Пробелы и
переводы строки эквивалентны
if (a = b) then
if (a = b) then
if
(a =
b) then
эквивалентны
Слайд 16
Комментарии
Начинается с двойного дефиса (--) в любом месте
строки
Весь текст до конца той же строки считается комментарием
(перевод строки заканчивает комментарий)
Блочные комментарии в VHDL отсутствуют
-- обработка сброса
if (rst = ‘1’) then
counter <= 0; -- обнуление счетчика
end if;
Слайд 17
Правила хорошего тона
ESA VHDL Modeling Guidelines
European Space Research
and Technology Center
Сентябрь 1994
http://www.vhdl.org/rassp/vhdl/guidelines/ModelGuide.pdf
Слайд 18
Объект моделирования
(design entity)
Слайд 19
Объект моделирования
Базовый блок проекта
Состоит из интерфейса и архитектур
(одной или более)
Объект моделирования
Интерфейс объекта
Архитектура 1
Архитектура 2
Архитектура 3
Слайд 21
Пример: реализация на VHDL
Расширение файла .vhd
Один файл –
один объект
Имя файла обычно совпадает с именем объекта
library ieee;
use
ieee.std_logic_1164.all;
entity nand_gate is
port (
a : in std_logic;
b : in std_logic;
z : out std_logic);
end nand_gate;
architecture model of nand_gate is
begin
z <= a nand b;
end model;
секция импорта
интерфейс объекта моделирования
архитектура объекта моделирования
Слайд 22
Секция импорта
Определяет используемые библиотеки
Библиотека – набор участков кода,
сгруппированных для повторного использования
library library_name;
use library_name.package_name.package_parts;
Слайд 23
Секция импорта – пример
library ieee;
use ieee.std_logic_1164.all;
подключение библиотеки
использовать все
объекты из пакета std_logic_1164 библиотеки ieee
Слайд 25
Основные библиотеки
ieee
Определяет многозначную систему логики (типы std_logic, std_logic_vector)
std
Определяет
стандартные типы данных и связанные с ними операции
work
Объекты, создаваемые
пользователем (после синтеза)
необходимо явное объявление в секции импорта
доступны по умолчанию
Слайд 26
Интерфейс объекта
Определяет вид объекта для внешнего мира («черный
ящик») – входные и выходные сигналы
entity entity_name is
port (
port_name: port_mode
signal_type;
port_name: port_mode signal_type;
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
port_name: port_mode signal_type
);
end entity_name;
Слайд 27
Интерфейс объекта – пример
entity nand_gate is
port
(
a : in std_logic;
b :
in std_logic;
z : out std_logic
);
end nand_gate;
имя объекта
имя порта
тип порта
после последнего
порта точка с запятой не ставится
режим порта (направление передачи)
Слайд 28
Типы портов
Тип порта определяет направление передачи данных с
точки зрения объекта моделирования
Тип IN: входной порт, внутри объекта
разрешено только чтение (правая часть оператора присваивания)
Тип OUT: выходной порт, внутри объекта разрешена только запись (левая часть оператора присваивания)
Другие типы: INOUT (двунаправленный), BUFFER (буферный) – использовать не будем
Слайд 29
Тип порта IN
Объект моделирования
Источник сигнала (драйвер)
драйвер находится снаружи
объекта
Слайд 30
Тип порта OUT
Объект моделирования
драйвер находится внутри объекта
чтение порта
внутри объекта запрещено
Слайд 31
Архитектура объекта
Описывает реализацию объекта
Имя архитектуры должно быть уникально
в пределах объекта
architecture architecture_name of entity_name is
declarations
begin
code
end architecture_name;
Слайд 32
Архитектура объекта – пример
architecture model of nand_gate is
begin
z
Слайд 33
Пример
library ieee;
use ieee.std_logic_1164.all;
entity nand_gate is
port (
a : in std_logic;
b :
in std_logic;
z : out std_logic);
end nand_gate;
architecture model of nand_gate is
begin
z
<= a nand b;
end model;
nand_gate.vhd
Слайд 35
STD_LOGIC
library ieee;
use ieee.std_logic_1164.all;
entity nand_gate is
port (
a : in std_logic;
b :
in std_logic;
z : out std_logic);
end nand_gate;
architecture model of nand_gate is
begin
z
<= a nand b;
end model;
nand_gate.vhd
???
используется как логический тип
Слайд 36
BIT vs. STD_LOGIC
BIT – встроенный логический тип
Значения: ‘0’,
‘1’
STD_LOGIC – девятизначная логика
Значения: ‘U’, ‘0’, ‘1’, ‘X’, ‘Z’,
‘W’, ‘L’, ‘H’, ‘-’
Синтезируемые: ‘0’, ‘1’, ‘Z’
Остальные используются при симуляции
Слайд 38
Значения STD_LOGIC – ‘X’
конфликт значений
Слайд 39
Значения STD_LOGIC – ‘Z’
нет конфликта
тристабильный буфер
выход буфера отключен
от шины
Слайд 41
Значения STD_LOGIC – ‘-’
Применяется, когда значение сигнала не
важно
Может присваиваться выходам (реальные значения – на усмотрение синтезатора)
оптимизация
Не используйте в сравнениях
Слайд 42
Разрешение конфликтов
Функция разрешения определяет значение сигнала в случае
нескольких драйверов
Слайд 43
Использование STD_LOGIC
Всегда используйте STD_LOGIC_VECTOR или STD_LOGIC для всех
портов объекта
Другие типы могут использоваться внутри архитектуры
Для преобразования типов
используйте функции преобразования
Также можно оперировать типами STD_LOGIC_VECTOR или STD_LOGIC непосредственно
Слайд 45
Скаляры и векторы
Одиночный проводник = скаляр
Шина = вектор
signal
a: std_logic;
signal b: std_logic_vector(7 downto 0);
Слайд 46
Использование кавычек
Скалярные значения указываются в одинарных кавычках
Векторные значения
указываются в двойных кавычках
signal a, b: std_logic;
a
‘Z’;
signal a, b: std_logic_vector (1 downto 0);
a <= “00”;
b <= “1Z”;
Слайд 47
Векторы STD_LOGIC_VECTOR
signal a: std_logic_vector(3 downto 0);
signal b: std_logic_vector(3 downto 0);
signal
c: std_logic_vector(7 downto 0);
signal d: std_logic_vector(15 downto 0);
signal e: std_logic_vector(8 downto 0);
a
<= “0000”; -- двоичный формат по умолчанию
b <= B“0000”; -- явное указание двоичного формата
c <= “0110_0111”; -- подчеркивание для улучшения восприятия кода
d <= X“AF67”; -- шестнадцатиричный формат
e <= O“723”; -- восьмиричный формат
Старший бит слева
Слайд 48
Конкатенация векторов
Для конкатенации используется оператор &
Для обращения к
компоненту вектора указывается индекс в скобках
Для обращения к части
вектора указывается диапазон в скобках
signal a, b: std_logic_vector(3 downto 0);
signal c: std_logic_vector(7 downto 0);
signal d: std_logic_vector(5 downto 0);
a <= “1010”;
b <= ‘0’ & ‘0’ & ‘1’ & ‘1’; -- b = “0011”
c <= a & b; -- c = “10100011”
d <= a(0) & b(0) & c(3 downto 0); -- d = “010011”
Слайд 50
Различие стилей
Стиль
Потоков данных (dataflow)
Структурный
(structural)
«параллельные» операторы
компоненты и связи
«последовательные» операторы
синтез
цифровых устройств
симуляция моделей
Слайд 52
Интерфейс
Одинаковый для всех стилей
library ieee;
use ieee.std_logic_1164.all;
entity xor3 is
port
(
a,
b, c: in std_logic;
z: out std_logic
);
end xor3;
Слайд 53
Стиль потоков данных
Описывает перемещения данных по устройству и
операции на данными
Используется для описания простых булевых функций
Все операторы
выполняются параллельно порядок операторов не важен
u1_out <= a xor b;
z <= u1_out xor c;
z <= u1_out xor c; u1_out <= a xor b;
эквивалентны
Слайд 54
Стиль потоков данных – пример
architecture dataflow of xor3
is
signal u1_out: std_logic; -- промежуточный сигнал
begin
u1_out
c;
end dataflow;
u1_out
Слайд 55
Структурный стиль
Иерархическое соединение компонентов любой сложности
Аналог функциональной электрической
схемы
Удобен, когда устройство разбивается на блоки естественным образом
Используется при
проектировании сложных устройств
Слайд 56
Структурный стиль – пример
architecture structural of xor3 is
signal
u1_out: std_logic;
component xor2 is
port (
x1, x2: in std_logic;
y: out std_logic);
end component;
begin
u1: xor2 port map
(
x1 => a,
x2 => b,
y => u1_out);
u2: xor2 port map (
x1 => u1_out,
x2 => c,
y => z);
end structural;
XOR2
XOR3
U1
U2
Слайд 57
Объявление компонента
«Черный ящик»
Аналог объявления интерфейса объекта
Описывает объект, реализованный
в библиотеке
Позволяет использовать объекты, не имеющие VHDL-реализации (например, на
Verilog)
component xor2 is
port
(
x1, x2: in std_logic;
y: out std_logic
);
end component;
наименование компонента
описание портов
Слайд 58
Создание объекта из компонента
Именованный перечень соединений (рекомендуется)
Связи указываются
явно
Неименованный перечень соединений
Связи зависят от порядка перечисления
u1: xor2 port map (
x1 =>
a,
x2 => b,
y => u1_out);
имя порта
присоединенный сигнал
u1: xor2 port map (
a,
b,
u1_out);
component xor2 is
port (
x1: in std_logic;
x2: in std_logic;
y: out std_logic);
end component
Слайд 59
Поведенческий стиль
Наиболее далек от особенностей аппаратной реализации
Реализация может
оказаться неоптимальной
Описывает алгоритм формирования выходов в зависимости от входов
Для
описания используются блоки PROCESS
Операторы внутри блока выполняются последовательно порядок операторов имеет значение
Слайд 60
Поведенческий стиль – пример
architecture behavioral of xor3 is
begin
process
(a, b, c)
begin
if (a xor b xor c =
‘1’) then
z <= ‘1’;
else
z <= ‘0’;
end if;
end process;
end behavioral ;
Слайд 62
Testbench
Предназначен для автоматизированного тестирования объектов
Подает значения на входы
DUT
Может также анализировать значения на выходе
Testbench
анализируемый выход
Процесс выработки тестовых
сигналов
Тестируемый объект
(DUT, Design Under Test)
входные сигналы
Слайд 63
Testbench
Составляется на VHDL
Не требует изучения специальных языков
Не привязан
к конкретной среде
Является объектом моделирования
Не синтезируемый
Не имеет портов
Выполняется в
среде симулятора
Рассматривает DUT как черный ящик
Легко адаптируется к различным архитектурам
Выходы DUT отображаются в виде временных диаграмм или записываются в файл
Слайд 64
Testbench – пример для XOR3
library ieee;
use ieee.std_logic_1164.all;
entity
xor3_tb is
end xor3; -- нет портов
architecture testbench of xor3_tb is
component
xor3 is -- тестируемый объект (DUT)
port (
a, b, c: in std_logic;
z: out std_logic);
end component;
signal test_vector: std_logic_vector(2 downto 0); -- входные значения
signal test_result: std_logic; -- выходное значение
begin
dut: xor3 port map ( -- создание объекта
a => test_vector(0),
b => test_vector(1),
c => test_vector(2),
z => test_result);
Слайд 65
Testbench – пример для XOR3 (продолжение)
process
begin
test_vector
for 10 ns; -- задержка 10 нс
test_vector
10 ns;
test_vector <= “010”;
wait for 10 ns;
test_vector <= “011”;
wait for 10 ns;
test_vector <= “100”;
wait for 10 ns;
test_vector <= “101”;
wait for 10 ns;
test_vector <= “110”;
wait for 10 ns;
test_vector <= “111”;
wait; -- остановка
end process;
end testbench;
Слайд 66
Testbench – пример для XOR3 (врем. диаграммы)
Слайд 67
Процессы
Процесс – набор инструкций
Размещаются между словами BEGIN и
END PROCESS
Выполняются по очереди
После последней инструкции осуществляется возврат к
первой
testing: process
begin
test_vector <= “00”;
wait for 10 ns;
test_vector <= “01”;
wait for 10 ns;
test_vector <= “10”;
wait for 10 ns;
test_vector <= “11”;
wait for 10 ns;
end process;
необязательная метка (имя)
Слайд 68
Процесс и оператор WAIT
Используется для приостановки процесса
wait for
time
Приостановка на заданное время (пауза)
Используется для моделирования задержки
wait until
condition
Приостановка до выполнения условия
wait on signals
Приостановка до изменения любого из сигналов
wait
Окончательная остановка
Используется в testbench после генерации всех сигналов
testing: process
begin
test_vector <= “00”;
wait for 10 ns;
test_vector <= “01”;
wait for 10 ns;
test_vector <= “10”;
wait for 10 ns;
test_vector <= “11”;
wait;
end process;
завершение выполнения процесса
Слайд 69
WAIT FOR vs. WAIT
testing: process
begin
test_vector
10 ns;
test_vector
for 10 ns;
test_vector <= “11”;
wait for 10 ns;
end process;
testing: process
begin
test_vector <= “00”;
wait for 10 ns;
test_vector <= “01”;
wait for 10 ns;
test_vector <= “10”;
wait for 10 ns;
test_vector <= “11”;
wait;
end process;
WAIT FOR: значения повторяются циклически
WAIT: значение остается постоянным после инструкции wait