Линия
|
Необходим
|
Комментарии
|
LPM_WIDTH
|
Да
|
Разрядность
входных и выходных шин данных
|
LPM_DIRECTION
|
Нет
|
Значения
«ADD», «SUB»
или «UNUSED».По
умолчанию - «DEFAULT».
Если DEFAULT,
то исп. add_sub.
|
LPM_REPRESENTATION
|
Нет
|
Тип
входных значений: «SIGNED»
или «UNSIGNED».По
умолчанию - SIGNED.
|
LPM_PIPELINE
|
Нет
|
Задержка
в тактах перед получением результата result[].
По умолчанию 0.
|
Нет
|
Принимаетзначения:
«YES», «NO»
и «UNUSED».
Позволяет оптимизировать генерируемый код в случае применения констант. По
умолчанию NO.
|
MAXIMIZE_SPEED
|
Нет
|
Задает
способ оптимизации кода в сторону скорости, либо использованной области.
Переопределяет значение «Optimize»,
задаваемое в меню.
|
Настроим сумматоры. Сконфигурируем сумматор со
следующими параметрами:
Как видно, мы задали входные данные
восьмиразрядными беззнаковыми, что и требовалось по заданию. А LPM_DIRECTION
зададим извне, с использованием входа add_sub.Такой
выбор обоснован прежде всего учебным характером задания, то есть нет
необходимости оптимизировать код.
Сконфигурируем выходные линии (укажем
используемые выходы):
Хоть и в описании указано, что overflow не
рекомендуется применять с беззнаковыми числами, все же мы применим именно его,
так как он нам дает более удобные значения, нежели cout.
Cконфигурируем
входные линии, а именно зададим используемость входов:
Кроме обязательных входов дополнительно применим
входы cin и add_sub.
С помощью add_subбудем
управлять выполняемой сумматором операцией, а cin
позволит нам задавать тип кода: обратный либо дополнительный. (Обратный код -
отрицательные числа побитово инвертируются, а положительные не меняются.
Дополнительный код - отрицательные числа побитово инвертируются, затем
добавляется «1» к результату, положительные числа не меняются). Как известно,
обратный код требует прибавления к результату операции переноса со старшего
разряда, если таковой имеется, поэтому применим дополнительный код. Выполняемая
операция будет выглядеть следующим образом:
В зависимости от значения add_subпроизойдет
сложение прямого либо обратного кода Bи
прибавление cin. Если
сложение, то cin должен быть
равен «0», а если вычитание, то cin
должен равняться «1».
На рисунке 9 видно, что 2 сумматора имеют «0» на
входе add_sub,
и «1» на входе cin,
из чего следует, что результат будет представлен в дополнительном коде и
выглядит как (A-B)-C.
Результат получен, он представляет из себя
восьмиразрядное значение в дополнительном коде. Чтобы его перевести в понятный
прямой код, необходимо определить знак, и если он отрицательный, вычесть
результат из 0 той же разрядности. Поэтому добавим в схему дополнительный
сумматор, выполняемой операцией которого будет управлять комбинационная схема
определения знака результата функции. А константу 0 будем подавать от
отдельного устройства LPM_CONSTANT.
Осталось определить знак результата и наличие переполнения
(результат меньше «-255»). Значение на выходе overflowподчиняется
формуле .cout
для положительных чисел == 1 только когда A+B>=
256, для отрицательных == 1 - только когда A-B>=0.Из
этого следует, что overflow
для
положительных чисел == 1 только когда A+B>=
256, а для отрицательных - только когда A-B<0.
Наличие overflow
либо при первом, либо при втором вычитании позволит судить об отрицательности
результата, а если overflow
есть и при первом, и при втором вычитании, значит произошло переполнение
разрядной сетки операнда.
Покажем все это на примерах.
Пример 1: Y
= 2 - 1(вычитание в дополнительном коде, результат положительный):
Результат положительный (имеется перенос), в
прямом коде. Наличие переноса сформирует на выходе overflow
логический»0».
Пример 2: Y
= 2 - 2 (вычитание в дополнительном коде, результат равен нулю):
Результат положительный (имеется перенос), в
прямом коде. Наличие переноса сформирует на выходе overflow
логический»0».
Пример 3: Y
= 1 - 2 (вычитание в дополнительном коде, результат отрицательный):
Результат отрицательный (переноса нет), в
дополнительном коде. Наличие переноса сформирует на выходе overflow
логическую»1».
Пример 4: Y
= -255 - 2 (первый сумматор дал отрицательный результат):
Результат отрицательный, наличие переноса
текущего и предыдущего вычитаний говорит о переполнении разрядной сетки, и об
отрицательном знаке результата.
3.Добавление функции блокировки
По заданию необходимо блокировать запись в
регистр RA при
выполнении условия (RB
== 0). Блокировка записи в регистр возможна двумя методами, либо блокировать
возможность выбора регистра удерживанием логической «1» на входе EN,
либо блокированием сигнала копирования путем удерживания логической «1» на
входе WR.
Заблокируем возможность выбора регистра.
Блокировку выполним с применением логического
элемента ИЛИ. На один вход подадим сигнал выбора регистра от дешифратора, а на
второй - сигнал от компаратора. Причем компаратор должен выдавать логический
«0» при невыполнении блокирующего условия и логическую «1» - при выполнении.
Внешний вид полученной схемы представлен на
рисунке 10.
Рисунок 10. Блокировка записи RAпри
RB == 0.
Элемент LPM_COMPARE
является компаратором, который проводит сравнение чисел, поданных на входы dataa[]
иdatab[].Результат
сравнения выдается на выходные линии alb
(A<B),
aeb (A
== B), agb
(A>B),
ageb (A>=
B), aneb
(A !=B),
aleb (A<=
B).Также имеются
входы синхронизации и вход асинхронного сброса, которые нам не нужны.
Управляющие параметры элемента аналогичны параметрам сумматора, поэтому в
описании не нуждаются.
Компаратор выдает на выходную линию aeb
логическую «1» если значения на обоих шинах данных совпадут. Для сравнения RBсо
значением 0 на одну из шин подано значение RB,
а на другую - константа 0. На логический элемент ИЛИ подаются сигналы от
дешифратора и от компаратора. Если компаратор выдаст логическую «1», то регистр
RAневозможно будет
активировать.
3.1 Проверка работы измененной схемы
Измененная схема приведена на рисунке 11. Схема
выполнения логической функции показана в виде отдельного элемента SUB_B_AND_C_FROM_A.О
на имеет 3 входных шины данных, на которые подаем значения с регистров RB,
RA, RSA.
На выходе имеется шина данных результата функции RB
- RA - RSA
и линии OVERFLOW
и SIGN. SIGN
показывает знак результата («1» - минус), а OVERFLOW-переполнение
(«1» - результат < -255).
Проанализируем работу схемы. При этом зададим
последовательность адресов: . Первым пишем RB,
так как изначально он == 0, и блокирует запись в RA.
Вторым пишем RA. Затем
читаем дискретные входы, после чего выдаем результат.
. Проверим адресацию регистров и выходных
результатов. Для этого зададим требуемую последовательность адресов, в RAподадим
150, в RB100, а в SA-50.
Осциллограмма показана на рисунке 12. Как видно по осциллограмме, записи в
регистры и вывод результата проведены успешно, что говорит о верной работе
схемы адресации.
. Вызовем блокировку записи RA.Осциллограмма
показана на рисунке 13.Как видим по рисунку, в регистр RBзаписали
0, а в регистр RAзначение
111 не записалось, что подтверждает работу схемы блокировки записи в RA.
. Получим результат логической функции Y>
0. Для этого зададим RB
== 105, RA == 12, SA
== 47.Должны получить RB
- RA - SA
= 46.Осциллограмма показана на рисунке 14. Как видим результат совпал, получили
значение 46. Знак результата SIGN
- логический «0», что говорит о положительности результата. OVERFLOWтакже
равен логическому «0», что значит результат > -256.
. Получим результат логической функции Y==
0. Для этого зададим RB
== 105, RA == 58, SA
== 47. Должны получить RB
- RA - SA
= 0.Осциллограмма показана на рисунке 15. Как видим результат совпал, получили
значение 0. Знак результата SIGN
- логический «0», что говорит о положительности результата. OVERFLOWтакже
равен логическому «0», что значит результат > -256.
. Получим результат логической функции Y<
0. Для этого зададим RB
== 105, RA == 108, SA
== 47. Должны получить RB
- RA - SA
= -50.Осциллограмма показана на рисунке 16. Как видим результат совпал,
получили значение 50. Знак результата SIGN
- логическая «1», что говорит об отрицательности результата. OVERFLOWравен
логическому «0», что значит результат > -256.
. Получим результат логической функции Y<-255.
Для этого зададим RB
== 105, RA == 208, SA
== 247. Должны получить RB
- RA - SA
= -350.Осциллограмма показана на рисунке 17. Получили результат = 94. Знак
результата SIGN -
логическая «1», что говорит об отрицательности результата. OVERFLOWравен
логической «1», что значит результат < -255.Для получения истинного
результата необходимо прибавить к полученному результату -94 значение -256,
тогда получим - 350, что совпадает с расчетным результатом.
Полученные результаты позволяют судить о
правильно внесенных в исходную схему изменениях и верной работе полученной
схемы.
Рисунок 11. Измененная схема.
Рисунок 12. Осциллограмма работы устройства.
Рисунок 13. Осциллограмма работы при RB
== 0.
Рисунок 14. Осциллограмма работы при Y>
0.
Рисунок 15. Осциллограмма работы при Y
== 0.
Рисунок 16. Осциллограмма работы при (Y<
0) && (Y> -256)
Рисунок 17. Осциллограмма работы при Y<
-255.
Вывод
В ходе выполнения данной работы были изучены
базовые принципы построения и работы программируемых логических интегральных
схем (ПЛИС). В качестве примера рассматривались ПЛИС фирмы Altera.
Исследование проводилось с применением САПР Max+PlusII,
которая позволяет синтезировать схему для ПЛИС, отладить ее и смоделировать
работу системы.
В результате работы научились строить в
графическом редакторе цифровые схемы для ПЛИС, проводить моделирование
процессов, происходящих в элементах схемы, и изучили способы выполнения
различных логических и арифметических операций для ПЛИС с применением
возможностей САПРMax+PlusII.