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

fb_210700_ddm1_lbm2

.pdf
Скачиваний:
8
Добавлен:
11.03.2016
Размер:
323.65 Кб
Скачать

 

 

 

 

 

 

Q

0

 

 

Q

1

 

 

 

Q 2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

in

 

T

T

 

 

 

 

T

T

 

 

T

T

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 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 − 1, а не в состояние 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), являющиеся одним

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

e0

 

 

&

 

 

 

1

 

 

 

 

 

 

 

 

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

ле назначения сигнала (см. 6.2) и

употребление этого оператора в ином

 

Обозначение

Название

not

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

and

логическое И

or

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

xor

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

=

равно

/=

не равно

<

меньше

<=

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

 

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

 

констант),

 

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

>

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

больше

>=

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

+

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

ние знака +

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

&

ние знака

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

 

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

 

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

 

шину)

*

умножение

/

деление

rem

остаток

**

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

abs

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

смысле (меньше либо равно).

Пользовательское ключевое слово составляется пользователем.

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

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

Комбинацией перечисленных вариантов представления операторов являются параллельные и некоторые из последовательных операторов. В дальнейшем будут приведены допол-

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

Идентификаторы употребля-

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

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

A<=B and C;

присутствуют шесть лексических элементов: A, “<=”, B, and, C, “;”. Три из них являются опера- торами: <=(составной оператор на-

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

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

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

ные числа, например, 100, 13.67, 12E-2 =12×10−2 и т. д.), базовую (двоич- ные, восьмеричные и шестнадцатеричные числа), физическую (значения физи- ческих величин с указанием единиц измерения, например, 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-битным параллельным дополнительным кодом (старший из четырех разрядов знаковый) на некоторой шине устройства, при диапазоне значений сигнала от −5 до +5. Аналогично

можно описывать передаваемые по шинам сигналы, определяя эти сигналы как данные иных арифметические типов. Например, тип 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]