Кафедра «Вычислительная техника»курсовая работа
На тему: Основы языка VHDL
Москва, 2009
Содержание
1.1 Введение
1.2 Идентификаторы в языке VHDL
1.3 Объекты языка VHDL
1.4 Типы данных
1.5 Операции языка VHDL
1.6 Последовательные операторы
1.7 Параллельные операторы
1.8 Описание интерфейса устройства
1.9 Архитектура
1.10 Особенности синтеза схем поописаниям на языке VHDL
Литература
1.1 Введение
ЯзыкVHDL служит для описаниямодели цифрового устройства (прибора, системы). Описание на языке VHDL определяет внешниесвязи устройства (“вид снаружи” или интерфейс) и один или несколько “видов изнутри”(см. рис. 1.1). Вид снаружи задает интерфейс устройства, набор сигналов, которымиустройство обменивается с внешним миром. Этот вид описывает абстрактное представлениеустройства “в целом” и обозначается английским термином entity,что в дословном переводе означает «сущность» и наиболее точно отражает смысл представления.Однако в литературе термин «сущность» не нашел широкого распространения, для обозначениявнешнего описания объекта используются термины «интерфейс объекта», «декларативнаячасть» и другие. В настоящем пособии будет использоваться термин «интерфейс объекта»или просто «интерфейс».
/>
Рис. 1.1. Цифровое устройствои его модель
Видизнутри определяет функциональные возможности устройства или его структуру. Внутреннеестроение объекта определяет архитектура (architecturebody).
Каки в языках программирования, язык VHDL имеетсвои правила, в том числе правила описания имен переменных, объектов, типов данныхи других параметров. Основные правила языка VHDL описаны в последующих разделах.1.2 Идентификаторы в языке VHDL
Идентификаторы- это последовательность букв и цифр произвольной длины. Легальными символами являютсяпрописные (A…Z), строчные (a…z), цифры (0…9),знак подчеркивания. Первый символ должен быть буквой, а последний символ не можетбыть знаком подчеркивания. Строчные и прописные буквы считаются идентичными, например,Count, COUNT и CouNT рассматриваютсякак один идентификатор. Знаки подчеркивания не должны следовать друг за другом.Комментарии начинаются с двойного дефиса и следуют до конца строки, например,
— это комментарий, он продолжается до конца строки
— это продолжение комментария
entityUART is end — это комментарий, который следует за декларациейинтерфейса устройства.
Следующиеидентификаторы зарезервированы для использования в качестве ключевых слов и не могутбыть использованы иначе:Abs Access after alias All And architecture array begin Block Body Buffer case component Configu-ration Constant disconnect downto else Elsif End Entity 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 select severity signal Subtyupe then to Transport type Units until use vriable wait When while with Xor 1.3 Объекты языка VHDL
Объектыэто область хранения данных определенного типа. Создаются объекты посредством декларацииобъекта, например:
variable COUNT: INTEGER;
Врезультате порождается объект с именем COUNT, который хранитцелочисленную величину. Кроме того, COUNT декларируетсякак класс variable.
Объекты– данные могут быть трех классов:
— сonstant (константа)- может хранить отдельное значение определенного типа. Это значение присваиваетсяобъекту в начале моделирования и не может изменяться в процессе моделирования.
— variable (переменная)- объект этого класса может хранить отдельное значение определенного типа, однако,в процессе моделирования ему могут присваиваться различные значения. Для этого используютсявыражения присваивания (variable assignment statement).
— signal (сигнал) – объектданного класса имеет предыдущее значение, имеет текущее значение и набор последующихзначений.
Объектыкласса signal моделируютпроводные соединения в схемах, в то время как переменные (variable)и константы (constant) используются для моделирования поведения схемы, они аналогичныобъектам, используемым в языках программирования C и Pascal.Декларация констант
Декларацииобъектов (object declaration)имеют целью дать имя объекту, объявить его тип, класс и даже присвоить значение.Примеры деклараций констант описаны ниже:
constant RISE_TIME: TIME := 10ns;
constant BUS_WIDTH: INTEGER := 8:
Впервом случае объявляется объект RISE_TIME, который хранит значение типа TIME, объекту в начале моделированияприсваивается величина 10 наносекунд. Во втором случае объявляется, что BUS_WIDTH (ширина шины) типа INTEGER (целое) и ей присвоено значение 8.Декларация переменных
Примерыдеклараций объектов класса variable приведеныниже:
variable CTRL_STATUS: BIT_VECTOR(10downto 0);
variable SUM: INTEGER range 0 to 100 := 10;
variable FOUND, DONE: BOOLEAN;
Впервом случае декларируется переменная CTRL_STATUS как массив из 11 элементов, причем, каждый элемент типа BIT. Во втором случае переменная SUM декларируется как целое, лежащеев диапазоне от 0 до 100, в начале моделирования переменной присваивается значение10. Если переменной в начале моделирования не задано значение, то используется значениепо умолчанию. Им служит самое “левое” значение в наборе значений данного типа. Например,переменная типа BOOLEAN имеет набор значений(FALSE, TRUE) и в третьем примере начальное значениепеременных FOUND и DONE будет взято по умолчанию, т.е. FALSE.Декларация сигналов
Декларацииобъектов класса signal схожис декларациями переменных:
signal CLOCK: BIT;
signal DATA_BUS: BIT_VECTOR(0 to 7);
signal GATE_DELAY: TIME := 10 ns;
Впервом примере декларируется объект CLOCK типаBIT, начальное значение при моделировании будет взято по умолчанию,т.е. 0 (набор значений типа BIT: 0,1 и крайнее левое значение 0).
Невсе объекты в языке VHDL создаютсяпутем декларирования, например, входные/выходные порты всегда считаются объектамикласса signal.1.4 Типы данных
Каждыйобъект в языке VHDL можетхранить значения, относящиеся к определенному набору. Это множество значений декларируетсяс помощью объявления типа (type declaration). Тип – это имя, которое связывается с определенным наборомзначений и набором операций. Некоторые типы предопределены языком VHDL.Например, BOOLEAN имеетнабор значений FALSE, TRUE и набороператоров: and, or, nor, nand, not. В языке имеется возможность создавать новые типы с использованиемдеклараций и задания набора операций.
Всевозможные типы в VHDL распадаютсяна четыре больших категории:
— scalar (скалярные),
— composite (композитные)– они состоят из элементов одного типа (массивы) или различного типа (записи),
— access type (типыдоступа) – обеспечивают доступ к данному типу через указатели,
— file types (тип– файл) – обеспечивает доступ к объектам, содержащим последовательности значенийданного типа.
Всвою очередь скалярные типы подразделяются на четыре вида:
-enumeration (перечислимый тип),
-integer (целый тип),
-physical(физическийтип),
-floating point (тип“с плавающей запятой”).Перечислимый тип
Вдекларации определяется набор определенных пользователем значений, например:
type MVL is (‘U’,’0′,’1′,’Z);
type MICRO_OP is (LOAD, STORE, ADD,SUB, MUL, DIV);
MVL– перечислимый тип с упорядоченным набором значений: ‘U’, ‘0’, ‘1’, и ‘Z’. MICRO_OP имеет набор значений: LOAD, STORE, ADD, SUB,MUL, DIV. Порядок записизначений в декларации определяет лексику, т.е. значение справа всегда больше значенияслева: STORE MUL is false. Значения в перечислимых типах имеют позиционный номер. Позиционный номерсамого левого элемента 0. Значения в перечислимых типах еще называют enumeration literals (литералы перечислимого типа). Например, в декларации:
type CAR_STATE is (STOP, SLOW, MEDIUM,FAST);
литералами являются STOP, SLOW, MEDIUM, FAST и только они могут присваиваться переменной CAR_STATE. Целый тип
Integer – целое, задает тип, набор значений которого находится взаданном целочисленном диапазоне, например:
type INDEX is range 0 to 15;
type WORD_LENGTH is range 31 downto 0;
subtype DATA_WORD is WORD_LENGTH range 15 downto 0;
type MY_WORD is range 4 to 6;
INDEX– это переменная целочисленного типа, наборзначений которой размещен в диапазоне целых от 0 до 15. DATA_WORD – подтип WORLD_LENGTH в диапазоне от 15до 0. В отличие от перечислимых в целочисленных типах позиционный номер равен величинезначения, например, для значения 31 переменной WORD_LENGTH позиция равна 31.Тип “с плавающей запятой”
Типfloating point обладаетнабором значений в заданном диапазоне вещественных чисел, например:
type TTL_VOLTAGE is range 1.4 to 5.5
type REAL_DATA is range 0.0 to 31.9;
Литералытипа floating point отличаютсяот целочисленных присутствием точки (. ). В результате 0 – это целочисленный литерал,а 0.0 – это литерал типа с плавающей запятой.Физический тип
Physicaltype хранит значения,которые представляют собой результаты измерений физических величин: времени, длины,напряжения, тока и т.п. Значения этого типа выражаются целыми, умноженными на базовуюединицу, например:
type CURRENT is range 0 to 1 E9
units
nA; — (base unit) nano-ampere
uA = 1000 nA; — micro-ampere
mA = 1000 mA;–milli-ampere
Amp = 1000 mA; — ampere
end units;
subtype FILTER_CURRENT is CURRENTrange 10 mA to 5 mA;
Здесь CURRENT определен как физический тип, имеющий значения в диапазоне от 0 nA до 10^9 nA. Базовой единицей является наноАмпер, а все остальныеявляются производными. Позиционный номер значения равен числу базовых единиц, представленныхданным значением, например, 2 mA имеют позиционный номер 2000, в товремя как 100 nAзанимают позицию 100.Физический литерал записывается как целое, за которым следует название единицы измерения(пробел обязателен).Тип “массив”
Объект типа array состоит из элементов одного типа. Ниже даны примеры массивов:
type ADDRESS_WORD is array (0 to 63) of BIT;
type DATA_WORD is array (7 downto 0) of MVL;
type ROM is array (0 to 125) of DATA_WORD;
ADDRESS_WORD – одноразмерный массив из 64 элементов типа BIT. DATA_WORD – одноразмерный массив из 8 элементов типа MVL. ROM – массив из 126 элементов типа DATA_WORD, т.е. в данном случае имеем делос массивом массивов.
Доступ к элементам массива осуществляется с помощью индексов,например, ADDRESS_WORD(26) ссылается на 27-ой элемент массиваADDRESS_WORD.1.5 Операции языка VHDL
В языке VHDL имеются операции следующих категорий:
1. Логические операции
2.Операции отношений
3.Операции сложения/вычитания
4.Операции умножения/деления
5.Прочие
Приоритетопераций возрастает от категории 1 к категории 5. Операции одной категории имеютодинаковый приоритет и выполняются в последовательности: слева направо. Скобки используютсядля изменения последовательности исполнения.Операции логические
Существуетшесть логических операций: and, or, nand, nor, xor, not.
Операцииприменимы к типам BIT, BOOLEAN, к одноразмерным массивам BIT и BOOLEAN. При выполнении битовые значения‘0’ и ‘1’ интерпретируются как булевские FALSE и TRUE. Результат имеет тот же тип, что и операнды. Операция not – унарная операция, она имеет приоритеткатегории 5.Операции отношений
Вязыке VHDL имеютсяследующие операции отношений:
=, /=, , >=
Результатомвыполнения любой операции отношений является булевское выражение BOOLEAN.Операции равенства ( = ) и неравенства ( /= ) допустимы со всеми типами, за исключениемтипа “файл”. Остальные четыре операции допустимы над скалярными типами (целочисленными,перечислимыми) или над массивами дискретного типа. Когда операндами являются массивы,то сравнение выполняется слева направо по одному элементу, например при следующемсравнении:
BIT_VECTOR'(‘0′,’1’, ‘1’)
получен результат TRUE, т.к. первый элемент вектора слеваменьше первого элемента вектора справа. Другой пример, если декларирован тип:
type MVL is (‘U’, ‘0’, ‘1’, ‘Z’ );
то результат сравнения:
MVL'( ‘U’ )
будет TRUE, т.к. ‘U’ находится левее ‘Z’.Операции суммирования, вычитания, конкатенации
Операцииимеют обозначения:
+, -, &.
Операнды,участвующие в операциях сложения ( + ) и вычитания ( — ) должны быть одного числовоготипа, результат оказывается того же типа. Операндами в конкатенации ( & ) могутбыть или отдельные элементы или одномерные массивы. Результат выдается в виде массива,например при выполнении конкатенации:
‘0’ & ‘1’
образуетсямассив символов “01”, или еще пример:
‘C’ & ‘A’ &‘T’
дает “CAT”.Операции умножения, деления
К этой группе оператций относятся: *, /, mod, rem.
Операнды умножения ( * ) и деления ( / ) должны быть одновременнолибо целочисленного типа (integer) либо типа с плавающей запятой (floating point). Результат всегда того типа, чтои операнды. Операция умножения может иметь один операнд физического типа, а другой– либо целочисленного, либо натурального типа. Результат выдается в виде физическоготипа.
В операции деления допустимо делить объект физического типана целочисленный или натуральный. Результат — всегда физического типа. Деление физическоготипа на физический дает целочисленный результат.
Операции остатка ( rem ) и “деления по модулю” ( mod ) в качестве операндов могут иметь целочисленные типы и результат- целочисленного типа. Результат rem имеет знак первого операнда и определяется следующим образом:
A rem B = A — ( A / B ) * B
Результат mod имеет знак второго операнда и определяетсяследующим образом:
A mod B = A – B * N,
где N – некоторое целое.Прочие операции
К их числу следует отнести: Abs, ** и другие. Операция выделения абсолютного значения( abs ) совместима с любым числовым типом операнда. Операция возведения в степень( ** ) операндом слева имеет целое или тип с плавающей точкой, а в качестве правогооперанда (степень) — только целое.1.6 Последовательные операторы
К последовательным операторам (SequentialStatements) относятся операторы присваивания(Assignment Statements), условные операторы if (if Statements)и case (case Statements), операторы цикла(loop — next Statements) и другие. Рассмотрим некоторые из операторов этоготипаОператор присваивания
Эти операторы делятся на операторы присваивания переменной(обозначается знаком :=) и операторы назначения сигнала (
abar := not a;
задает новое значение переменной abar, а именно – инверсное значение a.
Оператор
z
задает новое значение сигнала z, которое получается справа от знака Оператор if
Вобщем случае if представляетсобой последовательность выражений, оговаривающих условия. В качестве условий применимылюбые выражения, при вычисление которых получается булевская величина (FALSE и TRUE).
if булевское_выражениеthen
последовательностные_выражения
[elsif булевское_выражениеthen
последовательностные_выражения ]
[else
последовательностные_выражения]
end if;
Выражениеif вычисляется путемпросмотра условий одного за другим, пока не будет найдено истинное. Затем вычисляетсянабор последовательностных выражений, связанных с этим условием. Предложений видаelsif в выражении if может быть от 0 и более. Можетиспользоваться и предложение else. Выражения if могутвкладываться одно в другое без ограничений.
Рассмотрим простой пример.
if CTRL = ‘1’ then
MUX_OUT
else
MUX_OUT
end if;
Еслиуправляющий сигнал CTRL1 равен ‘1’, то выходной сигнал MUX_OUT принимает значение «10», иначе MUX_OUT примет значение «01». На этом оператор if завершается.
Рассмотримболее сложный пример.
if CTRLI = ‘1’ then
if CTRL2 = ‘0’ then
MUX_OUT
else
MUX_OUT
end if;
else
if CTRL2 = ‘0’ then
MUX_OUT
else
MUX_OUT
end if;
end if;
Еслиуправляющий сигнал CTRL1 равен ‘1’, тогда при условии (открывается вложенное if) CTRL2=’0’выходной сигнал MUX_OUTОператор case
Оператор case имеет следующий формат:
case выражение is
when вариант выбора =>последовательностные_выражения
when вариант выбора =>последовательностные_выражения
— произвольное число вариантов выбора.
when others => последовательностные_выражения]
end case;
При вычислении выражения case выбирается одна из ветвей в соответствии со значением выражения.Выражение может иметь значения типа перечислимого или типа одномерного массива.Рассмотрим пример:
type WEEK_DAY is(MON, TUE, WED, THU, FRI, SAT, SUN);
type DOLLARS is range0 to 10;
variable DAY: WEEK_DAY;
variable POCKET_MONEY:DOLLARS;
case DAY is
when TUE => POCKET_MONEY:= 6; — ветвь 1
when MONI WED => POCKET_MONEY := 2; — ветвь 2
when FRIto SUN => POCKET_MONEY := 7; — ветвь 3
when others=> POCKET_MONEY := 0; — ветвь 4
end case;
Переменная WEEK_DAY имеет значения перечислимого типа(дни недели). Переменная DOLLARS имеет целочисленные значения в диапазоне от 0 до 10. Ветвь 1 выбирается, когдадень недели TUE. Ветвь 2 выбираетсяв случае когда дни недели MON или WED(вертикальная чертаозначает ИЛИ). Ветвь 3 покрывает значения от FRI до SUN, т.е. FRI, SAT и SUN. Ветвь 4 покрывает все оставшиесязначения, т.е. THU. />Оператор loop
Оператор loop используется для задания итерации набора последовательных выражений.
[ярлык для loop: ] итерационная схемаloop
последовательностные_выражения
end loop [ярлык для loop ] ;
Существует три итерационных схемы. Первая имеет форму:
for идентификатор in диапазон
Пример использования схемы:
FACTORIAL := 1;
for NUMBER in 2 toN loop
FACTORIAL := FACTORIAL* NUMBER;
end loop;
Тело loop исполняется N-1 раз, при этомидентификатор NUMBER в конце каждойитерации увеличивается на 1. Подразумевается, что идентификатор целочисленного типаи значения его лежат в диапазоне от 2 до N.
Второй итерационной схемой является следующая:
while булевскоe_выражение
Пример использования схемы:
J:=0;SUM:=10;
WH-LOOP: while J
SUM := SUM * 2;
J:=J+3;
end loop;
Выражения в теле loop выполняются одно за другим и эта последовательность повторяется,пока условие J
Третьей cхемой является конструкция, в которой итерационная схема не задается и выходиз loop осуществляется с использованием выражений:exit, next или return, например:
SUM:=1;J:=0;
L2: loop –loop имеет ярлык
J:=J+21;
SUM := SUM* 10;
exit when SUM >100;
end loop L2;
В этом примере выражение exit заставляет выходить из петли L2 когда SUM становится больше 100. При отсутствии выражения exit loop будет исполняться бесконечно.1.7 Параллельные операторы
К параллельным операторам (Concurrent Statements) оператор process, оператор параллельного вызова процедуры, оператор конкретизаци компонента,оператор генерации (generate) и другие.Параллельные операторы определяют параллельное поведение схем, порядок их выполненияне зависит от их появления внутри блока.
Рассмотрим кратко оператор process. В общем виде он может быть записанследующим образом.
[имя процесса:][postponed]process [(список)]
раздел деклараций
begin
операторы
end process [имя процесса];
Имяпроцесса и ключевое слово [postponed] являются необязательными и часто отсутствуют.Список, находящийся после ключевого слова process, хотя и является необязательным,на практике используется достаточно часто для указания сигналов запуска. Перед ключевымсловом могут находиться различного рода декларации типов, констант атрибутов и т.д.
Хотя процесс является параллельным оператором, он может содержатьпоследовательные операторы. Внутри процессов не мегут быть декларированы сигналы.1.8 Описание интерфейса устройства
В начале главы уже говорилось, что на моделируемое устройствов первую очередь следует посмотреть со стороны (“вид снаружи”) и для этого “черногоящика” определить интерфейс с внешним миром. Такая задача решается в VHDL декларациейинтерфейса entity. Она задает имя описания, имена интерфейсных портов, направлениепередачи, тип портов. Порт – это сигнальнаялиния (шина), с помощью которой устройство (модель) взаимодействуют с окружающейсредой. Например, для полусумматора (рис. 1.2)декларация будет выглядеть следующим образом:
/>
Рис. 1.2. Полусумматор
entity half_adderis
port(a, b: in BIT;sum, cur: out BIT);
end half_adder;
Здесьописание с именем half_adder имеетдва входных порта, a и b(in – означает входной порт), и два выходных порта, sum и carry (out – означает выходнойпорт). Тип портов определен как BIT – означает,что сигналы на линиях портов могут принимать значения: ‘0’ или ‘1’.
Другимпримером может послужить дешифратор, показанный на рис. 1.3.
entity dec2x4 is
port(a, b, enable:in BIT; z: out BIT_VECTOR (0 to 3));
end dec2x4;
Здесьописание с именем dec2x4 имеет три входных порта и четыре выходных. Выходные портыописаны как массив. BIT_VECTOR – этоодномерный массив, диапазон задается параметром Z (0 to 3).
/>
Рис. 1.3. Декодер 2х4
Каждый интерфейсный порт может функционировать в следующихрежимах:
in – значение порта только считывается для использования внутримодели,
out – значение порта может только обновляться моделью, но несчитывается,
inout – двунаправленный порт, значение считывается и обновляетсямоделью,
buffer – буферный порт, значение считывается и обновляется моделью,но источником сигналаможет быть либо буфер, либо одиночный источник.1.9 Архитектура
Архитектура(architecture body) моделирует взгляд на устройство “изнутри”. Устройствоможет рассматриваться под разными углами и описываться по-разному. Оно может предстатьлибо как композиция более простых модулей (структурный стиль моделирования), либокак набор параллельно исполняемых алгоритмов (стиль dataflow), либо описанокак процесс последовательного исполнения операций (стиль “поведенческий”), либоможет быть раскрыто сочетанием указанных стилей.
Содним интерфейсом типа entity может бытьсвязано несколько архитектур. Рассмотрение архитектурных стилей начнем с поведенческого(behavioral style). Поведенческое описание
Функционированиеустройства рассматривается как процесс последовательного вычисления выражений, входящихв process. Толчком к запуску процесса является изменение (event -событие) какоголибо сигнала, из входящих в список “воспринимаемых” сигналов (sensitivity list). Этот список внешне очень похож на список параметровв других языках высокого уровня. Рассмотрим поведенческую модель декодера dec2х4(рис.1.3). Декларация интерфейса его уже приводилась, а теперь она будет пополненаархитектурой поведенческого типа.
entity dec2x4 is
port(a, b, enable:in BIT; z: out BIT_VECTOR (0 to 3));
end dec2x4;
architecture dec_seqof dec2x4 is
begin
process (a, b, enable)
variable abar,bbar: BIT;
begin
abar:=not a; –выражение 1
bbar:=not b; — выражение 2
If enable= ‘1’ then — выражение 3
z(3)
z(2)
z(1)
z(0)
else z
endif;
end process;
end dec_seq;
Архитектураимеет свое имя dec_seq. О принадлежности архитектуры к описанию интерфейса dec2х4говорит выражение: dec_seq of dec2x4. Список сигналов, которыми запускается процесс, дан вскобках: process (a, b, enable).До начала процесса, если необходимо, декларируются переменные variable abar, bbar: BIT. Зона действия их ограничена данным процессом (от begin до end process). Предположим, что в момент T произошло изменение сигнала а. Новое значение переменнойabar (выражение 1) вычисляетсяи присваивается без задержки – мгновенно (в качестве знака присваивания в данномслучае используется =). Без задержки будут вычислены выражения 2 и 3.
Далеев ходе процесса одно за другим вычисляются выражения от 4 до 7, а новые значениясигналам z(0), z(1), z(2), z(3) будут присвоены (в качестве символа оператора присвоенияиспользуется
Рассмотрим пример мультиплексора 4х1 (рис.1.4). Четыре входныхсигнала A, B, C и D выводятся через один порт Z. Коммутация осуществляется сигналомCTRL.
/>
Рис. 1.4. Мультиплексор 4х1.
entity MUX is
port (A,B, C, D: in BIT; CTRL: in BIT_VECTOR(0 to 1);
Z: outBIT);
end MUX;
architecture MUX_BEHAVIORof MUX is
begin
PMUX:process (A, B, C, D, CTRL)
variableTEMP: BIT;
begin
case CTRLis
when «00»=> TEMP := A:
when «01»=> TEMP := B;
when «10»=> TEMP := C;
when «11»=> TEMP := D;
end case;
Z
end processPMUX;
end MUX_BEHAVIOR;
Архитектура получила название MUX_BEHAVIOR, процесс имеет ярлык PMUX. Переменной TEMP в зависимости от значения сигналаCTRL присваивается значение одного извходных портов: A, когда CTRL имеет значение “00”; B, когда CTRL имеет значение“01”; A, когда CTRL имеет значение“10”; D, когда CTRL имеет значение “11”.
Для описания синхросигналов обычно используется атрибу EVENT. Он истинен когда происходит “событие”- изменение сигнала. Например, поведение D-триггера, показанного на рис.1.5, можно описать так:
/>
Рис.1.5. D-триггер
entity dff is
port (data, clk:in BIT
q, notq: out BIT);
end dff;
architecture behavof dff is
begin
process (clk)
begin
if (clk’event andclk = ‘1’) then
q
notq
end if;
end process;
end behav;
Выражение (clk’event and clk = ‘1’) задает условие: если сигналclk меняется с ‘0’ на ‘1’Потоковое описание(dataflow)
Dataflow — означает поток данных. Описание в стиле dataflow использует в архитектуре параллельновычисляемые выражения. Количество параллельно вычисляемых выражений может быть любым.Так как вычисления происходят параллельно, то порядок записи выражений не имеет значения. Толчком к началу вычисленийявляется изменение любого из сигналов, входящих в выражения. Рассмотрим модель одноразрядногосумматора, показанного на рис.1.6.
/>
Рис.1.6. Одноразрядныйсумматор
entity full_adderis
port (a, b, cin:in BIT; sum, cout: out BIT);
end full_adder;
architecture full_ad_concof full_adder is
begin
sum
cout
end full_ad_conc;
Для описания потока данных здесь используются два выражения.Всегда, когда происходят изменения сигналов a, b или cin, оба выражениявычисляются и сигналам sum и cout присваиваются новые значения через 15ns и 10ns, соответственно. Знак
/>
Рис. 1.7. Цепочка инверторов
entity fast_inverteris
port (a: in BIT;z: out BIT);
end fast_inverter;
architecture delta_delayof fast_inverter is
signal b,c: BIT;
begin
z
c
b
end delta_delay;
В выражениях 1, 2 и 3, присваивающих значения переменнымz, c, b, подразумевается задержка D. Например, в момент T происходит изменение сигнала a. Запускается процесс вычислениявыражения 3 и через задержку D переменной b будет присвоено новое значение (в момент T+D). В свою очередь изменение сигнала b запустит процесс вычисления выражения2 и значение сигнала с будет обновлено в момент T+2D. Изменение сигнала с приведет к запуску процесса вычислениявыражения 1 и значение сигнала z будет изменено в момент T+3D. Временные соотношения в схеме иллюстрирует рис. 1.8.
/>
Рис. 1.8. Временные соотношенияв цепочке инверторов.Структурное описание.
Структурное описание интерпретирует устройство как наборкомпонентов, связанных между собой сигналами. Грубо говоря — это таблица соединений(netlist). Рассмотрим простую схему управления(рис.1.8) и ее структурную модель.
/>
Рис. 1.9. Устройство местногоуправления
entity ctr_lck is
port (data, mr, clk,din: in BIT; rdy, ctrla:out Bit);
end ctr_lck;
architecture str_viewof ctr_lck is
component AND2 — декларируется компонент AND2
port (x,y in BIT;z: out BIT);
end component;
component DFF — декларируется компонент DFF
port (d, clock:in BIT; Q,NOTQ: out BIT);
end component;
component NOR2 — декларируется компонент NOR2
port (a,b: in BIT;z: out BIT);
end component;
signal s1,s2: BIT;
begin
D1: DFF port map(data, clk, s1,s2); — выражение 1
A1: AND2 port map(s2, din, ctrla); — выражение 2
N1: NOR2 port map(s1, mr, rdy); — выражение 3
end str_view;
Здесь декларируются три компонента: AND2, DFF и NOR2. В тело архитектуры экземпляры компонентов вводятся с помощью выражений1, 2 и 3. Компоненты связаны между собой сигналами s1 и s2. В декларации называется имя компонента и его интерфейс, что очень схожес декларацией интерфейса устройства. Выражение для экземпляра компонента должнов первую очередь дать имя экземпляру или ярлык. Например, D1 – это ярлык для экземпляра триггераDFF. Далее следует список связей (association list). Он устанавливает связь между портамикомпонента и портами и сигналами устройства. Существует два варианта связи: позиционныйи поименный. В позиционном списке первый порт декларации (слева направо) компонентасоответствует первому порту экземпляра компонента (слева направо), второй – второмуи так далее. Именно такой вариант списка был использован в приведенном выше примере.Вместо этого можно было использовать поименный вариант списка связей, например,выражение 3 можно было бы записать так:
N1: NOR2 port map(a=>s1, b=> mr, z=>rdy);
Рассмотримеще пример. На рис.1.2 была приведена схема полусумматора. Его структурная модель должна предстать какнабор следующих компонентов: XOR на двавхода (например, 7486 или отечественный аналог ЛП5) и AND на два входа (например, 7408 или отечественный аналог ЛИ1).
entity half_adderis
port(a, b:in BIT; sum, cur: out BIT);
end half_adder;
architecture h_a_strof half_adder is
component a_7486
port (a_2:in BIT;
a_3:in BIT;
a_1:out BIT);
end component;
component a_7408
port (a_2:in BIT;
a_3:in BIT;
a_1:out BIT);
end component;
begin
X1: a_7486port map (a, b, sum);
A1: a_7408port map (a, b, cur);
end h_a_str;
Названиякомпонентов и их портов приведены такими, какими они даны в библиотеке фирмы ALTERA – известного производителяпрограммируемых логических схем.
Декларациикомпонентов, использованные в архитектуре h_a_str полусумматора half_adder,можно упаковать в отдельный файл, например, maxplus2.vhd:
package maxplus2is
component a_7486
port(a_2: in BIT;
a_3:in BIT;
a_1:out BIT);
end component;
component a_7408
port(a_2: in BIT;
a_3:in BIT;
a_1:out BIT);
end maxplus2;
Файлmaxplus2 при компиляции может быть помещен в библиотеку, например,с названием altera. Ссылка на библиотеку позволит не декларировать компонентыв архитектуре:
library altera;
use altera.maxplus2.all;
entity half_adderis
port(a, b:in BIT; sum, cur: out BIT);
end half_adder;
architecture h_a_strof half_adder is
begin
X1: a_7486port map (a, b, sum);
A1: a_7408port map (a, b, cur);
end h_a_str;Комбинированное описание архитектуры
Ведином теле архитектуры можно комбинировать все рассмотренные выше стили моделирования.В качестве примера рассмотрим одноразрядный полный сумматор (рис.1.5).
Сумматорпредставлен выражением 1, создающим экземпляр X1 компонента а_7486(из библиотеки altera.maxplus2), и задающим отображение портов и сигнала сущности (сумматора)на порты компонента. Это структурный стиль.
Выражение2 — это process, поведенческий стиль, и выражение 3 – это стиль dataflow.
/>
Рис.1.10. Одноразрядный сумматор
library altera;
use altera.maxplus2.all;
entity full_adderis
port (a, b,cin: in BIT; sum, cout: out BIT);
end full_adder;
architecture fa_mixof full_adder is
signal s1:BIT;
begin
X1: a_7486port map (a,b,s1); –выражение 1
process (a,b, cin) –выражение 2
variablet1, t2, t3: BIT;
begin
t1:=a and b;
t2:=b and cin;
t3:=a and cin;
cout
endprocess;
sum
end fa_mix;1.10 Особенности синтеза схем поописаниям на языке VHDL
Междупроцессами моделирования (имитации поведения схемы) синтеза схем с использованиемязыка VHDL естьсущественные различия. Рассмотрим некоторые из них.
Вотличие от системы моделирования система проектирования преобразует проектную информациюв заданный формат. Среди них выделяются широко распространенный формат EDIF,специализированные форматы различных фирм-изготовителей микросхем, а также языкиVerilog, VHDL и другие. Формат EDIF является своеобразным стандартом де-факто, он имеется вбольшинстве современных систем проектирования и может использоваться для обменаинформацией. Среди специализированных форматов можно выделить формат XNF фирмы Xilinx,который широко использовался в ранних версиях САПР этой фирмы. При преобразованииисходного модуля в промежуточный текст на языке VHDL обычно осуществляется преобразование в структурные конструкцииэтого языка, в которых используются схемотехнические особенности используемой элементнойбазы.
Системамоделирования обычно использует все конструкции языка VHDL, в то время,как система проектирования использует не все его возможности. Обычно при синтезене поддерживаются операции над типом Real (в этомслучае при синтезе выдается ошибка), игнорируются ключевое слово After,не поддерживается также ряд других второстепенных конструкций языка. В системахпроектирования атрибут event можетиспользоваться только для указания фронтов синхросигналов в условных операторах,преимущественно в операторах if.
Всовременных системах проектирования для описания схем используется тип std_logic,который заменяет тип bit. Тип std_logic имеетследующие значения:
· 0 – логический ноль;
· 1 – логическая единица;
· U – значениене инициализировано;
· X – неизвестноезначение;
· Z – высокоевыходное сопротивление;
· W – неизвестноезначение при слабом источнике сигнала;
· L – логическийноль при слабом источнике сигнала;
· H – логическаяединица при слабом источнике сигнала;
· ‘-‘– неопределенное значение.
ЛИТЕРАТУРА
1. Бибило П.Н. Синтез логических схем с использованием языка VHDL. М.: Солон-Р, 2002.
2. СувороваЕ. А., Шейнин Ю. Е. Проектирование цифровых систем на VHDL. — СПб.: БХВ-Петербург. 2003.