Кафедра "Вычислительная техника"
На тему: Основы языка 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
Литература
Язык VHDLслужит для описания модели цифрового устройства (прибора, системы). Описание на языке VHDLопределяет внешние связи устройства (“вид снаружи” или интерфейс) и один или несколько “видов изнутри” (см. рис. 1.1). Вид снаружи задает интерфейс устройства, набор сигналов, которыми устройство обменивается с внешним миром. Этот вид описывает абстрактное представление устройства “в целом” и обозначается английским термином entity, что в дословном переводе означает «сущность» и наиболее точно отражает смысл представления. Однако в литературе термин «сущность» не нашел широкого распространения, для обозначения внешнего описания объекта используются термины «интерфейс объекта», «декларативная часть» и другие. В настоящем пособии будет использоваться термин «интерфейс объекта» или просто «интерфейс».
Рис. 1.1. Цифровое устройство и его модель
Вид изнутри определяет функциональные возможности устройства или его структуру. Внутреннее строение объекта определяет архитектура (architecturebody).
Как и в языках программирования, язык VHDLимеет свои правила, в том числе правила описания имен переменных, объектов, типов данных и других параметров. Основные правила языка VHDLописаны в последующих разделах.
Идентификаторы - это последовательность букв и цифр произвольной длины. Легальными символами являются прописные (A…Z), строчные (a…z), цифры (0…9), знак подчеркивания. Первый символ должен быть буквой, а последний символ не может быть знаком подчеркивания. Строчные и прописные буквы считаются идентичными, например, Count, COUNT и CouNTрассматриваются как один идентификатор. Знаки подчеркивания не должны следовать друг за другом. Комментарии начинаются с двойного дефиса и следуют до конца строки, например,
- это комментарий, он продолжается до конца строки
- это продолжение комментария
entityUARTisend -- это комментарий, который следует за декларацией интерфейса устройства.
Следующие идентификаторы зарезервированы для использования в качестве ключевых слов и не могут быть использованы иначе:
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 |
Объекты это область хранения данных определенного типа. Создаются объекты посредством декларации объекта, например:
variableCOUNT: INTEGER;
В результате порождается объект с именем COUNT, который хранит целочисленную величину. Кроме того, COUNTдекларируется как класс variable.
Объекты – данные могут быть трех классов:
- сonstant(константа) - может хранить отдельное значение определенного типа. Это значение присваивается объекту в начале моделирования и не может изменяться в процессе моделирования.
- variable(переменная) - объект этого класса может хранить отдельное значение определенного типа, однако, в процессе моделирования ему могут присваиваться различные значения. Для этого используются выражения присваивания (variableassignmentstatement).
- signal(сигнал) – объект данного класса имеет предыдущее значение, имеет текущее значение и набор последующих значений.
Объекты класса signalмоделируют проводные соединения в схемах, в то время как переменные (variable) и константы (constant) используются для моделирования поведения схемы, они аналогичны объектам, используемым в языках программирования Cи Pascal.
Декларации объектов (objectdeclaration) имеют целью дать имя объекту, объявить его тип, класс и даже присвоить значение. Примеры деклараций констант описаны ниже:
constantRISE_TIME: TIME:= 10ns;
constantBUS_WIDTH: INTEGER:= 8:
В первом случае объявляется объект RISE_TIME, который хранит значение типа TIME, объекту в начале моделирования присваивается величина 10 наносекунд. Во втором случае объявляется, что BUS_WIDTH(ширина шины) типа INTEGER(целое) и ей присвоено значение 8.
Примеры деклараций объектов класса variableприведены ниже:
variable CTRL_STATUS: BIT_VECTOR(10 downto 0);
variable SUM: INTEGER range 0 to 100 := 10;
variableFOUND, 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.
Каждый объект в языке VHDLможет хранить значения, относящиеся к определенному набору. Это множество значений декларируется с помощью объявления типа (typedeclaration). Тип – это имя, которое связывается с определенным набором значений и набором операций. Некоторые типы предопределены языком VHDL. Например, BOOLEANимеет набор значений FALSE, TRUEи набор операторов: and, or, nor, nand, not. В языке имеется возможность создавать новые типы с использованием деклараций и задания набора операций.
Все возможные типы в VHDLраспадаются на четыре больших категории:
- scalar(скалярные),
- composite(композитные) – они состоят из элементов одного типа (массивы) или различного типа (записи),
- accesstype(типы доступа) – обеспечивают доступ к данному типу через указатели,
- filetypes(тип – файл) – обеспечивает доступ к объектам, содержащим последовательности значений данного типа.
В свою очередь скалярные типы подразделяются на четыре вида:
-enumeration(перечислимый тип),
-integer(целый тип),
-physical(физический тип),
-floatingpoint(тип “с плавающей запятой”).
В декларации определяется набор определенных пользователем значений, например:
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<DIVistrue, SUB> MULisfalse. Значения в перечислимых типах имеют позиционный номер. Позиционный номер самого левого элемента 0. Значения в перечислимых типах еще называют enumerationliterals(литералы перечислимого типа). Например, вдекларации:
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.
Тип floatingpointобладает набором значений в заданном диапазоне вещественных чисел, например:
type TTL_VOLTAGE is range 1.4 to 5.5
type REAL_DATA is range 0.0 to 31.9;
Литералы типа floatingpointотличаются от целочисленных присутствием точки ( . ). В результате 0 – это целочисленный литерал, а 0.0 – это литерал типа с плавающей запятой.
Physicaltypeхранит значения, которые представляют собой результаты измерений физических величин: времени, длины, напряжения, тока и т.п. Значения этого типа выражаются целыми, умноженными на базовую единицу, например:
type CURRENT is range 0 to 1 E9
units
nA; -- (base unit) nano-ampere
uA = 1000 nA; -- micro-ampere
mA = 1000mA; --milli-ampere
Amp = 1000 mA; -- ampere
end units;
subtype FILTER_CURRENT is CURRENT range 10mA to 5 mA;
Здесь CURRENTопределен как физический тип, имеющий значения в диапазоне от 0 nAдо 10^9 nA. Базовой единицей является наноАмпер, а все остальные являются производными. Позиционный номер значения равен числу базовых единиц, представленных данным значением, например, 2 mAимеют позиционный номер 2000, в то время как 100 nAзанимают позицию 100. Физический литерал записывается как целое, за которым следует название единицы измерения (пробел обязателен).