Подписка на новости

Опрос

Нужны ли комментарии к статьям? Комментировали бы вы?

Реклама

 

2004 №1

Система команд микропроцессорного ядра MicroBlaze

Зотов Валерий


В предыдущей публикации цикла была дана общая характеристика и рассмотрена архитектура семейства микропроцессорных ядер MicroBlaze, которые предназначены для применения в проектах, реализуемых на базе ПЛИС серии FPGA фирмы Xilinx [1]. Продолжая тему, настоящая статья представляет подробное описание системы команд этих ядер.

Общая характеристика команд MicroBlaze

В системе команд микропроцессорного ядра MicroBlaze при классификации по функциональному признаку можно выделить девять групп инструкций. К первой группе относятся инструкции, предназначенные для выполнения основных арифметических операций. В эту группу входят команды сложения, вычитания, умножения, деления и сравнения двух 32-разрядных операндов. Значение одного из операндов, участвующих в арифметических операциях, содержится в регистре общего назначения, номер которого указан в команде. В качестве второго операнда может использоваться значение, заданное непосредственно в коде команды, или содержимое другого регистра общего назначения.

Вторую группу образуют логические инструкции. Эти команды выполняют поразрядные операции «Логическое И» (поразрядное умножение), «Логическое ИЛИ» (поразрядное сложение), «Исключающее ИЛИ». В качестве операндов могут выступать значения содержимого двух регистров общего назначения, а также содержимое любого регистра общего назначения и константа, указанная в тексте команды.

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

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

Четвертую группу составляют инструкции преобразования типов данных. Команды этой группы предназначены для реформирования данных различной длины до 32-разрядного значения. Как правило, для этих целей используется операция знакового расширения.

Пятая группа включает в себя команды передачи данных. В нее входят инструкции, используемые для пересылки данных различной длины из памяти в регистры общего назначения и, наоборот, из регистра в ячейки памяти. Передача данных может осуществляться в форме 32-разрядных значений (слов), 16-разрядных значений (полуслов) и 8-разрядных значений (байт).

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

В седьмую группу входят инструкции ввода-вывода. Эти команды предназначены для организации обмена данными между регистрами общего назначения и входными-выходными интерфейсами, соответствующими спецификации FSL (Fast Simplex Link). Для каждого режима чтения данных, поступающих через входной интерфейс FSL, предусмотрены соответствующие версии инструкций, которые используются для записи считанной информации в выбранный регистр общего назначения. Несколько вариантов команд вывода позволяют реализовать различные режимы передачи данных из любого регистра общего назначения через выходной интерфейс FSL.

Восьмую группу образуют специальные команды. Эти инструкции выполняют операции чтения информации из регистра статуса и записи ее в регистр общего назначения, а также записи содержимого выбранного регистра общего назначения в регистр состояния.

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

Форматы команд поддерживаемых микропроцессорным ядром MicroBlaze

В системе команд микропроцессорного ядра MicroBlaze используется в основном два типа формата инструкций. Структура этих вариантов форматов команд показана на рис. 1. Длина всех инструкций, независимо от типа формата, составляет тридцать два двоичных разряда.

Рис. 1. Основные варианты форматов команд, поддерживаемых микропроцессорным ядром MicroBlaze

Команды, которые относятся к первому типу формата (типу А), включают в себя пять полей. Первые четыре поля инструкции являются основными, а последнее — вспомогательным. Основными полями инструкций типа А являются:

  • поле кода операции;
  • поле номера регистра общего назначения, предназначенного для записи результатавыполняемой операции;
  • поле номера регистра, содержащего значение первого операнда;
  • поле номера регистра, содержащего значение второго операнда.

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

Команды, принадлежащие ко второму типу формата (типу В), состоят из четырех полей, первые три из которых выполняют те же функции и имеют ту же длину, что и в инструкциях типа А:

  • поле кода операции;
  • поле номера регистра, предназначенного для записи результата выполняемой операции;
  • поле номера регистра, содержащего значение первого операнда;
  • поле значения второго операнда, указываемого непосредственно в инструкции.

Как видно из рис. 1, формат команд, относящихся к типу В, позволяет указывать непосредственно в составе инструкции значение 16-разрядной константы. При этом в качестве операнда обычно используется результат знакового расширения этого значения до 32-разрядного слова. Для того чтобы получить непосредственное 32-разрядное значение операнда, в системе команд микропроцессорного ядра MicroBlaze предусмотрена специальная инструкция расширения IMM. Эта команда позволяет использовать в последующей инструкции типа В 32-разрядное значение константы.

Группа арифметических команд

Арифметические команды микропроцессорного ядра MicroBlaze обеспечивают выполнение операций сложения, вычитания, умножения, деления и сравнения над двумя 32-разрядными операндами. Первым параметромв арифметической команде всегда является номер одного из регистров общего назначения, который используется для записи результата выполняемой операции. В качестве номера регистра может использоваться любое число в диапазоне от 1 до 31. Второй параметр определяет номер регистра общего назначения, который содержит значение первого операнда. В роли второго операнда может выступать константа, значение которой задается непосредственно в коде команды, или содержимое любого регистра общего назначения.

Таким образом, третий параметр арифметической команды определяет значение константы или номер регистра, содержимое которого используется в качестве второго операнда.

В системе команд микропроцессорного ядра MicroBlaze представлены восемь вариантов инструкций, предназначенных для выполнения операций сложения. Для вычисления суммы двух 32-разрядных слагаемых без учета переноса используются инструкции ADD, ADDK, ADDI и ADDIK, форматы которых представлены в таблице 1.

Таблица 1. Форматы команд сложения двух операндов без учета переноса

Команды ADD Rd,Ra,Rb и ADDK Rd,Ra,Rb выполняют сложение содержимого двух регистров общего назначения с номерами a и b без учета переноса. Инструкции ADDI Rd,Ra, Imm и ADDIK Rd,Ra,Imm предназначены для суммирования без учета переноса содержимого регистра общего назначения с номером a и значения, которое является результатом знакового расширения 16-разрядной константы Imm до 32-разрядного слова. Если инструкции ADDI или ADDIK предшествует команда IMM, то указанное в ней значение используется в качестве 16 старших разрядов второго слагаемого. Значение суммы, полученное в результате выполнения рассмотренных команд, записывается в регистр с номером d. После исполнения команд сложения ADD и ADDI флаг переноса (займа) Carry Flag (29-й разряд регистра статуса) устанавливается в состояние высокого логического уровня в том случае, если в результате выполненной операции происходит перенос из самого старшего разряда. В противном случае этот флаг переключается в сброшенное состояние (низкого логического уровня). В отличие от команд ADD и ADDI инструкции ADDK и ADDIK позволяют реализовать аналогичные операции, не изменяя при этом состояние флага переноса (займа) Carry Flag. Рисунок 2 в наглядной форме поясняет выполнение операций сложения без учета переноса.

Рис. 2. Выполнение операций сложения двух операндов без учета переноса

Сложение двух операндов с учетом переноса, полученного при выполнении предыдущей операции, производится с помощью команд ADDC, ADDKC, ADDIC и ADDIKC, форматы которых приведены в таблице 2.

Таблица 2. Форматы команд сложения двух операндов с учетом переноса

Команды ADDC Rd,Ra,Rb и ADDKC Rd,Ra,Rb используются для вычисления суммы содержимого двух регистров общего назначения с номерами a и b с учетом состояния флага переноса перед выполнением этой операции.

Команды ADDIC Rd,Ra,Imm и ADDIKC Rd,Ra,Imm суммируют значение содержимого регистра с номером a с результатом знакового расширения 16-разрядной константы Imm, указанной непосредственно в инструкции, до 32-разрядного слова. Чтобы использовать в качестве второго слагаемого 32-разрядную константу, следует перед командой ADDIC или ADDIKC поместить инструкцию IMM. Для записи результата вычислений, выполняемых с помощью команд ADDC, ADDKC, ADDIC и ADDIKC, используется регистр общего назначения с номером d. Процесс выполнения команд сложения двух операндов с учетом переноса отображен на рис. 3.

Рис. 3. Осуществление операций сложения двух операндов с учетом переноса

При выполнении команд ADDC и ADDIC итоговое состояние флага переноса (займа) Carry Flag в регистре статуса зависит от полученного результата. При возникновении в результате операции сложения переноса из самого старшего разряда этот флаг переключается в установленное состояние (высокого логического уровня). При отсутствии переноса из самого старшего разряда в итоговой сумме флаг переноса (займа) сбрасывается в состояние низкого логического уровня. Инструкции ADDKC и ADDIKC выполняют операции сложения двух операндов с учетом переноса, сохраняя при этом исходное состояние флага переноса (займа).Для выполнения операций вычитания предусмотрены восемь вариантов инструкций. Вычисление разности двух операндов без учета займа выполняется с помощью инструкций RSUB, RSUBK, RSUBI и RSUBIK, форматы которых представлены в таблице 3.

Таблица 3. Форматы команд вычитания двух операндов без учета займа

Для получения разности содержимого двух регистров общего назначения с номерами b и a следует использовать команды RSUB Rd,Ra,Rb и RSUBK Rd,Ra,Rb. Команды RSUBI Rd,Ra,Imm и RSUBIK Rd,Ra,Imm позволяют вычесть значение содержимого регистра с номером a из значения, полученного в результате знакового расширения константы Imm, указанной непосредственно в инструкции, до 32-разрядного слова. Если команде RSUBI или RSUBIK предшествует инструкция IMM, то в качестве первого операнда используется 32-разрядное слово, состоящее из двух 16-разрядных значений, указанных в этих командах. При использовании рассмотренных инструкций вычитания следует обратить внимание на то, что результаты выполнения команд RSUBK и RSUBIK, в отличие от инструкций RSUB и RSUBI, не оказывают влияния на состояние флага переноса (займа). Рисунок 4 демонстрирует выполнение команд вычитания без учета займа.

Рис. 4. Вычисление разности двух операндов без учета займа

Для вычисления разности двух операндов с учетом значения займа, образовавшегося при выполнении предыдущей операции, предназначены инструкции RSUBC, RSUBKC, RSUBIC и RSUBIKC. Информация о форматах этих команд содержится в таблице 4.

Таблица 4. Форматы команд вычитания двух операндов с учетом займа

Команды RSUBIC Rd,Ra,Imm и RSUBIKC Rd,Ra,Imm выполняют вычитание значений содержимого регистра с номером a с участием флага займа из операнда, который является результатом знакового расширения 16-разрядной константы Imm, указанной непосредственно в инструкции, до 32-разрядного слова. Для использования в этих командах в качестве первого операнда 32-разрядной константы следует непосредственно перед ними вставить инструкцию IMM, которая определяет старшие шестнадцать разрядов слова. Вычисление разности содержимого двух регистров общего назначения с номерами b и a с участием значения флага займа производится с помощью команд RSUBC Rd,Ra,Rb и RSUBKC Rd,Ra,Rb. Для записи результата вычислений, выполняемых с помощью команд вычитания, используется регистр общего назначения с номером d, который указывается в качестве первого параметра этих инструкций.

После выполнения команд вычитания с учетом займа RSUBC и RSUBIC состояние флага переноса (займа) регистра статуса изменяется в зависимости от полученного результата.

Инструкции RSUBKC и RSUBIKC применяются в том случае, когда при выполнении операции вычитания с учетом займа необходимо сохранить исходное состояние флага переноса (займа). Рисунок 5 иллюстрирует выполнение операций вычитания с учетом займа.

Инструкции умножения поддерживаются только теми элементами семейства микропроцессорных ядер MicroBlaze, которые реализуются на основе ПЛИС, имеющих в своем составе встроенный аппаратный умножитель. Для выполнения операций умножения двух 32-разрядных операндов предусмотрены две разновидности инструкций, форматы которых представлены в таблице 5.

Таблица 5. Форматы команд умножения двух операндов

Команда MUL Rd,Ra,Rb предназначена для перемножения содержимого двух регистров общего назначения с номерами b и a. В инструкции MULI Rd,Ra,Imm первым сомножителем является значение содержимого регистра с номером a. В качестве второго сомножителя выступает значение, полученное в результате знакового расширения 16-разрядной константы Imm, которая задается непосредственно в инструкции, до 32-разрядного слова. Если инструкции MULI предшествует команда IMM, то указанное в ней значение используется в качестве 16 старших разрядов второго сомножителя. Результат применения команд умножения MUL и MULI представляет собой 64-разрядное значение. Старшие 32 разряда произведения отбрасываются, а младшие записываются в регистр общего назначения с номером d, который указывается в качестве первого параметра инструкций умножения. Осуществление операций умножения двух операндов показано на рис. 6. Обозначение LSW (Least Significant Word), используемое на этом рисунке, соответствует процедуре выделения последнего (младшего) 32-разрядного слова в значении результата операции.

Рис. 6. Выполнение операций умножения двух операндов

Система команд семейства микропроцессорных ядер MicroBlaze содержит два варианта команд целочисленного деления, которые доступны только элементам, реализуемым на основе кристаллов FPGA, обладающих встроенными аппаратными умножителями. При этом в процессе описания конфигурации ядра должна быть указана опция использования встроенного аппаратного делителя. Форматы команд целочисленного деления IDIV и IDIVU приведены в таблице 6.

Таблица 6. Форматы команд целочисленного деления двух операндов

В качестве делимого в обоих вариантах инструкций деления выступает содержимое регистра общего назначения с номером b, который указывается в форме последнего параметра команд. Делителем является значение содержимого регистра с номером a, который задается в виде второго параметра инструкций. При использовании команды IDIV Rd,Ra,Rb содержимое регистров b и a интерпретируется как целое число со знаком. В инструкции IDIVU Rd,Ra,Rb значения делимого и делителя представляют собой целые числа без знака. Результат выполнения операции деления сохраняется в регистре с номером d, который определяется значением первого параметра инструкций IDIV и IDIVU.

Если содержимое регистра делителя представляет собой нулевое значение, то флаг деления на ноль Divide_By_Zero Flag (25-й разряд регистра статуса) устанавливается в состояние высокого логического уровня. При этом в регистр, предназначенный для записи результата, заносится нулевое значение. В случае, когда значение делителя отличается от нуля, флаг Divide_By_Zero Flag находится в сброшенном состоянии. Рисунок 7 иллюстрирует выполнение операций целочисленного деления.

Рис. 7. Осуществление операций целочисленного деления

К группе арифметических команд относятся также инструкции сравнения двух целочисленных операндов CMP и CMPU. Информация о форматах этих команд содержится в таблице 7.

Таблица 7. Форматы команд сравнения двух целочисленных операндов

Инструкции CMP Rd,Ra,Rb и CMPU Rd,Ra,Rb предназначены для сравнения значений содержимого регистров общего назначения с номерами a и b. Результат выполнения операции сравнения заносится в регистр с номером d. Различие инструкций CMP и CMPU заключается в типе сравниваемых операндов. При выполнении команды CMP Rd,Ra,Rb значения содержимого регистров a и b воспринимаются как целые числа со знаком. При использовании команды CMPU Rd,Ra,Rb содержимое регистров a и b интерпретируется как целочисленные значения без знака. Фактически инструкции сравнения выполняют операцию вычитания содержимого регистра a из содержимого регистра b, результат которой записывается в регистр d. Если значения содержимого регистров с номерами a и b равны, то в регистр d заносится нулевое значение. Когда сравниваемые операнды не равны, результат выполнения команд CMP и CMPU отличен от нуля.

При этом информация о соотношении величин содержимого регистров с номерами a и b содержится в старшем (знаковом) разряде регистра d. Рисунок 8 поясняет процесс выполнения инструкций сравнения двух целочисленных операндов.

Рис. 8. Выполнение инструкций сравнения двух целочисленных операндов

Группа логических команд

В командах, входящих в эту группу, используются три параметра, из которых два последних определяют значения операндов. Первым операндом в логических операциях всегда является содержимое регистра общего назначения, номер которого указывается в виде второго параметра команды. В роли второго операнда может выступать либо содержимое другого регистра общего назначения, либо результат знакового расширения до 32 разрядов 16-разрядной константы, значение которой указывается непосредственно в коде инструкции. При мнемонической форме записи команд номер второго регистра и значение константы задается в форме третьего параметра. Чтобы использовать в качестве второго операнда 32-разрядную константу, следует перед соответствующей логической командой поместить инструкцию IMM. Результат выполнения логической операции записывается в регистр общего назначения, номер которого определяет первый параметр инструкции.Форматы команд поразрядных операций «Логическое И» (поразрядное умножение) представлены в таблице 8.

Таблица 8. Форматы команд поразрядных операций «Логическое И»

Для поразрядного умножения содержимого двух регистров общего назначения с номерами a и b предназначена команда AND Rd,Ra,Rb. Команда ANDI Rd,Ra,Imm выполняет операцию «Логическое И» над соответствующими разрядами содержимого регистра с номером a и значения, полученного в результате знакового расширения константы Imm до 32-разрядного слова. Рисунок 9 поясняет процесс выполнения этих команд.

Рис. 9. Выполнение поразрядных операций «Логическое И»

Кроме того, в системе команд микропроцессорного ядра MicroBlaze присутствует еще одна разновидность инструкций, реализующих операцию «Логическое И» с инверсией второго операнда. Форматы этих команд приведены в таблице 9.

Таблица 9. Форматы команд поразрядных операций «Логическое И» с инверсией второго операнда

Инструкция ANDN Rd,Ra,Rb используется для поразрядного умножения содержимого регистра с номером a и инвертированного значения содержимого регистра с номером b.

Команда ANDNI Rd,Ra,Imm предназначена для выполнения поразрядной операции «Логическое И» над содержимым регистра с номером a и инвертированного значения, полученного в результате знакового расширения константы Imm до 32-разрядного слова.

Выполнение команд ANDN и ANDNI иллюстрирует рис. 10.

Рис. 10. Выполнение поразрядных операций «Логическое И» с инверсией второго операнда

Операции поразрядного сложения двух операндов осуществляются с помощью инструкций OR и ORI, форматы которых определены в таблице 10.

Таблица 10. Форматы команд поразрядных операций «Логическое ИЛИ»

Команда ORI Rd,Ra,Imm выполняет поразрядную операцию «Логическое ИЛИ» содержимого регистра с номером a и значения, являющегося результатом знакового расширения константы Imm до 32-разрядного слова. Поразрядное сложение содержимого двух регистров общего назначения с номерами a и b реализует команда OR Rd,Ra,Rb. Последовательность выполнения операций «Логическое ИЛИ» показана на рис. 11.

Рис. 10. Выполнение поразрядных операций «Логическое И» с инверсиейвторого операнда

Форматы инструкций XOR и XORI, предназначенных для выполнения поразрядной операции «Исключающее ИЛИ», представлены в таблице 11.

Таблица 11. Форматы команд поразрядных операций «Исключающее ИЛИ»

Инструкция XORI Rd,Ra,Imm выполняет поразрядную операцию «Исключающее ИЛИ», в которой участвует содержимое регистра с номером a и значение, полученное в результате знакового расширения константы Imm до 32-разрядного слова. Команда XOR Rd,Ra,Rb осуществляет аналогичную операцию, операндами которой является содержимое двух регистров общего назначения с номерами a и b. Выполнение поразрядных операций «Исключающее ИЛИ» демонстрирует рис. 12.

Рис. 12. Выполнение поразрядных операций «Исключающее ИЛИ»

Литература

  1. Зотов В. PicoBlaze — семейство восьмиразрядных микропроцессорных ядер, реализуемых на основе ПЛИС фирмы Xilinx.// Компоненты и технологии" № 4 2003.
  2. Зотов В. Система команд микропроцессорного ядра PicoBlaze, реализуемого на основе ПЛИС семейств Spartan-II, Spartan-IIE, Virtex, Virtex-E // Компоненты и технологии" № 5 2003
  3. Зотов В. Особенности микропроцессорного ядра PicoBlaze, предназначенного для применения в проектах, реализуемых на основе ПЛИС семейства Virtex-II // Компоненты и технологии. 2003. № 6.
  4. Зотов В. Особенности микропроцессорного ядра PicoBlaze, предназначенного для применения в проектах, реализуемых на основе ПЛИС семейства CoolRunner-II// Компоненты и технологии. 2003. № 7.
  5. Зотов В. Проектирование цифровых устройств на основе ПЛИС фирмы Xilinx в САПР WebPack ISE. М.: Горячая линия — Телеком. 2003.
  6. Зотов В. ModelSim — система HDL-моделирования цифровых устройств // Компоненты и технологии. 2002. № 6.
  7. Зотов В. Функциональное моделирование цифровых устройств, проектируемых на базе ПЛИС фирмы Xilinx в среде САПР WebPACK ISE // Компоненты и технологии. 2002. № 7.
  8. Зотов В. Временное моделирование цифровых устройств, проектируемых на базе ПЛИС фирмы Xilinx в среде САПР WebPACK ISE // Компоненты и технологии. 2002. № 8.
  9. Spartan-3 FPGA Handbook. Xilinx, Inc. 2003.

Скачать статью в формате PDF  Скачать статью Компоненты и технологии PDF

 


Другие статьи по данной теме:

Сообщить об ошибке