Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ЦУМ / lbm1_19

.pdf
Скачиваний:
34
Добавлен:
28.03.2015
Размер:
941.83 Кб
Скачать

in

 

T

 

T

 

Q

0

T

 

T

Q

1

T

 

T

 

Q 2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 10

5.3. Структура двоичных счетчиков с параллельным переносом

Рассмотрим прибавление единицы к многоразрядному двоичному числу и вычитание единицы из числа на следующих примерах:

100111

101000

 

1

1

.

101000

 

100111

 

 

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

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

 

 

 

 

 

 

 

 

Q 0

 

 

 

Q

1

 

 

 

 

 

 

Q 2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

&

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

T

T

 

 

 

T

T

 

 

 

 

 

 

T

T

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

in

 

 

 

C

 

 

 

 

 

C

 

 

 

 

 

 

 

C

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 11

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

11

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

5.4. Счетчики с комбинированным переносом

Данные счетчики выполняются с использованием принципов построения и последовательных и параллельных счетчиков.

5.5. Двоично-кодированные счетчики

Это n -разрядные счетчики, у которых состояния описываются n - разрядными двоичными кодовыми словами, но коэффициент счета меньше, чем

2n (может быть не равен целой степени двух).

Так как коэффициент счета есть количество возможных состояний счетчи-

ка, причем для двоичного n -разрядного счетчика это количество равно 2n , то возможный способ построения двоично-кодированного счетчика – это исключение лишних состояний двоичного счетчика. Пусть требуется построить счет-

чик с заданным M , меньшим, чем 2n . Тогда в n -разрядном двоичном счетчике

нужно исключить 2n M лишних состояний. Наиболее простой путь исключения этих состояний – установка суммирующего счетчика при его переполне-

нии в состояние, определяемое двоичной формой числа 2n M , а не в нулевое состояние. Вычитающий же счетчик должен при переполнении устанавливаться в состояние, описываемое двоичным кодом числа M , а не в состояние 11... 1 (все единицы).

Другой способ исключения лишних состояний – это установка при переполнении в исходное нулевое состояние 00... 0 (все нули) для суммирующего счетчика или в исходное состояние 11... 1 (все единицы) для вычитающего

счетчика при появлении двоичного кода числа M в суммирующем счетчике

или числа 2n 1 M в вычитающем счетчике. Появление этих кодов в счетчике может регистрироваться цифровым компаратором, дешифратором или логическим элементом, выходы которых замыкаются на так называемые установочные входы триггеров. В результате образуется счетчик с обратными связями.

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

12

6. Краткие сведения о языке VHDL

Язык VHDL (Very high speed integrated circuits Hardware Description

Language) является международным стандартом в области автоматизации проектирования цифровых устройств. Этот язык используется во многих САПР, ориентированных на разнообразную элементную базу (микросхемы малой и средней степени интеграции, программируемая логика). В частности, он может быть использован в процессе работы с текстовым редактором САПР

Quartus II.

6.1. Понятие об интерфейсе и архитектуре объекта

Объектом называем проектируемое устройство. При использовании языка VHDL для проектирования устройства оно должно быть описано следующим образом:

описывается, как говорят, интерфейс (entity) объекта;

описывается так называемая архитектура (architecture) объекта. Описание интерфейса представляет собой перечисление входов и выходов

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

entity идентификатор_интерфейса is port(список портов с указанием их типов);

end идентификатор_интерфейса;

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

architecture идентификатор_архитектуры of идентификатор_интерфейса is

...; -- декларация портов архитектуры begin

...; -- тело архитектуры end идентификатор_архитектуры;

Двумя смежными дефисами в языке VHDL отделяются комментарии. "Декларация портов архитектуры" является условным названием того раз-

дела описания, в котором перечисляются, например, компоненты (составные части) проектируемого устройства с указанием входных и выходных сигналов (портов) компонентов – так называемых внутренних сигналов устройства, сре-

13

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

Тело архитектуры должно представлять собой описание проектируемого устройства на поведенческом и/или структурном уровне. При структурном описании потребуется указать совокупность компонентов (элементов, подсхем) и связей между компонентами. Естественно, некоторые компоненты устройства в структурном описании в свою очередь могут состоять из нескольких частей – компонентов более низкого уровня иерархии описания. Об этом говорят как о вхождении подсхем в схемы. Представляя отношение вхождения подсхем в схемы в виде графа, можно получить дерево (граф) иерархии описания всего устройства. Некоторые из компонентов объектов могут представлять собой макро- и мегафункции из библиотек некоторых САПР (в частности, Quartus II), допускающих использование VHDL для работы с программируемой логикой.

6.2. Простейшие примеры описания объектов на языке VHDL

Устройство (рис. 12) можно описать следующим образом: entity ANDOR is

port(e0, e1, e2 : in bit; -- декларация входных и z : out bit); -- выходных портов, определение

-- их типов как двоичных

end ANDOR;

architecture RTL1 of ANDOR is begin

--назначение выходному сигналу (порту) z результата

--логического преобразования сигналов e0, e1, e2

z <= (not (e0 and e1) or e2); end RTL1;

В приведенном тексте тело архитектуры, очевидно, представляет собой поведенческое описание объекта – описание логического преобразования, составленного с использованием операций И (and), ИЛИ (or), НЕ (not).

Примером использования структурного описания является описание, составленное для схемы (рис. 13):

entity Cascade_Circuit is

port (x0, x1, x2, x3, x4 : in bit; y : out bit);

end Cascade_Circuit;

architecture example of Cascade_Circuit is

-- декларация описанного ранее компонента,

14

-- соответствующего схеме (рис. 12) component ANDOR

--декларация входных и выходного портов компонента,

--определение их типов как двоичных

port (e0, e1, e2 : in bit; z : out bit); end component;

--декларация внутреннего сигнала F и определение его

--типа как двоичного

signal F : bit; begin

--метка (а1) и описание использования компонента ANDOR

--в качестве левой обведенной штриховой линией части

--схемы (рис. 13), т. е. описание использования портов

--компонента в качестве портов объекта (x0, x1, x2,

--x3,x4, y) и передачи внутреннего сигнала F между

--частями схемы

a1 : ANDOR port map (x0, x1, x2, F);

-- аналогичное описание для правой части схемы a2 : ANDOR port map (F, x3, x4, y);

end example;

 

 

 

 

 

 

 

 

 

 

 

 

Метки (здесь a1 и a2), являющиеся одним

 

 

 

 

 

 

 

 

 

из частных случаев идентификаторов, в соответ-

 

 

 

&

 

 

 

1

 

 

 

 

 

 

 

 

e0

 

 

 

 

z ствии с синтаксисом VHDL, отделяются двоето-

 

 

 

 

 

 

e1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

чиями. Причем отдельные версии языка VHDL

 

 

 

 

 

 

e2

 

 

 

 

 

 

 

 

предполагают обязательное использование меток,

 

Рис. 12

 

 

а для некоторых версий (в частности, для версии,

 

 

 

 

 

 

 

 

 

 

соответствующей текстовому редактору изучае-

 

 

 

 

 

 

 

 

 

мой САПР) использование меток возможно, но не обязательно. Метки тоже относят к упомянутым в 6.1 пользовательским именам.

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

В двух составленных текстах описаний идентификаторы интерфейса и архитектуры записаны по-разному (с использованием больших и малых букв). Это не является ошибкой: компилятор САПР воспримет одинаково большие и малые буквы в текстах VHDL.

Отметим, что после компиляции соответствующих VHDL-текстов и программирования кристалла ПЛИС, в нем образуются структуры, построенные, например, по схемам (рис. 7, 10-13).

15

x0

&

1

F

&

1

y

 

 

 

 

 

 

 

 

 

 

x1

 

 

 

 

 

 

x2

x3

x4

Рис. 13

6.3. Основные элементы языка VHDL

Текст на языке VHDL есть последовательность отдельных лексических элементов, таких как комментарий, разделитель, оператор, идентификатор, абстрактный и символьный литералы.

Согласно 6.2 комментарии служат для документирования описаний объек-

тов.

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

Оператор в языке VHDL может быть представлен:

символом;

композицией (комбинацией) символов;

зарезервированным ключевым словом;

пользовательским ключевым словом;

комбинацией перечисленных выше вариантов представления операторов. Символы, являющиеся операторами, таковы (каждый из них указываем в

кавычках): "&", "( )", "*", "+", "?", "", ".", "/", ":", ";", "<", "=", ">", "|".

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

Некоторые из этих символов могут объединяться в пару. Получающаяся при этом композиция символов называется составным оператором. В языке VHDL имеются следующие составные операторы: "**", ":=", "/=", ">=", "<=", "<>".

Зарезервированные ключевые слова – это заранее составленные комбинации букв, имеющие определенное значение: abs, begin, case, downto, is, port, variable, xor, architecture, component, else, not, or, signal, type, elsif, for, if, other, process, when, end, range, then, all, entity, loop, next, on, to и др.

Список некоторых операторов приведен в табл. 4. Заметим, что исходя из контекста VHDL-кода, следует различать употребление оператора "<=" в смыс-

16

 

Таблица 4

 

 

Обозначение

Название

 

 

not

логическое НЕ

and

логическое И

or

логическое ИЛИ

xor

исключающее ИЛИ

ле назначения сигнала (см. 6.2) и употребление этого оператора в ином смысле (меньше либо равно).

Пользовательское ключевое слово составляется пользователем. Оно не должно совпадать ни с одним из зарезервированных ключевых слов и может использоваться, например,

=

равно

для обозначения какой-либо логиче-

/=

не равно

ской функции, описанной пользова-

<

меньше

телем.

 

 

 

<=

меньше либо равно

 

 

 

Комбинацией

перечисленных

 

(для переменных и

 

вариантов представления операторов

 

констант),

 

являются параллельные и некоторые

 

назначение сигнала

 

из последовательных операторов. В

 

(для сигналов)

 

дальнейшем будут приведены допол-

>

больше

нительные

сведения

об

операторах

>=

больше либо равно

языка VHDL, в частности, будут рас-

+

сложение, присвое-

смотрены параллельные и последова-

 

ние знака +

 

тельные операторы.

 

 

вычитание, присвое-

 

 

Идентификаторы

употребля-

 

ние знака –

 

ются как

пользовательские имена

&

конкатенация (объе-

(имена объектов и описаний, обозна-

 

динение, например,

 

чения портов и сигналов, метки и др.)

 

объединение линий в

 

и пользовательские ключевые слова.

 

шину)

 

Пример. В строке

 

 

*

умножение

 

 

 

A<=B and C;

/

деление

 

присутствуют шесть

лексических

rem

остаток

элементов: A, “<=”, B, and,

**

возведение в степень

C, “;”. Три из них являются опера-

abs

абсолютное значение

торами: <=(составной оператор на-

 

 

 

 

 

 

значения сигнала), and (зарезерви-

рованное ключевое слово), ;(символ – разделитель). Остальные элементы (A, B, C) могут быть, например, пользовательскими именами сигналов. При выборе идентификатора пользователь не должен допускать совпадение идентификатора с любым из зарезервированных ключевых слов.

Абстрактный и символьный литералы – это значения сигналов, перемен-

ных и констант. Абстрактный литерал имеет три формы: десятичную (десятич-

ные числа, например, 100, 13.67, 12E 2 12 10 и т. д.), базовую (двоичные, восьмеричные и шестнадцатеричные числа), физическую (значения физических величин с указанием единиц измерения, например, 10 ns – значение временного интервала). Символьные литералы – это составленные из букв и/или цифр символические наименования значений сигналов, переменных и

17

констант. Символьные литералы в VHDL-текстах заключаются в кавычки (на-

пример, x = ”error”).

6.4. Типы данных в языке VHDL

Данными в языке VHDL являются сигналы, порты (входные и выходные сигналы), переменные и константы. Тип данных – это поименованное множество значений с некоторыми общими характеристиками. Типы определяются обычно в описании архитектуры (см. 6.2).

В табл. 5 указаны основные типы данных для языка VHDL.

 

 

Таблица 5

Логические типы

Арифметические

Символьные типы

 

типы

 

BOOLEAN

INTEGER

CHARACTER

(булев)

(целый)

(символьный)

BIT

POSITIVE

STRING

(битовый,

(положительный)

(строковый)

т. е. двоичный)

 

 

BIT_VECTOR

NATURAL

_

(битовый вектор)

(натуральный)

 

_

REAL

_

 

(вещественный)

 

Многие из типов, указанных в табл. 5, не требуют каких-либо пояснений. Некоторые из них поясним.

Тип BOOLEAN – это данные, которые могут принимать одно из двух значений: TRUE (истина), FALSE (ложь). Заметим, что значения TRUE и FALSE данных типа BOOLEAN не эквивалентны значениям 1 и 0 данных типа BIT.

В отличие от типа BIT – множества одноразрядных двоичных величин, тип BIT_VECTOR соответствует многоразрядным (в общем случае) двоичным числам. Например, запись BIT_VECTOR (0 to 7) определяет восьмиразрядные двоичные числа, в которых младшие разряды записываются слева. BIT_VECTOR (7 downto 0) – восьмиразрядные двоичные числа, в которых младшие разряды записываются справа. Данный тип употребляется, в частности, для описания данных, передаваемых в параллельном двоичном коде по какой-либо шине.

Тип CHARACTER представляет собой множество символов кода ASCII, включающее в себя в том числе и те символы, которые набираются с клавиатуры сравнительно сложными способами.

Тип STRING – это заданные массивы каких-либо значений. Например, за-

пись STRING (“101”, “111”, “001”, “110”); или STRING (“5”, “7”, “1”, “6”); определяет массив из четырех 3-битных чисел: 101, 111,

18

001, 110. Запись STRING (“G2”, “EXIT”, “RUN”); определяет массив из трех комбинаций символов: G2, EXIT, RUN.

Кроме того, пользователю предоставляется возможность вводить и использовать свои собственные типы данных.

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

signal s : integer range -5 to 5;

или

signal s : integer range 5 downto -5;

определяет тип (INTEGER) сигнала s, представляемого 4-битным параллельным дополнительным кодом (старший из четырех разрядов знаковый) на некоторой шине устройства, при диапазоне значений сигнала от до . Аналогично

можно описывать передаваемые по шинам сигналы, определяя эти сигналы как данные иных арифметические типов. Например, тип NATURAL может соответствовать параллельным двоичным кодам без знаковых разрядов.

Запись

type bit_index range 0 to 31;

служит для ввода пользователем (декларации) нового типа (bit_index) данных – множества целых чисел от 0 до 31 (признаком целых чисел является их представление при отсутствии точки). После такой записи в VHDL-тексте может встретиться строка

signal g : bit_index range 5 to 18;

Такая строка определяет тип (bit_index) сигнала g, представляемого, например, 5-битным параллельным кодом на некоторой шине устройства, при диапазоне значений сигнала от 5 до 18 .

Строгая типизация в языке VHDL предполагает, что смешение различных типов в одной операции является ошибкой.

6.5. Декларация констант, сигналов, переменных

Декларации констант соответствуют следующие примеры (для констант с именами PI и DEFAULT):

constant PI : real := 3.14159;

constant DEFAULT : bit_vector (0 to 3) := “0101”;

Заметим, что для типов данных BIT_VECTOR и STRING значения записываются в кавычках (см. последнюю строку VHDL-текста), а значения данных всех арифметических типов, данных типов BOOLEAN и CHARACTER записываются без использования кавычек и им подобных элементов.

Примеры декларации сигналов приведены в конце 6.4.

Примеры декларации переменных:

-- декларация двух переменных с именами

19

-- ROW и COLUMN

variable ROW, COLUMN : integer range 0 to 31;

--декларация переменной f с присвоением ей значения

--логической единицы

variable f : bit := „1‟;

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

f:=‟0‟;.

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

6.6. Предопределенные атрибуты

Атрибуты (их относят к зарезервированным ключевым словам) – это элементы описания объектов языка VHDL. Важную роль играют атрибуты сигналов. Например, при описании какого-либо сигнала можно использовать атрибут event – один из так называемых предопределенных атрибутов. Его использование поясним на примере. Пусть для некоторого сигнала CLK записано: CLK‟event. Смысл этого выражения можно истолковать так: сигнал CLK изменился (предопределяется возможность изменения сигнала CLK). Выражения с использованием предопределенных атрибутов имеют тип BOOLEAN (в нашем примере выражение CLK‟event принимает значение TRUE, если значение сигнала CLK действительно изменилось).

6.7. Понятие о параллельных и последовательных операторах

Параллельные операторы в VHDL описывают те действия, которые должны выполняться в проектируемом устройстве параллельно (одновременно). Поэтому порядок записи параллельных операторов внутри тела архитектуры мо-

жет быть произвольным. Последовательные операторы выполняются в поряд-

ке их появления в VHDL-тексте.

6.8. Параллельный оператор процесса (process)

Внутри тела архитектуры может содержаться так называемое описание процесса, которое строится по следующей схеме:

имя_процесса : process (список чувствительностей)

...; -- декларативная часть begin

...; -- последовательные операторы end process имя_процесса;

20

Соседние файлы в папке ЦУМ