Необходимые материалы для лекции Logisim-06.zip и Verilog-06.zip.
Арифметико-логическое устройство (АЛУ) - это один из ключевых компонентов процессора, отвечающий за выполнение арифметических и логических операций. Оно играет важную роль в обработке данных и выполнении команд, которые задаются программами.
Упрощенно в АЛУ можно определить следующие основные функции:
АЛУ можно классифицировать по ряду признаков, приведенных ниже:
Классификация по способу представления данных:
Классификация по способу действия над операндами:
Классификация по использованию систем счисления:
Классификация по характеру использования элементов и узлов:
На рисунке 6.1 приведена блок схема АЛУ, отражающая основные узлы и операции, выполняемые в данном устройстве. Помимо операндов на АЛУ подаются управляющие сигналы, осуществляющие переключения внутри блоков и их коммутацию, тем самым определяя заданную операцию в определенный момент времени.
(рис 6.1)
Логический блок, как было отмечено выше, реализует побитно логические операции над поступающими на его входы операнды. Для двух четырехразрядных слов выполнение операции AND (логическое "И") осуществляется на четырех двухвходовых конъюнктурах (рисунок 6.2). Подобным образом реализуются другие логические функции, заложенные в конкретное АЛУ.
(рис 6.2)
Основной элементарной операцией, выполняемой над кодами чисел в цифровых устройствах, является арифметическое сложение. Сложение выполняется в цифровом устройстве - сумматоре.
Сумматор - комбинационная схема, выполняющая арифметическое сложение кодов двух чисел. Этот узел лежит в основе арифметико-логического устройства.
Полусумматор (half adder) - простейшее цифровое устройство, являющееся звеном сумматора. Это устройство реализует сложение двух одноразрядных двоичных чисел А и В. В результате получается двухразрядное двоичное число. Его младшую цифру обозначают S (лат. summa), а старшую, которая будет перенесена в старший разряд, - Co (англ. carry out - выходной перенос). В таблице 6.1 приведена таблица истинности полусумматора. На рисунке 6.3 приведена схема моделирования полусумматора.
| Слагаемые | Перенос | Сумма | |
|---|---|---|---|
| A | B | Co | S |
| 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 |
| 1 | 0 | 0 | 1 |
| 1 | 1 | 1 | 0 |
(рис 6.3)
Полусумматор имеет два входа (слагаемые) и два выхода - сумму в данном разряде и перенос в следующий разряд. Из схемы и таблицы видно, что перенос формируется логической функции AND (И): $$Co =A \wedge B $$.
Для составления логической функции для S можно обратиться к логическому конвертеру - функция "Исключающее ИЛИ " (XOR).
При сложении старших разрядов многоразрядных двоичных слов необходимо в схеме учесть перенос из предыдущего (младшего) разряда. Такое устройство является полным сумматором (full adder). Оно должно иметь три входа: А и В - одноименные разряды двух складываемых чисел, Сi - входной перенос из предыдущего (младшего) разряда (англ. carry in - входной перенос) и два выхода: S - сумма в данном разряде и Co - перенос в следующий (старший) разряд.
Таблица истинности для одноразрядного сумматора приведена в таблице 6.2.
| Входные сигналы | Выходные сигналы | |||
|---|---|---|---|---|
| A | B | Ci | S | Co |
| 0 | 0 | 0 | 0 | 0 |
| 1 | 0 | 0 | 1 | 0 |
| 0 | 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 0 | 1 |
| 0 | 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 0 | 1 |
| 1 | 1 | 1 | 0 | 1 |
| 1 | 1 | 1 | 1 | 1 |
Сумматор удобно представить в виде двух полусумматоров, из которых первый суммирует разряды А и В, а второй к результату прибавляет бит переноса Ci (рисунок 6.4). Цепь D1_1, D1_2 обеспечивает формирование сигнала S. При возникновении лог. "1 " на одном из входов либо при наличии на всех входах лог "1 ". Элемент D2_1 обеспечивает возникновении лог. "1 " на выходе Co элемента "ИЛИ " D3_1(при наличии одного из слагаемых А или В и сигнала переноса из младших разрядов Сin). Элемент D2_2 обрабатывает возникновение переноса, когда на входах А и В присутствуют лог. "1 ".
(рис 6.4)
Приведенная выше схема широко представлена в литературе, но при реализации данного устройства в виде микросхем, схема сумматора значительно отличается.
В листинге 6.1 приведен код полного сумматора на языке Verilog HDL. На рисунке 6.5 приведен данный узел на уровне RTL.
module full_adder ( input wire A, // бит операнда А input wire B, // бит операнда В input wire Cin, // вход переноса Cin output wire Sum, // S выход сумма output wire Co // Выход переноса Co ); // получаем сумму assign Sum = A ^ B ^ Cin; // Формирование переноса assign Co = (A B) | (Cin (A ^ B)); endmodule
(рис 6.5)
В системе ЕСКД сумматоры изображаются так, как представлено на рисунке 6.6а ( вход Cin может замется на $$P_i$$, выход $$Co - P_{i+1}$$). На рисунке 6.6б приведено УГО сумматора в системе ANSI. Условное буквенное обозначение сумматоров на схемах - SM.
(рис 6.6)
Обратной схемой сумматора является субтрактор - вычитатель. В двоичнм коде принцип субтрактора, анлогичен работе сумматора. За исключением переноса. В данном случае он занимает из старших разрядов, а выход Bo сигнализирует, что на выходе вычитания получено отрицательное число. По внтуреннему устройству субтрактор схож с сумматором. На рисунке 6.7 приведена блок - схема двооичного вычитателя с последовательным переносом (заем).
(рис 6.7)
На рискунке 6.8 приведена схема функциональная полувычитателя. На рисунке 6.9 приведена схема функциональная полного вычитателя. Выход разности именуется D (англ. Difference).
(рис 6.8)
(рис 6.9)
Сравнивая схему на рисунке 6.9 со схемой на рисунке 6.4, можно наблюдать отличия только в применении инверторов, которые обеспечивают получение обратного кода. С ним и производится опять же операция сложения. В листинге 6.2 приведен код для субтрактора на языке Verilog HDL. На рисунке 6.10 приведен данный узел на уровне RTL.
module subtractor_1bit ( input wire A, // Уменьшаемое А input wire B, // Вычитаемое В input wire Bin, // Вход переноса Bin output wire D, // Выход разности output wire Bo // Выход заема ); //Выполнение операции "Исключающее ИЛИ ", аналогично сложению assign D = A ^ B ^ Bin; // Получение сигнала Bo assign Bo = (~A (B | Bin)) | (Bin ~A); endmodule
(рис 6.10)
В среде Logisim разрядность сумматора и вычитателя ограничена 64 битами. Для увеличения разрядности обрабатываемых слов применяются различные схемы включения. Для увеличения разрядности сумматоров применяется каскадное включение. Выход переноса Co младшего сумматора подключается к входу Cin старшего сумматора (рисунок 6.11). Каскадное последовательное включение сумматоров снижает быстродействие всей схемы сложения в силу увеличения времени задержки прохождения сигнала переноса из младшего сумматора в старший. Для повышения быстродействия схема с последовательным включением переносов не применяется. Для этого применяются специальные цифровые блоки - схемы ускоренного переноса (СУП), которые описаны в литературе [2].
(рис 6.11)
Также для упрощения организации АЛУ возможно отказаться от блока вычитателя, специальным образом организовав коммутацию операнда вычитаемого на сумматоре. Вычитание осуществляется, путем сложения в дополнительных кодах. Для этого вычитаемое, например, операнд В проходит процедуру инверсии - будет получен обратный код числа. На вход Cin будет подан сигнал с уровнем лог. "1 ", обеспечив тем самым дополнительный код. Упрощенная схема организации операции вычитания приведена на рисунке 6.12
(рис 6.12)
Так же в АЛУ выполняется и операция сдвига слов. Хотя существуют сдвиговые регистры, но применение сдвиговых регистров в процессоре в ядре процессора нецелесообразно по следующим причинам:
В АЛУ могут осуществляться два вида сдвига: логический влево/вправо
Поэтому для организации операций сдвига в АЛУ применяются мультиплексоры. Рассмотрим организацию сдвига на примере четырехразрядного слова. Для этого будут применятся мультиплексоры, коммутирующие четыре линии (необходимо 4 мультиплексора).
Поэтому для организации данной операции применяются мультиплексоры. Рассмотрим организацию сдвига на примере четырехразрядного слова. Для этого будут применятся мультиплексоры, коммутирующие четыре линии (необходимо 4 мультиплексора).
На рисунке 6.13 приведена функциональная схема устройства логического сдвига. Блок D1 - младший мультиплексор, D4 - старший. Входы сдвигаемого слова Х0-Х4 будут подключены следующим образом. Х0 подключается к входу 0 мультиплексора D1, входу 1 мультиплексора D2, входу 2 мультиплексора D3, входу 3 мультиплексора D4. Вход X1 к 0 входу D2, к 1 входу D3, к входу 2 D4. Вход X2 к 0 входу D3, к 1 входу D4. Вход Х3 к 0 входу D4. За счет такого перекрестного включения линий фактически и организован сдвиг слова.
Адресные входы А0, А1 у всех мультиплексоров объединенны. Этими входы управления определяют сдвиг входного слова. Представленная схема осуществляет сдвиг в сторону старших разрядов (сдвиг влево).
(рис 6.13)
При сдвиге старшие биты будут фактически замещены 0 с неиспользуемых входов (для неиспользуемые входы необходимо подключит к контактам "Земли ", либо константе "0 ". При необходимости сохранения данных из старших разрядов большего слова, неподключенные входы должны будут подключены к старшим разрядам входного сдвигаемого слова. Если же необходимо обеспечить циклический сдвиг слова схему можно видоизменить. Для этого добавить входу управления, назовем его Ci. Далее на схему добавить двухвходовые элементы "И ". Один вход подключить к Ci. Остальные входы подключить к Х1, Х2, Х3 соответственно. Выходы с элементов завести на неиспользуемые входы мультиплексоров. На рисунке 6.14 приведена видоизмененная схема, обеспечивающая циклический сдвиг. Выход D5 подключить к входу 1 D1, входу 2 D2, входу 3 D3. Выход D6 подключить к входу 2 D1, входу 3 D2. Выход D7 подключить к входу 3 D1.
(рис 6.14)
В листинге 6.3 приведен пример реализации поведенческого описания схемы логического сдвига, показанного на рисунке 6.13 на языке Verilog HDL.
module logi_shift (X, A, Q);//определение модуля и имен сигналов input [3:0] X;//вход свдигаемого слова input [1:0] A;// селектор управляющий сдвигом output reg [3:0] Q;//шина данных выходного слова always @(X or A) // анализируем изменения сигналов на входе данных или //селектора begin case (A)//анализируем состояние селектор 2'b00: Q = X;// входные данные поступают на выход без сдвига 2'b01: Q = X<<1;// сдвиг на один бит влево 2'b10: Q = X <<2;//сдвиг на два бита влево default: Q = X <<3;//сдвиг на три бита влево endcase end endmodule
На рисунке 6.15 представлен данный цифровой блок на уровне RTL.
(рис 6.15)
В среде Logisim Evolution в разделе "Арифметика " находятся узлы, которые будут применятся для проектирования АЛУ процессора.
В таблице 6.3 приведено условно-графическое обозначение, применяемых элементов и назначение сигналов.
| Наименование блока (арифметических операций) | Условно-графическое обозначение | Назначение сигналов |
|---|---|---|
| Сумматор | ![]() |
1 -вход первого слагаемого (шина данных); 2 - вход второго слагаемого (шина данных); 3 - вход переноса из младшего сумматора; 4 - выход результата суммы (шина данных); 5 - выход переполнения (в старший сумматор). |
| Субтрактор (Вычитатель) | ![]() |
1 - вход уменьшаемого (шина данных); 2 - вход вычитаемого (шина данных); 4 - выход результата разности (шина данных); 5 - выход займа (в старший вычитатель). |
| Умножитель (Множитель) | ![]() |
1 - вход множимого (шина данных); 2 - вход множителя (шина данных); 4 - выход результата произведения (шина данных); 5 - выход переполнения (в старший множитель). |
| Делитель | ![]() |
1 - вход делимого (шина данных); 2 - вход делителя (шина данных); 4 - выход частного (шина данных); 5 - выход остатка (в старший делитель). |
| Преобразователь в дополнительный код (отрицатель) | ![]() |
1 - входная шина данных; 2 - выходная шина данных в виде дополнительного кода. |
| Компаратор | ![]() |
1 - вход первого слова А (шина данных); 2 - вход второго слова В (шина данных); 3 - выходной сигнал, активен если слово А>B; 4 - выходной сигнал, активен если слово А=B; 5 - выходной сигнал, активен если слово А<B; |
| Схема сдвига (сдвигатель) | ![]() |
1 - вход сдвигаемого слова (шина данных); 2 - вход управления (шина данных), указывающего на количество сдвигаемых бит; 3 - выход (шина данных) сдвига. Важно! В свойстве "Тип сдвига " задается направление сдвига "Логический правый ", "Логический левый ", "Арифметический правый ", "Циклический левый ". |
В качестве демонстрации организации каскадного включения сумматоров и вычитателей, имеющихся в среде Logisim, а также организации АЛУ, собрано тестовое арифметическое устройство для сложения и вычитания двух восьмиразрядных слов. Узлы в проектируемом устройстве выбраны четырехразрядные. Разделение входных шин, сборка результата выполняется при помощи инструмента разветвителя. На рисунке 6.16а показаны настройки разветвителя восьмиразрядной шины из которой извлекаются младшие 4 бит. На рисунке 6.16б показана настройка четырехразрядной шины приемника.
(рис 6.16)
На рисунке 6.17 приведена функциональная схема для описываемого арифметического узла АЛУ. Вход AddSub является управляющим сигналом осуществляющим, как было сказано в начале раздела коммутацию комбинационных схем посредством мультиплексора и управлением выходом Со - совмещенным выходом переполнения / заема для операций блока. При лог. "0 " на входе AddSub арифметический блок выполняет сложение. При лог. "1 " операцию вычитания. Сигнал лог. "1 " на входе AddSub совместно с возникающем сигналом переполнения Со, может быть анализирован в блоке управления при выполнении микропрограммы.
(рис 6.17)
Реализация блока АЛУ для проектируемого в рамках курса процессора RISC-V будет рассмотрена в практической работе.
Цель лабораторной работы закрепить навыки работы с элементами арифметики в двоичном коде. Получить навыки работы с инструментом проверки работы схемы "Тестовый вектор ".
Существует множество алгоритмов для выполнения операций умножения. Данная операция требовательна к ресурсам центрального процессора, поэтому является одной из сложных с точки зрения быстродействия. В литературе [1] подробно рассмотрены варианты организации алгоритмов и схем для операций умножения, а также подобно описаны различные механизмы операции деления. Для повышения быстродействия применяют матричные умножители. Данные умножители не лишены недостатков, таких как площадь, занимаемая ими на кристалле микросхемы, растущая с ростом разрядности слов.
Для умножения без знака рассмотрим умножитель Брауна.
Умножитель Брауна эффективен в контексте использования избыточных битов. Каждый из промежуточных результатов сохраняет информацию, позволяя избежать необходимости использования дополнительных стадий суммирования.
В основе лежит таблица частичных произведений, которая строится на основе входных двоичных чисел. Это позволяет сократить общее количество необходимых для сложения и умножения операций.
Принцип работы:
На вход поступают числа A и B, которые необходимо перемножить. Число A имеет n бит, а число B - m бит.
Умножение осуществляется через генерацию частичных произведений. Каждая из строк частичных произведений формируется логическим умножением одного бита из B на все биты A.
Матричная структура обеспечивается следующим образом, например $$A=a_{n-1} a_{n-2}…a_0$$ и $$B=b_{m-1} b_{m-2}…b_0$$, то частные произведения формируются следующим образом:
После того как все частичные произведения созданы, они складываются. Это сложение происходит в несколько этапов с учетом переноса.
Для оптимизации данного умножителя могут использоваться такие методы, как параллельное сложение и специфические схемы переноса.
На рисунке 6.18 приведена функциональная схема для данного умножителя.
(рис 6.18)
В среде Logisim Evolution создать новый файл сохранить его под именем MUL. Данный матричный умножитель производит операцию умножения для двух четырехразрядных слов А и B.
Необходимо построить схему, приведенную на рисунке 6.19. На четырехразрядных сумматорах D3,D5,D7 реализуется схема сложения частных произведения. На конъюнкторах D1_1 - D1_4 реализуется получение частного произведения множимого слова A0-A3 на бит B0 множителя B0-B3, на коъюнкторах D2_1-D2_4 соответственно происходит получение частного произведения А0-А3 на бит B1, и так далее. Входы переносов из младших разрядов сумматоров необходимо подключить к константе лог. "0 ". Вход старшего разряда сумматора D3 также подключить к константе лог. "0 ". Младший результат произведения сразу же будет получен на выходе элемента D1_1. Результаты сложения частных поступают на входы (А) следующих сумматоров со смещением на один разряд в сторону старших (как видно из схемы), причем старшим разрядом является выход переноса из младшего сумматора. Младшие выходы результатов сложения являются выходами результата произведения. С выходов сумматора D7 снимаются старшие разряды, восьмиразрядного результата произведения М0-M7. Старший разряд M7 снимается с выхода переноса сумматора D7.
(рис 6.19)
Для проверки корректности схемы можно создать тестовую таблицу работы. Для этого в текстовом редакторе (Блокнот) создать файл. Первой стройкой ввести через пробелы имена входных слов и выходного слова. Второй, третьей и далее строками вводятся тестовые значения. На рисунке 6.20 приведены три строки. В первой вводится два операнда 7 и 2, результат 14. Второй строкой введены операнды 7 и 8, результат 56. В третье строке в результате введена ошибка. Операнды 2 и 14. Результат 28 в двоичном коде выглядит следующим образом 00011100 В строке с ошибкой третьем разряде введен лог. "0 ", соответственно код имеет следующий вид - 00011000. На рисунке приведено содержимое файла тестирования. Знак # применяется как символ комментария.
(рис 6.20)
Далее в меню "Моделировать " - "Тестовый вектор ". В открывшемся окне нажать кнопку "Вектор нагрузки ", выбрать файл с тестовым содержимым. Результат работы показан на рисунке 6.21. Разряд в котором содержится ошибка подсвечен красным и выведен результат, который формирует устройство. В столбце "Результат " в строке с ошибкой указывается "неудачу ". Обработанные верно строки подписаны "Принято ".
(рис 6.21)
Данный метод считается тестирование с "белым ящиком ", когда тестировщик знает внутреннее устройство и принцип функционирования устройства.
Самостоятельно:
Составить файл тестовый вектор, содержащий ошибочные тесты и верные решения не менее 10 строк.
В листинге 6.4 приведен пример реализации методом структурного описания схемы матричного умножителя, показанного на рисунке 6.18 на языке Verilog HDL.
module multiplication4x4(a,b,x); //входы умножителя input [3:0]a,b; //выход output [7:0]x; //внутренняя шина wire [39:0]w; //получение частных and a1(w[0],a[0],b[0]); and a2(w[1],a[1],b[0]); and a3(w[2],a[2],b[0]); and a4(w[3],a[3],b[0]); and a5(w[4],a[0],b[1]); and a6(w[5],a[1],b[1]); and a7(w[6],a[2],b[1]); and a8(w[7],a[3],b[1]); and a9(w[8],a[0],b[2]); and a10(w[9],a[1],b[2]); and a11(w[10],a[2],b[2]); and a12(w[11],a[3],b[2]); and a13(w[12],a[0],b[3]); and a14(w[13],a[1],b[3]); and a15(w[14],a[2],b[3]); and a16(w[15],a[3],b[3]); assign x[0]=w[0]; //коммутация сумматоров с внутренними сигналами частных fulladder a17(1'b0,w[1],w[4],w[16],w[17]); fulladder a18(1'b0,w[2],w[5],w[18],w[19]); fulladder a19(1'b0,w[3],w[6],w[20],w[21]); fulladder a20(w[8],w[17],w[18],w[22],w[23]); fulladder a21(w[9],w[19],w[20],w[24],w[25]); fulladder a22(w[10],w[7],w[21],w[26],w[27]); fulladder a23(w[12],w[23],w[24],w[28],w[29]); fulladder a24(w[13],w[25],w[26],w[30],w[31]); fulladder a25(w[14],w[11],w[27],w[32],w[33]); fulladder a26(1'b0,w[29],w[30],w[34],w[35]); fulladder a27(w[31],w[32],w[35],w[36],w[37]); fulladder a28(w[15],w[33],w[37],w[38],w[39]); //коммутация выходных линий с внутренними assign x[1]=w[16]; assign x[2]=w[22]; assign x[3]=w[28]; assign x[4]=w[34]; assign x[5]=w[36]; assign x[6]=w[38]; assign x[7]=w[39]; endmodule //модуль полного сумматора module fulladder(a,b,c,s,ca); //входы input a,b,c; //outputs output s,ca; //функционал полного сумматора. assign s=(a^b^c); assign ca=((ab)|(bc)|(ca)); endmodule
На рисунке 6.22 представлен данный цифровой блок на уровне RTL
(рис 6.22)
В АЛУ применяется узел сравнения входных слов. Данную операцию выполняет комбинационная схема - цифровой компаратор (в среде Logisim данный блок имеется и приведен в таблице 6.3).
Цифровые компараторы обычно делят на:
На рисунке 6.23 приведена функциональная схема сравнения двух бит. При поступлении лог. "1 " на оба входа за счет инверсии на входах элементы D1_1 и D1_2 сформируют на выходах лог. "0 ", тем самым сработает элемент@ ИЛИ -НЕ " D1_3 с сигналом равенства. Аналогично схема сработает при поступлении лог. "0 " на оба входа. Если на входе А будет присутствовать лог "1 ", на входе В лог. "0 ", то активным элементом данной схемы будет D1_2, который сформирует сигнал лог "1 " на выходе Ab (A<B) и наоборот.
(рис 6.23)
В листинге 6.5 приведен код на языке Verilog HDL, описывающий функциональную схему, приведенную выше. Поведенческое описание схемы выражено через конструкцию if-else и может быть выражено иначе. На рисунке 6.24 приведено RTL представление полученного узла.
module comparator_1bit ( input A, // вход A input B, // вход B output reg A_bolshe_B, // выход A > B output reg A_menshe_B, // выход A < B output reg A_equal_B // выход A == B ); always @ (A or B) begin // установка начального состояния A_ bolshe _B = 0; A_menshe_B = 0; A_equal_B = 0; // Сравнение входов через ветлвение if-else if (A > B) begin A_ bolshe _B = 1; //Если А > B end else if (A < B) begin A_menshe_B = 1; // Если А < B end else begin A_equal_B = 1; // A равно B end end endmodule
(рис 6.24)
Самостоятельно
При проектировании операционных устройств определяют, выполняемые функции, разрядность и виды входных сигналов, выходные сигналы, сигналы состояний - признаки, например знак, переполнение. Определяют управляющие сигналы и задают их комбинацию для каждой функции - код микрооперации.
Определим для проектируемого устройства операции и зададим коды микроопераций. Формат кодов будет пояснен при разработке блока управления и языка ассемблера RISC-V. В таблице 6.4 приведены виды операций, соответствующие сигналы управления, мнемоника, применяемая в языке ассемблера RISC-V.
| Код операции | Функция | Мнемоника | Вход мультиплексора АЛУ |
|---|---|---|---|
| 0000 | Сложение целых чисел | ADD | 0 |
| 1000 | Вычитание целых чисел | SUB | 8 |
| 0001 | Логический сдвиг влево | SLL | 1 |
| 0010 | Сравнение двух чисел со знаком | SLT | 2 |
| 0011 | Сравнение двух беззнаковых чисел | SLTU | 3 |
| 0101 | Логический сдвиг вправо | SLR | 5 |
| 1101 | Арифметический сдвиг вправо | SRA | 13 |
| 0100 | Логическое "Исключающее ИЛИ " | XOR | 4 |
| 0110 | Логическое "ИЛИ " | OR | 6 |
| 0111 | Логическое "И " | AND | 7 |
Для этого создать каталог RISC в среде Logisim создать новый файл, сохранить его под имением cpu.circ. Далее "Добавить схему ", присвоить название схемы ALU. Разместить на поле следующие блоки из раздела "Арифметика ": сумматор, вычитатель, три сдвигателя, два компаратора. Из раздела элементы: "И ", "Исключающее ИЛИ ", ИЛИ. Из раздела "Плексоры " разместить мультиплексор. У всех элементов свойство "биты данных " задать 32. Мультиплексору в свойство "выбирающие биты " задать 4. Компаратору для операции SLTU в свойстве "Формат числа " выбрать "Беззнаковое ". Для компаратора операции SLT в свойстве "Формат числа " должно быть установлено "Дополнительный код ".
Сдвигателям задать свойство "Тип сдвига ": "Логический левый ", "Логический правый ", "Арифметический правый ".
Так как разрядность операндов 32, соответственно поле управления сдвигом будет иметь разрядность 5 бит. Управление сдвигом будет осуществлять второй операнд. Для изменения разрядности входной шины можно использовать несколько разветвителей и настроить их соответствующим образом (показано выше при построении блока сложения/вычитания - рисунок 6.16). В рассматриваемом примере будут применятся блоки "Расширитель битов ". Данный блок находится в разделе "Проводка ". Для подключения к сдвигателям даннным блокам необходимо задать свойства:
Для преобразования выхода "меньше " у компараторов, который будет включаться в 32-х разрядную шину также необходимо установить расширители битов, задав свойства:
На поле добавить входы и выходы с разрядностью 32.
Для упрощения коммутации шин данных в созданном примере применяются "тоннели ". Для операндов предлагается дать свойства меткам тоннелей OP1, OP2. Выходы элементов также подключить к тоннелям с метками "outМНЕМОНИКА ОПЕРАЦИИ ", например "outADD ". Тоннели с операциями подключить к входам мультиплексора согласно коду операции (четвертый столбец таблицы 6.4 указывает номер входа).
На рисунке приведена схема функциональная спроектированного блока АЛУ.
На рисунке 6.25 приведена схема функциональная спроектированного блока АЛУ.
(рис 6.25)
В инструменте редактирования внешнего вида отредактировать условно- графическое обозначение АЛУ, например, как показано на рисунке 6.26.
(рис 6.26)
Для проектирования АЛУ в среде Quartus создать новый каталог с именем CPU. Имя проекта для создаваемого процессора определить RISC_V (с данного момента осуществляется проектирование процессора). В окне Family, Device… выбрать соответствующее семейство и тип микросхемы (если имеется отладочная плата для разработки. Нажать кнопку Finish.
Далее создать новый Verilog HDL File сохранить его под именем ALU.v.
В созданный файл ввести код из листинге 6.6
module ALU( input [31:0] srcA, srcB, input [3:0] aluControl, // вход дешифратора операций АЛУ (рассматривается далее) output reg [31:0] aluResult, output zero ); always @(*) begin case (aluControl) 4'b0000: aluResult = srcA + srcB; // ADD 4'b0001: aluResult = srcA - srcB; // SUB 4'b0010: aluResult = srcA srcB; // AND 4'b0011: aluResult = srcA | srcB; // OR 4'b0100: aluResult = srcA ^ srcB; // XOR 4'b0101: aluResult = srcA << srcB[4:0]; // SLL 4'b0110: aluResult = srcA >> srcB[4:0]; // SRL 4'b0111: aluResult = $signed(srcA) >>> srcB[4:0]; // SRA 4'b1000: aluResult = (srcA < srcB) ? 32'd1 : 32'd0; // SLT 4'b1001: aluResult = ($signed(srcA) < $signed(srcB)) ? 32'd1 : 32'd0; // SLTU default: aluResult = 32'b0; // по умолчанию endcase end assign zero = (aluResult == 32'b0) ? 1'b1 : 1'b0; endmodule
На рисунке 6.27 приведен вид RTL cозданного модуля.
(рис 6.27)
Дать ответы на следующий вопросы:
Необходимые материалы для лекции Logisim-06.zip и Verilog-06.zip.
Арифметико-логическое устройство (АЛУ) - это один из ключевых компонентов процессора, отвечающий за выполнение арифметических и логических операций. Оно играет важную роль в обработке данных и выполнении команд, которые задаются программами.
Упрощенно в АЛУ можно определить следующие основные функции:
АЛУ можно классифицировать по ряду признаков, приведенных ниже:
Классификация по способу представления данных:
Классификация по способу действия над операндами:
Классификация по использованию систем счисления:
Классификация по характеру использования элементов и узлов:
На рисунке 6.1 приведена блок схема АЛУ, отражающая основные узлы и операции, выполняемые в данном устройстве. Помимо операндов на АЛУ подаются управляющие сигналы, осуществляющие переключения внутри блоков и их коммутацию, тем самым определяя заданную операцию в определенный момент времени.
(рис 6.1)
Логический блок, как было отмечено выше, реализует побитно логические операции над поступающими на его входы операнды. Для двух четырехразрядных слов выполнение операции AND (логическое "И") осуществляется на четырех двухвходовых конъюнктурах (рисунок 6.2). Подобным образом реализуются другие логические функции, заложенные в конкретное АЛУ.
(рис 6.2)
Основной элементарной операцией, выполняемой над кодами чисел в цифровых устройствах, является арифметическое сложение. Сложение выполняется в цифровом устройстве - сумматоре.
Сумматор - комбинационная схема, выполняющая арифметическое сложение кодов двух чисел. Этот узел лежит в основе арифметико-логического устройства.
Полусумматор (half adder) - простейшее цифровое устройство, являющееся звеном сумматора. Это устройство реализует сложение двух одноразрядных двоичных чисел А и В. В результате получается двухразрядное двоичное число. Его младшую цифру обозначают S (лат. summa), а старшую, которая будет перенесена в старший разряд, - Co (англ. carry out - выходной перенос). В таблице 6.1 приведена таблица истинности полусумматора. На рисунке 6.3 приведена схема моделирования полусумматора.
| Слагаемые | Перенос | Сумма | |
|---|---|---|---|
| A | B | Co | S |
| 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 |
| 1 | 0 | 0 | 1 |
| 1 | 1 | 1 | 0 |
(рис 6.3)
Полусумматор имеет два входа (слагаемые) и два выхода - сумму в данном разряде и перенос в следующий разряд. Из схемы и таблицы видно, что перенос формируется логической функции AND (И): $$Co =A \wedge B $$.
Для составления логической функции для S можно обратиться к логическому конвертеру - функция "Исключающее ИЛИ " (XOR).
При сложении старших разрядов многоразрядных двоичных слов необходимо в схеме учесть перенос из предыдущего (младшего) разряда. Такое устройство является полным сумматором (full adder). Оно должно иметь три входа: А и В - одноименные разряды двух складываемых чисел, Сi - входной перенос из предыдущего (младшего) разряда (англ. carry in - входной перенос) и два выхода: S - сумма в данном разряде и Co - перенос в следующий (старший) разряд.
Таблица истинности для одноразрядного сумматора приведена в таблице 6.2.
| Входные сигналы | Выходные сигналы | |||
|---|---|---|---|---|
| A | B | Ci | S | Co |
| 0 | 0 | 0 | 0 | 0 |
| 1 | 0 | 0 | 1 | 0 |
| 0 | 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 0 | 1 |
| 0 | 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 0 | 1 |
| 1 | 1 | 1 | 0 | 1 |
| 1 | 1 | 1 | 1 | 1 |
Сумматор удобно представить в виде двух полусумматоров, из которых первый суммирует разряды А и В, а второй к результату прибавляет бит переноса Ci (рисунок 6.4). Цепь D1_1, D1_2 обеспечивает формирование сигнала S. При возникновении лог. "1 " на одном из входов либо при наличии на всех входах лог "1 ". Элемент D2_1 обеспечивает возникновении лог. "1 " на выходе Co элемента "ИЛИ " D3_1(при наличии одного из слагаемых А или В и сигнала переноса из младших разрядов Сin). Элемент D2_2 обрабатывает возникновение переноса, когда на входах А и В присутствуют лог. "1 ".
(рис 6.4)
Приведенная выше схема широко представлена в литературе, но при реализации данного устройства в виде микросхем, схема сумматора значительно отличается.
В листинге 6.1 приведен код полного сумматора на языке Verilog HDL. На рисунке 6.5 приведен данный узел на уровне RTL.
module full_adder ( input wire A, // бит операнда А input wire B, // бит операнда В input wire Cin, // вход переноса Cin output wire Sum, // S выход сумма output wire Co // Выход переноса Co ); // получаем сумму assign Sum = A ^ B ^ Cin; // Формирование переноса assign Co = (A B) | (Cin (A ^ B)); endmodule
(рис 6.5)
В системе ЕСКД сумматоры изображаются так, как представлено на рисунке 6.6а ( вход Cin может замется на $$P_i$$, выход $$Co - P_{i+1}$$). На рисунке 6.6б приведено УГО сумматора в системе ANSI. Условное буквенное обозначение сумматоров на схемах - SM.
(рис 6.6)
Обратной схемой сумматора является субтрактор - вычитатель. В двоичнм коде принцип субтрактора, анлогичен работе сумматора. За исключением переноса. В данном случае он занимает из старших разрядов, а выход Bo сигнализирует, что на выходе вычитания получено отрицательное число. По внтуреннему устройству субтрактор схож с сумматором. На рисунке 6.7 приведена блок - схема двооичного вычитателя с последовательным переносом (заем).
(рис 6.7)
На рискунке 6.8 приведена схема функциональная полувычитателя. На рисунке 6.9 приведена схема функциональная полного вычитателя. Выход разности именуется D (англ. Difference).
(рис 6.8)
(рис 6.9)
Сравнивая схему на рисунке 6.9 со схемой на рисунке 6.4, можно наблюдать отличия только в применении инверторов, которые обеспечивают получение обратного кода. С ним и производится опять же операция сложения. В листинге 6.2 приведен код для субтрактора на языке Verilog HDL. На рисунке 6.10 приведен данный узел на уровне RTL.
module subtractor_1bit ( input wire A, // Уменьшаемое А input wire B, // Вычитаемое В input wire Bin, // Вход переноса Bin output wire D, // Выход разности output wire Bo // Выход заема ); //Выполнение операции "Исключающее ИЛИ ", аналогично сложению assign D = A ^ B ^ Bin; // Получение сигнала Bo assign Bo = (~A (B | Bin)) | (Bin ~A); endmodule
(рис 6.10)
В среде Logisim разрядность сумматора и вычитателя ограничена 64 битами. Для увеличения разрядности обрабатываемых слов применяются различные схемы включения. Для увеличения разрядности сумматоров применяется каскадное включение. Выход переноса Co младшего сумматора подключается к входу Cin старшего сумматора (рисунок 6.11). Каскадное последовательное включение сумматоров снижает быстродействие всей схемы сложения в силу увеличения времени задержки прохождения сигнала переноса из младшего сумматора в старший. Для повышения быстродействия схема с последовательным включением переносов не применяется. Для этого применяются специальные цифровые блоки - схемы ускоренного переноса (СУП), которые описаны в литературе [2].
(рис 6.11)
Также для упрощения организации АЛУ возможно отказаться от блока вычитателя, специальным образом организовав коммутацию операнда вычитаемого на сумматоре. Вычитание осуществляется, путем сложения в дополнительных кодах. Для этого вычитаемое, например, операнд В проходит процедуру инверсии - будет получен обратный код числа. На вход Cin будет подан сигнал с уровнем лог. "1 ", обеспечив тем самым дополнительный код. Упрощенная схема организации операции вычитания приведена на рисунке 6.12
(рис 6.12)
Так же в АЛУ выполняется и операция сдвига слов. Хотя существуют сдвиговые регистры, но применение сдвиговых регистров в процессоре в ядре процессора нецелесообразно по следующим причинам:
В АЛУ могут осуществляться два вида сдвига: логический влево/вправо
Поэтому для организации операций сдвига в АЛУ применяются мультиплексоры. Рассмотрим организацию сдвига на примере четырехразрядного слова. Для этого будут применятся мультиплексоры, коммутирующие четыре линии (необходимо 4 мультиплексора).
Поэтому для организации данной операции применяются мультиплексоры. Рассмотрим организацию сдвига на примере четырехразрядного слова. Для этого будут применятся мультиплексоры, коммутирующие четыре линии (необходимо 4 мультиплексора).
На рисунке 6.13 приведена функциональная схема устройства логического сдвига. Блок D1 - младший мультиплексор, D4 - старший. Входы сдвигаемого слова Х0-Х4 будут подключены следующим образом. Х0 подключается к входу 0 мультиплексора D1, входу 1 мультиплексора D2, входу 2 мультиплексора D3, входу 3 мультиплексора D4. Вход X1 к 0 входу D2, к 1 входу D3, к входу 2 D4. Вход X2 к 0 входу D3, к 1 входу D4. Вход Х3 к 0 входу D4. За счет такого перекрестного включения линий фактически и организован сдвиг слова.
Адресные входы А0, А1 у всех мультиплексоров объединенны. Этими входы управления определяют сдвиг входного слова. Представленная схема осуществляет сдвиг в сторону старших разрядов (сдвиг влево).
(рис 6.13)
При сдвиге старшие биты будут фактически замещены 0 с неиспользуемых входов (для неиспользуемые входы необходимо подключит к контактам "Земли ", либо константе "0 ". При необходимости сохранения данных из старших разрядов большего слова, неподключенные входы должны будут подключены к старшим разрядам входного сдвигаемого слова. Если же необходимо обеспечить циклический сдвиг слова схему можно видоизменить. Для этого добавить входу управления, назовем его Ci. Далее на схему добавить двухвходовые элементы "И ". Один вход подключить к Ci. Остальные входы подключить к Х1, Х2, Х3 соответственно. Выходы с элементов завести на неиспользуемые входы мультиплексоров. На рисунке 6.14 приведена видоизмененная схема, обеспечивающая циклический сдвиг. Выход D5 подключить к входу 1 D1, входу 2 D2, входу 3 D3. Выход D6 подключить к входу 2 D1, входу 3 D2. Выход D7 подключить к входу 3 D1.
(рис 6.14)
В листинге 6.3 приведен пример реализации поведенческого описания схемы логического сдвига, показанного на рисунке 6.13 на языке Verilog HDL.
module logi_shift (X, A, Q);//определение модуля и имен сигналов input [3:0] X;//вход свдигаемого слова input [1:0] A;// селектор управляющий сдвигом output reg [3:0] Q;//шина данных выходного слова always @(X or A) // анализируем изменения сигналов на входе данных или //селектора begin case (A)//анализируем состояние селектор 2'b00: Q = X;// входные данные поступают на выход без сдвига 2'b01: Q = X<<1;// сдвиг на один бит влево 2'b10: Q = X <<2;//сдвиг на два бита влево default: Q = X <<3;//сдвиг на три бита влево endcase end endmodule
На рисунке 6.15 представлен данный цифровой блок на уровне RTL.
(рис 6.15)
В среде Logisim Evolution в разделе "Арифметика " находятся узлы, которые будут применятся для проектирования АЛУ процессора.
В таблице 6.3 приведено условно-графическое обозначение, применяемых элементов и назначение сигналов.
| Наименование блока (арифметических операций) | Условно-графическое обозначение | Назначение сигналов |
|---|---|---|
| Сумматор | ![]() |
1 -вход первого слагаемого (шина данных); 2 - вход второго слагаемого (шина данных); 3 - вход переноса из младшего сумматора; 4 - выход результата суммы (шина данных); 5 - выход переполнения (в старший сумматор). |
| Субтрактор (Вычитатель) | ![]() |
1 - вход уменьшаемого (шина данных); 2 - вход вычитаемого (шина данных); 4 - выход результата разности (шина данных); 5 - выход займа (в старший вычитатель). |
| Умножитель (Множитель) | ![]() |
1 - вход множимого (шина данных); 2 - вход множителя (шина данных); 4 - выход результата произведения (шина данных); 5 - выход переполнения (в старший множитель). |
| Делитель | ![]() |
1 - вход делимого (шина данных); 2 - вход делителя (шина данных); 4 - выход частного (шина данных); 5 - выход остатка (в старший делитель). |
| Преобразователь в дополнительный код (отрицатель) | ![]() |
1 - входная шина данных; 2 - выходная шина данных в виде дополнительного кода. |
| Компаратор | ![]() |
1 - вход первого слова А (шина данных); 2 - вход второго слова В (шина данных); 3 - выходной сигнал, активен если слово А>B; 4 - выходной сигнал, активен если слово А=B; 5 - выходной сигнал, активен если слово А<B; |
| Схема сдвига (сдвигатель) | ![]() |
1 - вход сдвигаемого слова (шина данных); 2 - вход управления (шина данных), указывающего на количество сдвигаемых бит; 3 - выход (шина данных) сдвига. Важно! В свойстве "Тип сдвига " задается направление сдвига "Логический правый ", "Логический левый ", "Арифметический правый ", "Циклический левый ". |
В качестве демонстрации организации каскадного включения сумматоров и вычитателей, имеющихся в среде Logisim, а также организации АЛУ, собрано тестовое арифметическое устройство для сложения и вычитания двух восьмиразрядных слов. Узлы в проектируемом устройстве выбраны четырехразрядные. Разделение входных шин, сборка результата выполняется при помощи инструмента разветвителя. На рисунке 6.16а показаны настройки разветвителя восьмиразрядной шины из которой извлекаются младшие 4 бит. На рисунке 6.16б показана настройка четырехразрядной шины приемника.
(рис 6.16)
На рисунке 6.17 приведена функциональная схема для описываемого арифметического узла АЛУ. Вход AddSub является управляющим сигналом осуществляющим, как было сказано в начале раздела коммутацию комбинационных схем посредством мультиплексора и управлением выходом Со - совмещенным выходом переполнения / заема для операций блока. При лог. "0 " на входе AddSub арифметический блок выполняет сложение. При лог. "1 " операцию вычитания. Сигнал лог. "1 " на входе AddSub совместно с возникающем сигналом переполнения Со, может быть анализирован в блоке управления при выполнении микропрограммы.
(рис 6.17)
Реализация блока АЛУ для проектируемого в рамках курса процессора RISC-V будет рассмотрена в практической работе.
Цель лабораторной работы закрепить навыки работы с элементами арифметики в двоичном коде. Получить навыки работы с инструментом проверки работы схемы "Тестовый вектор ".
Существует множество алгоритмов для выполнения операций умножения. Данная операция требовательна к ресурсам центрального процессора, поэтому является одной из сложных с точки зрения быстродействия. В литературе [1] подробно рассмотрены варианты организации алгоритмов и схем для операций умножения, а также подобно описаны различные механизмы операции деления. Для повышения быстродействия применяют матричные умножители. Данные умножители не лишены недостатков, таких как площадь, занимаемая ими на кристалле микросхемы, растущая с ростом разрядности слов.
Для умножения без знака рассмотрим умножитель Брауна.
Умножитель Брауна эффективен в контексте использования избыточных битов. Каждый из промежуточных результатов сохраняет информацию, позволяя избежать необходимости использования дополнительных стадий суммирования.
В основе лежит таблица частичных произведений, которая строится на основе входных двоичных чисел. Это позволяет сократить общее количество необходимых для сложения и умножения операций.
Принцип работы:
На вход поступают числа A и B, которые необходимо перемножить. Число A имеет n бит, а число B - m бит.
Умножение осуществляется через генерацию частичных произведений. Каждая из строк частичных произведений формируется логическим умножением одного бита из B на все биты A.
Матричная структура обеспечивается следующим образом, например $$A=a_{n-1} a_{n-2}…a_0$$ и $$B=b_{m-1} b_{m-2}…b_0$$, то частные произведения формируются следующим образом:
После того как все частичные произведения созданы, они складываются. Это сложение происходит в несколько этапов с учетом переноса.
Для оптимизации данного умножителя могут использоваться такие методы, как параллельное сложение и специфические схемы переноса.
На рисунке 6.18 приведена функциональная схема для данного умножителя.
(рис 6.18)
В среде Logisim Evolution создать новый файл сохранить его под именем MUL. Данный матричный умножитель производит операцию умножения для двух четырехразрядных слов А и B.
Необходимо построить схему, приведенную на рисунке 6.19. На четырехразрядных сумматорах D3,D5,D7 реализуется схема сложения частных произведения. На конъюнкторах D1_1 - D1_4 реализуется получение частного произведения множимого слова A0-A3 на бит B0 множителя B0-B3, на коъюнкторах D2_1-D2_4 соответственно происходит получение частного произведения А0-А3 на бит B1, и так далее. Входы переносов из младших разрядов сумматоров необходимо подключить к константе лог. "0 ". Вход старшего разряда сумматора D3 также подключить к константе лог. "0 ". Младший результат произведения сразу же будет получен на выходе элемента D1_1. Результаты сложения частных поступают на входы (А) следующих сумматоров со смещением на один разряд в сторону старших (как видно из схемы), причем старшим разрядом является выход переноса из младшего сумматора. Младшие выходы результатов сложения являются выходами результата произведения. С выходов сумматора D7 снимаются старшие разряды, восьмиразрядного результата произведения М0-M7. Старший разряд M7 снимается с выхода переноса сумматора D7.
(рис 6.19)
Для проверки корректности схемы можно создать тестовую таблицу работы. Для этого в текстовом редакторе (Блокнот) создать файл. Первой стройкой ввести через пробелы имена входных слов и выходного слова. Второй, третьей и далее строками вводятся тестовые значения. На рисунке 6.20 приведены три строки. В первой вводится два операнда 7 и 2, результат 14. Второй строкой введены операнды 7 и 8, результат 56. В третье строке в результате введена ошибка. Операнды 2 и 14. Результат 28 в двоичном коде выглядит следующим образом 00011100 В строке с ошибкой третьем разряде введен лог. "0 ", соответственно код имеет следующий вид - 00011000. На рисунке приведено содержимое файла тестирования. Знак # применяется как символ комментария.
(рис 6.20)
Далее в меню "Моделировать " - "Тестовый вектор ". В открывшемся окне нажать кнопку "Вектор нагрузки ", выбрать файл с тестовым содержимым. Результат работы показан на рисунке 6.21. Разряд в котором содержится ошибка подсвечен красным и выведен результат, который формирует устройство. В столбце "Результат " в строке с ошибкой указывается "неудачу ". Обработанные верно строки подписаны "Принято ".
(рис 6.21)
Данный метод считается тестирование с "белым ящиком ", когда тестировщик знает внутреннее устройство и принцип функционирования устройства.
Самостоятельно:
Составить файл тестовый вектор, содержащий ошибочные тесты и верные решения не менее 10 строк.
В листинге 6.4 приведен пример реализации методом структурного описания схемы матричного умножителя, показанного на рисунке 6.18 на языке Verilog HDL.
module multiplication4x4(a,b,x); //входы умножителя input [3:0]a,b; //выход output [7:0]x; //внутренняя шина wire [39:0]w; //получение частных and a1(w[0],a[0],b[0]); and a2(w[1],a[1],b[0]); and a3(w[2],a[2],b[0]); and a4(w[3],a[3],b[0]); and a5(w[4],a[0],b[1]); and a6(w[5],a[1],b[1]); and a7(w[6],a[2],b[1]); and a8(w[7],a[3],b[1]); and a9(w[8],a[0],b[2]); and a10(w[9],a[1],b[2]); and a11(w[10],a[2],b[2]); and a12(w[11],a[3],b[2]); and a13(w[12],a[0],b[3]); and a14(w[13],a[1],b[3]); and a15(w[14],a[2],b[3]); and a16(w[15],a[3],b[3]); assign x[0]=w[0]; //коммутация сумматоров с внутренними сигналами частных fulladder a17(1'b0,w[1],w[4],w[16],w[17]); fulladder a18(1'b0,w[2],w[5],w[18],w[19]); fulladder a19(1'b0,w[3],w[6],w[20],w[21]); fulladder a20(w[8],w[17],w[18],w[22],w[23]); fulladder a21(w[9],w[19],w[20],w[24],w[25]); fulladder a22(w[10],w[7],w[21],w[26],w[27]); fulladder a23(w[12],w[23],w[24],w[28],w[29]); fulladder a24(w[13],w[25],w[26],w[30],w[31]); fulladder a25(w[14],w[11],w[27],w[32],w[33]); fulladder a26(1'b0,w[29],w[30],w[34],w[35]); fulladder a27(w[31],w[32],w[35],w[36],w[37]); fulladder a28(w[15],w[33],w[37],w[38],w[39]); //коммутация выходных линий с внутренними assign x[1]=w[16]; assign x[2]=w[22]; assign x[3]=w[28]; assign x[4]=w[34]; assign x[5]=w[36]; assign x[6]=w[38]; assign x[7]=w[39]; endmodule //модуль полного сумматора module fulladder(a,b,c,s,ca); //входы input a,b,c; //outputs output s,ca; //функционал полного сумматора. assign s=(a^b^c); assign ca=((ab)|(bc)|(ca)); endmodule
На рисунке 6.22 представлен данный цифровой блок на уровне RTL
(рис 6.22)
В АЛУ применяется узел сравнения входных слов. Данную операцию выполняет комбинационная схема - цифровой компаратор (в среде Logisim данный блок имеется и приведен в таблице 6.3).
Цифровые компараторы обычно делят на:
На рисунке 6.23 приведена функциональная схема сравнения двух бит. При поступлении лог. "1 " на оба входа за счет инверсии на входах элементы D1_1 и D1_2 сформируют на выходах лог. "0 ", тем самым сработает элемент@ ИЛИ -НЕ " D1_3 с сигналом равенства. Аналогично схема сработает при поступлении лог. "0 " на оба входа. Если на входе А будет присутствовать лог "1 ", на входе В лог. "0 ", то активным элементом данной схемы будет D1_2, который сформирует сигнал лог "1 " на выходе Ab (A<B) и наоборот.
(рис 6.23)
В листинге 6.5 приведен код на языке Verilog HDL, описывающий функциональную схему, приведенную выше. Поведенческое описание схемы выражено через конструкцию if-else и может быть выражено иначе. На рисунке 6.24 приведено RTL представление полученного узла.
module comparator_1bit ( input A, // вход A input B, // вход B output reg A_bolshe_B, // выход A > B output reg A_menshe_B, // выход A < B output reg A_equal_B // выход A == B ); always @ (A or B) begin // установка начального состояния A_ bolshe _B = 0; A_menshe_B = 0; A_equal_B = 0; // Сравнение входов через ветлвение if-else if (A > B) begin A_ bolshe _B = 1; //Если А > B end else if (A < B) begin A_menshe_B = 1; // Если А < B end else begin A_equal_B = 1; // A равно B end end endmodule
(рис 6.24)
Самостоятельно
При проектировании операционных устройств определяют, выполняемые функции, разрядность и виды входных сигналов, выходные сигналы, сигналы состояний - признаки, например знак, переполнение. Определяют управляющие сигналы и задают их комбинацию для каждой функции - код микрооперации.
Определим для проектируемого устройства операции и зададим коды микроопераций. Формат кодов будет пояснен при разработке блока управления и языка ассемблера RISC-V. В таблице 6.4 приведены виды операций, соответствующие сигналы управления, мнемоника, применяемая в языке ассемблера RISC-V.
| Код операции | Функция | Мнемоника | Вход мультиплексора АЛУ |
|---|---|---|---|
| 0000 | Сложение целых чисел | ADD | 0 |
| 1000 | Вычитание целых чисел | SUB | 8 |
| 0001 | Логический сдвиг влево | SLL | 1 |
| 0010 | Сравнение двух чисел со знаком | SLT | 2 |
| 0011 | Сравнение двух беззнаковых чисел | SLTU | 3 |
| 0101 | Логический сдвиг вправо | SLR | 5 |
| 1101 | Арифметический сдвиг вправо | SRA | 13 |
| 0100 | Логическое "Исключающее ИЛИ " | XOR | 4 |
| 0110 | Логическое "ИЛИ " | OR | 6 |
| 0111 | Логическое "И " | AND | 7 |
Для этого создать каталог RISC в среде Logisim создать новый файл, сохранить его под имением cpu.circ. Далее "Добавить схему ", присвоить название схемы ALU. Разместить на поле следующие блоки из раздела "Арифметика ": сумматор, вычитатель, три сдвигателя, два компаратора. Из раздела элементы: "И ", "Исключающее ИЛИ ", ИЛИ. Из раздела "Плексоры " разместить мультиплексор. У всех элементов свойство "биты данных " задать 32. Мультиплексору в свойство "выбирающие биты " задать 4. Компаратору для операции SLTU в свойстве "Формат числа " выбрать "Беззнаковое ". Для компаратора операции SLT в свойстве "Формат числа " должно быть установлено "Дополнительный код ".
Сдвигателям задать свойство "Тип сдвига ": "Логический левый ", "Логический правый ", "Арифметический правый ".
Так как разрядность операндов 32, соответственно поле управления сдвигом будет иметь разрядность 5 бит. Управление сдвигом будет осуществлять второй операнд. Для изменения разрядности входной шины можно использовать несколько разветвителей и настроить их соответствующим образом (показано выше при построении блока сложения/вычитания - рисунок 6.16). В рассматриваемом примере будут применятся блоки "Расширитель битов ". Данный блок находится в разделе "Проводка ". Для подключения к сдвигателям даннным блокам необходимо задать свойства:
Для преобразования выхода "меньше " у компараторов, который будет включаться в 32-х разрядную шину также необходимо установить расширители битов, задав свойства:
На поле добавить входы и выходы с разрядностью 32.
Для упрощения коммутации шин данных в созданном примере применяются "тоннели ". Для операндов предлагается дать свойства меткам тоннелей OP1, OP2. Выходы элементов также подключить к тоннелям с метками "outМНЕМОНИКА ОПЕРАЦИИ ", например "outADD ". Тоннели с операциями подключить к входам мультиплексора согласно коду операции (четвертый столбец таблицы 6.4 указывает номер входа).
На рисунке приведена схема функциональная спроектированного блока АЛУ.
На рисунке 6.25 приведена схема функциональная спроектированного блока АЛУ.
(рис 6.25)
В инструменте редактирования внешнего вида отредактировать условно- графическое обозначение АЛУ, например, как показано на рисунке 6.26.
(рис 6.26)
Для проектирования АЛУ в среде Quartus создать новый каталог с именем CPU. Имя проекта для создаваемого процессора определить RISC_V (с данного момента осуществляется проектирование процессора). В окне Family, Device… выбрать соответствующее семейство и тип микросхемы (если имеется отладочная плата для разработки. Нажать кнопку Finish.
Далее создать новый Verilog HDL File сохранить его под именем ALU.v.
В созданный файл ввести код из листинге 6.6
module ALU( input [31:0] srcA, srcB, input [3:0] aluControl, // вход дешифратора операций АЛУ (рассматривается далее) output reg [31:0] aluResult, output zero ); always @(*) begin case (aluControl) 4'b0000: aluResult = srcA + srcB; // ADD 4'b0001: aluResult = srcA - srcB; // SUB 4'b0010: aluResult = srcA srcB; // AND 4'b0011: aluResult = srcA | srcB; // OR 4'b0100: aluResult = srcA ^ srcB; // XOR 4'b0101: aluResult = srcA << srcB[4:0]; // SLL 4'b0110: aluResult = srcA >> srcB[4:0]; // SRL 4'b0111: aluResult = $signed(srcA) >>> srcB[4:0]; // SRA 4'b1000: aluResult = (srcA < srcB) ? 32'd1 : 32'd0; // SLT 4'b1001: aluResult = ($signed(srcA) < $signed(srcB)) ? 32'd1 : 32'd0; // SLTU default: aluResult = 32'b0; // по умолчанию endcase end assign zero = (aluResult == 32'b0) ? 1'b1 : 1'b0; endmodule
На рисунке 6.27 приведен вид RTL cозданного модуля.
(рис 6.27)
Дать ответы на следующий вопросы:
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.