Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка (НСиНК) - лабораторные работы.doc
Скачиваний:
24
Добавлен:
15.04.2015
Размер:
356.35 Кб
Скачать

1.4. Генератор кода

Сформированная пользователем команда, входные значения, константы разбиения и другая введённая пользователем информация используются для генерирования листинга ассемблерного кода. В листинге определены секция данных (значения, определённые пользователем) и секция кода – пример реализации функции с вызовом векторной команды. Генератор кода включается кнопкой "Code".

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

2. Порядок выполнения работы

  1. Запустите программу NMCalculator, разверните её на весь экран и выберите в главном меню: Setup -> Step of grid -> 5 для 15” монитора или Setup -> Step of grid -> 6 для 17” монитора.

  2. Для начала рассмотрим несколько простых и очевидных примеров использования операции взвешенного суммирования. Выполните следующие действия.

  • Выберите операцию взвешенного суммирования, установив флажок на индикаторе vsum .

  • Разбейте рабочую матрицу на 16 строк по 4 бита. Для этого выберите из выпадающего списка поля sbl нужное значение. Данное значение будет автоматически скопировано и в старшую часть этого регистра.

  • В результате такого разбиения получилась матрица из 16 ячеек. Теперь в каждую ячейку запишите весовой коэффициент, равный 1. Для этого, щёлкая правой кнопкой мыши на ячейке, выберите пункт всплывающего меню Set element… и в появившемся окне введите 1.

На этом конфигурирование векторного процессора заканчивается, и он настроен на выполнение определённой функции. Остаётся подать исходные данные на входы Х и Y рабочей матрицы, и мы получим результат вычислений в регистре afifo . Если введено/выведено менее 16-ти цифр, то предполагается, что слева число дополняется недостающими нулями. Итак, посмотрим, что же мы получили в результате. Если всё сделали правильно, то в afifo будет число 10 h (16), т.е. это просто сумма 16 4-разрядных тетрад, каждая из которых равна 1 h (0001 b ). Далее выполните следующее.

  • Подайте на вход Y 2 h . Как видите, она прибавляется к результату.

  • Измените значение на входе X таким образом, чтобы результат снова стал равным 10 h . Занесите в отчет это значение.

  • Верните начальные значения входов Х (=1111111111111111 h ) и Y (=0 h ).

  • Измените конфигурацию рабочей матрицы: установите в ноль значение весового коэффициента самой нижней ячейки. При этом значение результата должно стать на единицу меньше ( fh ). Объясните, почему это происходит. Пояснения занесите в отчет.

  • Удалите одну единицу со входа Х. Какую, по-вашему, единицу вы удалили – старшую или младшую? Как при этом изменится результат? Запомните это для себя.

  • Теперь повторите последние 3 пункта, но весовой коэффициент надо установить в ноль не нижней ячейки, а самой верхней. Обратите внимание, что при удалении одной единицы со входа Х, т.е. замене его старшей тетрады на ноль, результат в afifo уже не уменьшается на 1, как прежде. Объясните, почему это происходит. Пояснения занесите в отчет.

  • Верните начальные значения входов Х (=1111111111111111 h ), Y (=0 h ) и конфигурацию рабочей матрицы.

  • Разбейте рабочую матрицу на 2 столбца по 32 бита каждый. Задайте значения весовых коэффициентов рабочей матрицы в левом столбце следующими: самый нижний -1, второй снизу 2 h , а остальные оставьте равными 0. Для того чтобы ввести -1, не обязательно переводить её в ffffffffh , можно вводить прямо в десятичной системе, установив переключатель в окне ввода весового коэффициента на Decimal . Проанализируем результат: 100000010. Младшие 8 цифр (00000010) – это результат прошлой операции по сложению всех тетрад входа Х плюс младшие 32 разряда входа Y . А вот старшие 8 цифр (00000001) – это результат новой операции, которая равна удвоенному значению второй тетрады за вычетом первой тетрады и плюс старшие 32 разряда входа Y . Таким образом, мы запрограммировали векторный узел процессора на одновременное выполнение двух операций над одними и теми же входными данными. Например, можно разбить матрицу на три столбца следующим образом: 5/27/32 или 1/2/21/40. Допустимо использование не всей матрицы.

  • Измените слово на входе Х на следующее: 11 h . Выпишите результат операции в отчет и объясните его.

  • Измените слово на входе Х на следующее: 1 h . Выпишите результат операции в отчет и объясните его.

  1. Теперь вам предстоит самостоятельно запрограммировать рабочую матрицу на вычисление 64-разрядного вектора, который в последующих пунктах будет использоваться вами. Для этого потребуются числа дней рождения студентов вашей бригады. Исходя из того, что в месяце максимальное число дней 31 = 1 Fh , для разрядности входных данных достаточно 8 бит. Числа необходимо перевести в шестнадцатеричную систему и при необходимости дополнить слева нулём до двух шестнадцатеричных цифр. Затем эти числа записываются по порядку в поле Х. Например, если после перевода получились числа 1 Ah и Ch , то в поле Х их надо ввести так: 1 A 0 C или так: C 1 A , но не так: 1 AC . Это важно потому, что иначе данные не будут соответствовать разбиению матрицы и результат будет отличен от ожидаемого. Теперь разбейте рабочую матрицу на 64 ячейки (8 бит х 8 бит). В каждом столбце будут выполняться свои операции, которые перечислены ниже в порядке от младших разрядов к старшим. Для их проведения, необходимо задать нужные весовые коэффициенты и при необходимости соответствующие разряды слова на входе Y . В результате получится искомый вектор, отдельные части которого являются решениями этих задач. Итак, задачи.

  1. Вычислите сумму всех дней рождения.

  2. Из самого большого дня рождения вычтите остальные.

  3. Из суммы всех дней рождения, кроме самого малого, вычтите самое малое, умноженное на 3 h .

  4. Вычислите сумму произведений всех дней рождения и соответствующих им месяцев.

  5. Вычислите сумму всех дней рождения за вычетом их количества.

  6. Вычислите сумму всех дней рождения плюс их количество.

  7. Младший байт входа Х.

  8. Противоположное значение старшего байта входа Х, отличного от 00 h .

Значение входов Х, Y, выхода в afifo и конфигурацию рабочей матрицы (в виде таблицы весовых коэффициентов) занесите в отчет в шестнадцатеричной системе.

  1. Кнопкой Clear all очистите конфигурацию процессора. Результат прошлой операции занесите в поле Х . Сейчас необходимо с помощью операции взвешенного суммирования поменять местами тетрады в слове Х . Подумайте, как это сделать. Значение выхода в afifo и конфигурацию рабочей матрицы (в виде таблицы весовых коэффициентов) занесите в отчет.

  2. Кнопкой Clear all очистите конфигурацию процессора. Теперь рассмотрим операции векторного АЛУ. Векторное АЛУ в отличие от скалярного работает над 64-разрядными данными. Чтобы его использовать, снимите флажок vsum. Помните, что разбиение на элементы при использовании векторного АЛУ одинаково для входов Х и Y и задаётся регистром nb . Занесите в поле Y результат, полученный в пункте 3, поле Х оставьте равным 0, а разбиение задайте произвольно. Выберите операцию вычитания. В результате получим: afifo = XY . Значения входов Х, Y, выхода afifo и выполняемую операцию занесите в отчет в шестнадцатеричной системе. Рекомендуется записывать в столбик – цифра под цифрой.

  3. Сложите на векторном АЛУ результат прошлой операции с результатом пункта 3, не меняя разбиения. Занесите данные, результат и операцию в отчет. Результат должен быть равен 0 h.

  4. Проинвертируйте побитно на векторном АЛУ результат пункта 3. Подумайте, какие для этого нужно выбрать операции, значения входов Х, Y и разбиение на элементы. Занесите данные, результат и операцию в отчет в двоичной системе. Убедитесь в правильности результата.

  5. Поочерёдно выполните побитовые операции and, or и xor над результатами предыдущего пункта и пункта 3. Все данные, результаты и операции занесите в отчет в двоичной системе. Убедитесь в правильности результатов.

  6. Кнопкой Clear all очистите конфигурацию процессора. Рассмотрим операцию маскирования. Выполните операцию маскирования с векторным умножением, настроив процессор согласно первому примеру в пункте 1, но на Y подайте не 0, а то же, что на Х (1111111111111111 h). При этом вектор масок задайте равным: ffffffffffffffff h и 0 h . Все данные, результаты и операции занесите в отчет. Убедитесь в правильности результатов.

  7. Кнопкой Clear all очистите конфигурацию процессора. Выполните операцию логического маскирования, задав на вход Х результат пункта 3, на вход Y 8888888888888888 h и Mask = f0f0f0f0f0f0f0f0 h . Все данные, результаты и операции занесите в отчет. Убедитесь в правильности результатов.

  8. Кнопкой Clear all очистите конфигурацию процессора. Рассмотрим обработку данных функцией активации. Выполните операцию арифметической активации входа Х, складывая Х (=f31f05) с нулём на векторном АЛУ. При этом задайте разбиение на элементы по 8 бит с верхним порогом насыщения, равным 15, и соответственно нижним, равным 6. Все данные, результаты и операции занесите в отчет в двоичной системе. Убедитесь в правильности результатов.

  9. Кнопкой Clear all очистите конфигурацию процессора. Выполните операцию логической активации входа Х, приняв Х равным результату пункта 3. Используйте операцию and с Y = ffffffffffffffff h . При этом разбиение на элементы задайте равным 16 элементам по 4 бита каждый. Все данные, результаты и операции занесите в отчет в двоичной системе. Убедитесь в правильности результатов.

  10. Кнопкой Clear all очистите конфигурацию процессора. Рассмотрим операцию циклического сдвига вправо операнда Х. Задайте всей матрице как одной ячейке весовой коэффициент, равный 1 h , чтобы она просто складывала Х и Y . Выполните операцию взвешенного суммирования операндов Х (=0000000000000001 h ) и Y (=0 h ) два раза: с и без операции shift . Все данные, результаты и операции занесите в отчет. Убедитесь в правильности результатов.