Основы вычислительной техники. Методические рекомендации по курсовой работе. Учебное пособие
.pdf
Контрольный вопрос. Чему равно количественное значение числа А = 1.101?
Контрольное задание. По указанию преподавателя запишите для заданного модуля числа его прямой, обратный и дополнительный коды.
3.2.Преобразование прямого двоичного кода в обратный
иобратного кода в прямой
Для получения обратного двоичного кода из прямого двоичного кода воспользуемся логическим способом. Следует проанализировать знак числа и, если он положительный (в знаковом разряде – ноль),оставитьмодульизнакчислабезизменения;еслионотрицательный, проинвертировать числовую часть и оставить знак числа без изменения. Функциональная схема описанного преобразователя для восьмиразрядного двоичного числа приведена на рис. 3.1.
Учитывая основные свойства обратного кода, это устройство можно использовать и для преобразования обратного кода в прямой код.
1.Создайте новый проект code_convert. Создайте новый файл схемноговводаconvert_1s_complиустановитеегофайломверхнего уровня в иерархии проекта.
2.Выполните схемный ввод согласно рис. 3.1. Элемент типа WIRE выполняет в этой схеме роль буфера переименования цепей для старшего знакового разряда числа. Первый входной и выходной сигналы элемента XOR являются многоразрядными и имеют тип шины (Bus line).
3.Выполните компиляцию проекта.
Рис. 3.1. Схема преобразователя прямого кода в обратный для числа со знаком
31
4.Самостоятельноразработайтеплантестированияпреобразователя, включив в него крайние значения прямого кода (+0, –0, +127 и –127) и несколько промежуточных положительных и отрицательных значений.
5.Создайте файл временной диаграммы и добавьте на него входной и выходной сигналы устройства a[7..0] и b[7..0]. Для удобства отображения значений чисел разделите сигналы на знак
ичисловую часть. Выполните следующую последовательность действий для обоих сигналов. После выделения сигнала выполните команду Edit → Grouping → Ungroup…, затем выделите сигналы разрядов модуля числа (например, для сигнала a – разряды с a[6] по a[0]) и сгруппируйте их, выполнив после их выделения команду Edit → Grouping → Group… и указав произвольное мнемоническое имя для новой группы (например, a_mod). Аналогичным образом сгруппируйте сигнал знакового разряда и группу сигналов модуля числа, указав имя для новой группы, например SignA.|A|. В результате отображаемое для числа значение будет иметь разделитель между знаковым разрядом и его модулем (рис. 3.2).
Рис. 3.2. Отображение числа со знаком при моделировании
32
6. Выполните исследование преобразователя, реализовав план тестирования в среде моделирования. Проанализируйте полученные результаты, выполнив отображение значений сначала в двоичном виде, затем в десятичном. Убедитесь в правильности выполняемого преобразования.
В пояснительную записку включите снимок с экрана со схемой исследуемого преобразователя, пояснение о принципе его работы, полностью заполненный план тестирования и соответствующие ему снимкиэкранасрезультатамимоделированиясотображениемчисел в двоичном и в десятичном видах.
Контрольное задание. Используя полученные результаты моделирования, поясните неоднозначность представления нуля в прямом
иобратном кодах.
3.3.Преобразование прямого двоичного кода в дополнительный
идополнительного кода в прямой
Для преобразования числа из прямого кода в дополнительный воспользуемся следующим алгоритмом. Если старший (знаковый) разряд числа, записанного в прямом коде, хранит значение ноль, то число положительное и никаких преобразований не делается. Если же старший (знаковый) разряд числа, записанного в прямом коде, равен единице, то число отрицательное, все разряды числа, кромезнакового,инвертируются,акрезультатуприбавляетсяединица младшего разряда. Функциональная схема преобразователя для восьмиразрядного двоичного числа, реализующего описанныйалгоритм,приведенанарис.3.3.Вэтойсхемепреобразование выполняется для восьмиразрядного числа со знаком sign и модулем в прямом коде mod[6..0] в восьмиразрядный двоичный дополнительный код dop[7..0].
В состав преобразователя входят управляемый знаком sign прямого двоичного кода инвертор (элемент XOR) и сумматор adder_ inst, который прибавляет единицу младшего разряда, если знак числаотрицательный(sign=1).Посколькуединицамладшегоразряда подсуммируется к обратному коду модуля числа temp[6..0],
33
Рис. 3.3. Схема преобразователя прямого кода в дополнительный для числа со знаком
сложение должно выполняться во всех разрядах, как числовых, так и знаковом. Для этого на вход a[7..0] сумматора подается код
{sign,temp[6..0]}.
1.Продолжите работу в проекте code_convert. Создайте новый файл схемного ввода convert_2s_compl_fw и установите его файлом верхнегоуровня в иерархиипроекта.Выполнитесхемный вводсогласно рис. 3.3. Выполните компиляцию проекта.
2.Самостоятельноразработайтеплантестированияпреобразователя, включив в него крайние значения прямого кода (+0, –0, +127 и –127) и несколько промежуточных положительных и отрицательных значений.
3.Создайтефайлвременнойдиаграммыидобавьтенанеговходные и выходные сигналы устройства: sign, mod[6..0] и dop[7..0].
Для удобства анализа результатов сгруппируйте сигналы sign
иmod[6..0].
4.Выполните исследование преобразователя, реализовав разработанный план тестирования. Проанализируйте полученные результаты, отображая значения сначала в двоичном виде, затем в десятичном. Для сигнала dop[7..0] в десятичном виде используйте знаковый формат Signed Decimal; для сигнала mod[6..0] – формат без знака Unsigned Decimal. Убедитесь в правильности выполняемого преобразования.
34
В пояснительную записку включите снимок с экрана со схемой исследуемого преобразователя, пояснение о принципе его работы, полностью заполненный план тестирования и соответствующие ему снимкиэкранасрезультатамимоделированиясотображениемчисел в двоичном и в десятичном видах.
Контрольное задание. Используя полученные результаты моделирования, объясните результат преобразования нуля. Укажите диапазон возможных значений на выходе преобразователя.
Обратный преобразователь, выполняющий преобразование восьмиразрядного числа с использованием дополнительного кода dop[7..0] в восьмиразрядный прямой двоичный код со знаком sign
имодулем числа mod[6..0], представлен на рис. 3.4.
Всостав преобразователя входят управляемый знаком числа инвертор (элемент XOR) и сумматор adder-inst, который прибавляет единицу младшего разряда, если знак числа отрицательный (sign = 1). Поскольку единица младшего разряда подсуммируется к коду модуля числа, сложение должно выполняться только в числовых разрядах. Диапазон изменения отрицательных чисел при их представлении в дополнительном коде превышает диапазон измененияотрицательныхчиселвпрямомкоде,поэтомувсхемепредусмотрено формирование сигнала переполнения разрядной сетки
(overflow).
5. Продолжите работу в проекте code_convert. Создайте новый файл схемного ввода convert_2s_compl_bk и установите его файлом верхнего уровня в иерархии проекта. Выполните схемный ввод по рис. 3.4. Выполните компиляцию проекта.
Рис. 3.4. Схема преобразователя дополнительного кода в прямой для числа со знаком
35
6.Разработайте план тестирования преобразователя, включив в него крайние значения дополнительного кода (0, +127 и –128) и несколькоположительныхиотрицательныхпромежуточныхзначений.
7.Создайте файл временной диаграммы и добавьте на него входные и выходные сигналы устройства: dop[7..0], sign, mod[6..0]
иoverflow. Для удобства анализа результатов используйте настройки отображения сигналов, как в предыдущей схеме. Убедитесь в правильности выполняемого преобразования.
Контрольное задание. Используя полученные результаты моделирования, поясните результат преобразования нуля. Укажите диапазон возможных значений на входе и выходе преобразователя. Укажите условие возникновения единицы на выходе overflow.
Впояснительную записку включите снимок с экрана со схемой исследуемого преобразователя, пояснение о принципе его работы, полностью заполненный план тестирования и соответствующие ему снимкиэкранасрезультатамимоделированиясотображениемчисел
вдвоичном и в десятичном видах.
Сохраните архив проекта в портфолио.
3.4. Сложение чисел со знаком в дополнительном коде
Сложение чисел в формате с фиксированной запятой в дополнительномкодебудетреализованонатомжедвоичномсумматоре, на котором выполнено сложение чисел без знака. В самом двоичном сумматоре не потребуется каких-либо структурных изменений, но дополнительно реализуется сигнал переполнения разрядной сетки overflow.
1.Создайте новый проект с именем adder_2s_compl. При создании проекта укажите путь к проекту adder_mod в качестве пользовательской библиотеки. В остальном следуйте тем же шагам, что
ипри создании проекта adder_mod (см. гл. 1).
2.Создайте файл схемного ввода с именем adder_2s_compl.bdf.
3.Добавьте на схему созданный ранее библиотечный модуль двоичного комбинаторного сумматора модулей чисел. Подключите к нему все необходимые элементы ввода и вывода.
36
Рис. 3.5. Общий вид схемы сумматора чисел со знаком в дополнительном коде
Для этого щелкните правой кнопкой по символу и выполните команду Generate Pins for Symbol Ports.
4.Дополните схему сумматора схемой формирования сигнала переполнения(вместоблокаOverflowLogicнарис.3.5).Реализуйте схему формирования сигнала переполнения ovf самостоятельно,всоответствиисиндивидуальнымзаданием(см.прил.2,варианты представления чисел в дополнительном коде).
5.Выполните компиляцию проекта (анализ и синтез).
Далее следуйте рекомендованной в разд. 2.3 программе тестирования. Создайте и заполните в соответствии с индивидуальным заданием(см.прил.2)таблицуспланомтестированиякомпаратора. Дополните использованный ранее шаблон таблицы с планом тестирования столбцом для значений сигнала ovf. Для интерпретации двоичных значений в десятичной системе счисления используйте формат числа с одним или двумя знаковыми разрядами в соответствии с индивидуальным заданием. В табл. 3.1 приведен пример такого плана тестирования.
Контрольное задание 1. По указанию преподавателя модифицируйте входные данные теста и объясните полученные результаты.
Контрольноезадание2.Объясните значения, полученные в столбце cout. Почему они отличаются от значений overflow?
Контрольноезадание3.Пояснитевеличинувесабитапереносаcin. В пояснительную записку включите снимок с экрана со схемой исследуемого сумматора, полностью заполненный план тестирования и соответствующийемуснимокэкранасрезультатамимоделирования.
Сохраните архив проекта в портфолио.
37
38
Таблица 3.1
Пример заполнения таблицы с планом тестирования для сумматора в дополнительных кодах
|
|
|
Входные воздействия |
|
|
|
Результат |
||||
|
Тест |
A[7..0] |
B[7..0] |
S[7..0] |
|
ovf |
cout |
Соответствует |
|||
|
|
|
|
|
|
|
|
|
ожидаемому |
||
|
|
двоичное |
десятичное |
двоичное |
десятичное |
двоичное |
десятичное |
|
|||
|
|
|
|
|
|||||||
|
Без пере- |
0 0000 101 |
0,625 |
0 0101 000 |
5,0 |
0 0101 101 |
5,625 |
|
0 |
0 |
Да: 0,625 + 5,0 = 5,625 |
|
полне- |
|
|
|
|
|
|
|
|
|
|
|
0 0101 101 |
5,625 |
0 0001 001 |
1,125 |
0 0110 110 |
6,75 |
|
0 |
0 |
Да: 5,625 + 1,125 = 6,75 |
|
|
ния |
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
A > 0, |
С пере- |
0 1000 101 |
8,625 |
0 1001 011 |
9,375 |
1 0010 000 |
–14,0 |
|
1 |
0 |
Да, из-за переполнения |
полне- |
|
|
|
|
|
|
|
|
|
получен результат с про- |
|
B > 0 |
нием |
|
|
|
|
|
|
|
|
|
тивоположным знаком |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 1001 111 |
9,875 |
0 1010 100 |
10,5 |
1 0100 011 |
–11,625 |
|
1 |
0 |
Да, из-за переполнения |
|
|
|
|
|
|
|
|
|
|
|
получен результат с про- |
|
|
|
|
|
|
|
|
|
|
|
тивоположным знаком |
|
|
|
|
|
|
|
|
|
|
|
|
|
Без пере- |
1 1000 101 |
–7,375 |
1 1001 011 |
–6,625 |
1 0010 000 |
–14,0 |
|
0 |
1 |
Да: –7,375 – 6,625 = –14 |
|
полне- |
|
|
|
|
|
|
|
|
|
|
|
1 1001 111 |
–6,125 |
1 1010 100 |
–5,5 |
1 0100 011 |
–11,625 |
|
0 |
1 |
Да: –6,125 – 5,5 = –11,625 |
|
|
ния |
|
|||||||||
A < 0, |
С пере- |
1 0000 101 |
–15,375 |
1 0101 000 |
–11,0 |
0 0101 101 |
5,625 |
|
1 |
1 |
Да, из-за переполнения |
B < 0 |
полне- |
|
|
|
|
|
|
|
|
|
получен результат с про- |
нием |
|
|
|
|
|
|
|
|
|
тивоположным знаком |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 0101 101 |
–10,375 |
1 0001 001 |
–14,875 |
0 0110 110 |
6,75 |
|
1 |
1 |
Да, из-за переполнения |
|
|
|
|
|
|
|
|
|
|
|
получен результат с про- |
|
|
|
|
|
|
|
|
|
|
|
тивоположным знаком |
|
|
|
|
|
|
|
|
|
|
|
|
|
Положи- |
0 1001 011 |
9,375 |
1 1000 101 |
–7,375 |
0 0010 000 |
2,0 |
|
0 |
1 |
Да: 9,375 – 7,375 = 2 |
|
тельный |
|
|
|
|
|
|
|
|
|
|
|
0 1010 100 |
10,5 |
1 1001 111 |
–6,125 |
0 0100 011 |
4,375 |
|
0 |
1 |
Да: 10,5 – 6,125 = 4,375 |
|
A > 0, |
результат |
|
|||||||||
B < 0 |
|
|
|
|
|
|
|
|
|
|
|
Отрица- |
0 0101 000 |
5,0 |
1 0000 101 |
–15,375 |
1 0101 101 |
–10,375 |
|
0 |
0 |
Да: 5,0 – 15,375 = –10,375 |
|
|
тельный |
|
|
|
|
|
|
|
|
|
|
|
0 0001 001 |
1,125 |
1 0101 101 |
–10,375 |
1 0110 110 |
–9,25 |
|
0 |
0 |
Да: 1,125 – 10,375 = –9,25 |
|
|
результат |
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
3.5. Сравнение чисел со знаком в дополнительном коде
Для сравнения представленных в дополнительном коде чисел со знаком a[] и b[] следует рассмотреть возможные соотношения этих чисел.
Если знаки a[] и b[] различны, то результат можно однозначно определить по знаку операнда b[]. В этом случае, если знак b[] отрицательный, то всегда выполняется условие a[] ≥ b[].
Если знаки a[] и b[] одинаковы, то следует сравнивать модули чисел, для чего потребуется сумматор. Выполняется операция вычитания s[] = a[] – b[] и анализируется знак s[]. Рассмотрим два варианта, когда сравниваются положительные и отрицательные числа.
Вариант сравнения положительных чисел: a[] ≥ 0 и b[] ≥ 0. Если при этом |a| ≥ |b|, т. е. a[] ≥ b[], то
s[] = 0 + |a| +1 +1 – |b| = 10 + (|a| – |b|),
и в разряде знака s[] окажется 0. Если же при этом |a| < |b|,
т. е. a[] < b[], то
s[] = 0 + |a| +1 +1 – |b| = 1 + 1 – (|b| – |a|)
и в разряде знака s[] окажется 1.
Вариант сравнения отрицательных чисел: a[] < 0 и b[] < 0. Если при этом |b| ≥ |a|, т. е. a[] ≥ b[], то
s[] = 1 + 1 – |a| + 0 + |b| = 10 + (|b| – |a|),
и в разряде знака s[] окажется 0. Если же при этом |a| ≥ |b|,
т. е. a[] < b[], то
s[] = 1 + 1 – |a| + 0 + |b| = 1 + 1 – (|a| – |b|),
и в разряде знака s[] окажется 1.
Таким образом может быть получено логическое выражение для выхода компаратора:
ageb = (an–1 bn–1) & bn–1 | ~(an–1 bn–1) & ~sn–1),
где an–1, bn–1 и s n–1 – старшие (знаковые) разряды сравниваемых чисел и суммы.
Выполните исследование по следующей программе.
1. Создайте новый проект с именем comp_2s_compl. При создании проекта укажите путь к проекту adder_mod в качестве
39
Рис. 3.6. Схема компаратора на больше либо равно для чисел со знаком в дополнительном коде
пользовательской библиотеки. В остальном следуйте тем же шагам, что и при создании проекта adder_mod (см. гл. 1).
2.Создайте файл схемного ввода с именем comp_2s_compl.bdf.
3.Добавьте на схему созданный ранее библиотечный модуль двоичного комбинаторного сумматора модулей чисел comb_adder.
4.Дополните схему элементами ввода и вывода, как показано нарис.3.2.Вэтойсхемесигналыs[7..0] и coutносятвспомогательный характер и для работы компаратора не требуются, но могут потребоваться для объяснения работы устройства.
5.Доработайте схему, введя логическую схему формирования сигнала сравнения ageb (блок Comparator Logic на рис. 3.6).
6.Выполните компиляцию проекта (анализ и синтез).
Далее следуйте рекомендованной в разд. 2.3 программе тестирования. Создайте и заполните в соответствии с индивидуальным заданием (см. прил. 2) таблицу с планом тестирования компаратора. Дополнительно включите в план тестирования случай, когда a[] = b[].
Контрольноезадание.Поуказаниюпреподавателямодифицируйте схемукомпараторапорис.3.6длявыполненияоперацииagb(a[]>b[]).
В пояснительную записку включите снимок с экрана со схемой исследуемого компаратора, полностью заполненный план тестирования и соответствующий ему снимок экрана с результатами моделирования.
Сохраните архив проекта в портфолио.
40
