fb_210700_ddm1_lbm2
.pdf
|
|
|
|
|
|
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