PicoBlaze Comands

Перевод Войтов Г.

Источник : Xilinx.com

Система команд

‘X’ и ‘Y’ ссылаются на определённые регистры ‘s’ в диапазоне 0 F.
‘kk’ представляет собой постоянное значение в диапазоне от 00 до FF.
‘aaa’ является адресом в диапазоне от 000 до 3FF.
‘pp’ представляет собой адрес порта в диапазоне от 00 до FF.
‘ss’ указывает адрес ячейки внутренней памяти в диапазоне от 00 до 3F.

 



JUMP

При обычных условиях, счетчика команд (PC) наращивается и тем самым определяет адрес следующей команды. Адресное пространство состоит из 1024 ячеек (от 000 до 3FF 16) и поэтому разрядность счетчика команд равна 10. Стоит отметить, что вершина памяти равна 3FF 16 и после неё счётчик переходит в состояние 000.

PC = PC +  1 – обычная команда

Команда JUMP используется для изменения этой последовательности, определяя новый адрес. Есть также команды условного перехода. Условный JUMP выполняется только при соответствующих переходу состояниях флагов ZERO или CARRY.

 

Команда JUMP не оказывает никакого влияния на состояние этих флагов. Формат команды JUMP показан на рис. 4.

 


Биты 12 -10 определяют условия перехода, как показано в табл. 1

Таб.1 – Условия переходов   

Бит 12

Бит 11

Бит 10

Условие

0

*

*

Безусловный переход

1

0

0

Переход по нулю

1

0

1

Переход, если не ноль

1

1

0

Переход по переносу

1

1

1

Переход, если нет переноса

 
Каждая команда JUMP  содержит 10-разрядный адрес в виде значения 3 шестнадцатеричных цифр. Ассемблер поддерживает метки для упрощения механизма переходов.

 
CALL

Команда CALL подобна команде JUMP в том, что меняет нормальную последовательность выполнения программы путём загрузки нового адреса. Так же возможна условная команда CALL. Кроме записи нового адреса, команда CALL помещает текущее значение счетчика команд  (PC) в стек счетчиков. Команда CALL не влияет на состоянии флагов.


Стек счетчиков команд способен одновременно содержать 31-о адресное значения. Это допускает создавать писать подпрограммы 31-го уровня вложенности. Кроме того, стек используется во время обработки прерывания и поэтому должен быть свободен по крайней мере 1 уровень, если прерывания разрешены.Стек реализован как отдельный циклический буфер. Когда стек становится полным новые значения будут просто записываться поверх самых старых. Отныне нет необходимости сбрасывать указатель вершины стека при сбросе программного обеспечения. Это также
объясняет, почему нет никаких команд  управления стеком и почему никакую другую память не нужно резервировать для обеспечения стека.


Биты 12 - 10 определяют условия вызова подпрограммы как и в случае команды  JUMP. Команда CALL  содержит 10-разрядный адрес в виде значения 3 шестнадцатеричных цифр. Ассемблер поддерживает метки для упрощения механизма вызова  подпрограммы.

RETURN

Команда RETURN - дополнение к команде CALL. Команда RETURN так же может быть условной условна. В данном случае значение счетчика команд  PC будет извлечено в него из стека. Это обеспечивает возврат к команде, следующую за командой CALL, которая вызвала подпрограмму.
RETURN не изменяет состояния флагов.
Способ выполнения команды RETURN изображён на рис. 7.

 

Ответственность корректного возврата программиста из подпрограммы ложится на программиста -  стек должен содержать действительный адрес. Циклическая реализация стека может позволить выполнить команду RETURN на адрес, который может быть неопределённым.
Формат команды RETURN показан на рис. 8.



RETURNI

Команда RETURNI – это особый случай группы команд возврата. RETURNI используется по завершению работы обработчика прерывания. RETURNI безусловен и поэтому всегда загружает значение из стека в счетчик команд.
Команда RETURNI восстанавливает флаги в состояние, в котором они были до обработки прерывания. RETURNI также устанавливает дальнейшую возможность обработки прерываний, используя операнды ENABLE и DISABLE.

Особенности выполнения команды RETURNI изображены на рис. 9
Ответственность того, что команда RETURNI только выполняется в ответ на прерывание, ложится на. Каждая команда RETURNI должна указывать факт дальнейшего разрешения или отключения прерываний.
Формат команды RETURNI изображён на рис. 10.




ENABLE/DISABLE INTERRUPTS

Эти команды используются, чтобы установить и сбросить флаг INT_ENABLE. Перед разрешением прерываний подходящая программа – обработчик прерывания должна быть связана с адресом вектора прерывания (который размещён в ячейке 3FF). Никогда не нужно разрешать прерывания пока не готова процедура их обработки прерывания.
Работа команды изображена на рис. 11.

 

Прерывания заблокированы, когда флаг INT_ENABLE в сброшен. Это состояние флага по умолчанию, следующего за инициализацией или сбросом KCPSM3. INT_ENABLE также сброшен в течение обработки активного прерывания.
Формат команд ENABLE/DISABLE INTERRUPTS изображена на рис.12


LOAD

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


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

Первый операнд команды LOAD указывает на регистр, который будет использоваться как регистр ‘s’ завершенный шестнадцатеричной цифрой. Второй операнд должен затем указывать второй регистр подобным путём или задавать 8-разрядную константу, используя 2 шестнадцатеричных цифры.

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

 
AND

Команда AND выполняет побитовую  логическую операцию ‘И’ над двумя операндами. Например, произведение 00001111 И  равно 00000011. Первый операнд - любой регистр, и в этот же регистр будет записан результат операции. Второй операнд, возможно, также является любым регистром  или 8-разрядной константой. Эта операция устанавливает флаги. ОперацияAND полезна для сбрасывания и выполняя проверки состояния отдельных бит регистра. Состояние флага ZERO может за тем использоваться в командах перехода.


В каждой команде AND указывается первый операнд как регистр ‘s’, завершенный шестнадцатеричной цифрой. В этот регистр также записывается результат. Второй операнд должен затем указывать на второй регистр подобном образом или определять значение 8-битной константы (2 шестнадцатеричных цифры).
Форматы команды AND показаны на рис. 16.


OR

Команда OR выполняет операцию побитового логического ‘ИЛИ’ над двумя операндами. Например: 00001111 ИЛИ  00110011 даст результат 00111111. Первый операнд - любой регистр, и в него же будет записан результат операции. Второй операнд, возможно, также является любым регистром  или значением 8-разрядной константы. Эта операция устанавливает флаги. Команда OR предоставляет возможность установки любых битов указанного регистра, предшествующей команде TEST.
На рис. 17 показаны особенности работы команды OR.

В каждой команде OR указывается первый операнд как регистр ‘s’, завершенный шестнадцатеричной цифрой. В этот регистр также записывается результат. Второй операнд должен затем указывать на второй регистр подобном образом или определять значение 8-битной константы (2 шестнадцатеричных цифры).
Формат команды OR изображён на рис.18


 


XOR

Команда XOR выполняет побитовую операцию ‘XOR’ между двумя операндами. Например: 00001111 XOR  00110011 = 00111100. Первый операнд - любой регистр, и в этот же регистр будет записан результат операции. Второй операнд, возможно, также является любым регистром  или 8-разрядной константой. Эта операция устанавливает флаги. Операция XOR
используется для инвертирования отдельных битов.
Рис. 19 – Выполнение команды XOR

 

Особенности выполнения команды XOR показаны на рис. 19
Каждая команда XOR в качестве первого операнда задаёт использует регистр, указанный как ‘sХ’, где Х – любая шестнадцатеричная цифра. В этот регистр будет записан результат. Второй операнд должен быть задан подобным путём или константны 8-битным значением в виде 2-х шестнадцатеричных цифр.
На рис. 20 изображены форматы команды XOR.

TEST

Команда TEST выполняет операцию побитового логического ‘И’ над двумя операндами, но в отличие от команды AND, результат операции не сохраняется, а флаги устанавливаются в зависимости от результата. Флаг ZERO установлен, если все разряды временного результата нулевые. Флаг CARRY используется для хранения результата контроля по паритету временного результата. Контролю по четности обычно подлежат биты, т.е., если  содержимое ‘s5’ = 3D( 00111101), выполнение команды TEST s5,FF установит флажок CARRY, указывающий результат ODD проверки. Команда  обычно используется для проверки единственного бита. Например TEST s5,04 проверит второй бит регистра ‘S5’, который установит бы флаг CARRY, если разряд единичен (сбросит, если разряд нулевой) и установит флажок ZERO, если разряд нулевой(сбросит, если разряд единичный).
Особености выполнения команды TEST показаны на рис. 21
Рис. 21 – Особенности выполнения команды TEST

Каждая команда TEST в качестве первого операнда использует регистр, указанный как ‘sХ’, где Х – любая шестнадцатеричная цифра. В этот регистр будет записан результат. Второй операнд должен быть задан подобным путём или константным 8-битным значением в виде 2-х шестнадцатеричных цифр.
Форматы команды TEST показаны на рис. 22



ADD

Команда ADD выполняет 8-разрядное суммирование двух операндов. Первый операнд - любой регистр, и, как и в предыдущих случаях, в него будет записан результат операции. Второй операнд, возможно, также является любым регистром или значением 8-разрядной константы. По завершению этой операцией устанавливаются флаги в соответствующее значение. Примечание: эта команда не использует флаг CARRY в качестве входного переноса, и нет никакой необходимости устанавливать флаги
перед её использованием. Способность использования любых константных значений полезна в контрольных последовательностях формирования и счётчиках циклов.
Особенности выполнения команды ADD показаны на рис. 23.

 

Операнды задаются как и в командах AND, TEST. Форматы команды ADD приведены на рис. 24.

ADDCY

Команда ADDCY выполняет сложение двух 8-разрядных операндов с использованием флага CARRY в качестве входного переноса. Первый операнд - любой регистр, и в него же будет записан результат операции. Второй операнд, возможно, также является любым регистром или значение 8-разрядной константы. Эта операция устанавливает значения флагов. Операция ADDCY может использоваться при сложении операндов и счётчиках циклов, формата более 8 бит.
Особенности выполнения команды ADD изображены на рис. 25

В команде ADDCY в качестве первого операнда задаётся регистр, указанный как ‘sХ’, где Х – любая шестнадцатеричная цифра. В этот регистр будет записан результат. Второй операнд должен быть задан подобным путём или константным 8-битным значением в виде 2-х шестнадцатеричных цифр.
Форматы команды ADDCY показаны на рис. 26



SUB

Команда SUB выполняет вычитание двух 8-разрядных операндов. Первый операнд - любой регистр, и в нём же будет сохранён результат операции. Второй операнд, возможно, также является любым регистром или значением 8-разрядной константы. Эта операция формирует флаги. Примечание: эта команда не использует CARRY в качестве входного займа, и т.е. нет необходимости устанавливать флаги в нужное состояние перед использованием. Флажок CARRY указывает, когда необходим займ в старший разряд. Например, если ‘s05’ содержит 2716 выполнить команду SUB s05,35, то результат, записанный в ‘s05’ будет F2,а флаг CARRY будет установлен.
На рис. 27 наглядно показаны особенности выполнения команды SUB.

В команде SUB в качестве первого операнда задаётся регистр, указанный как ‘sХ’, где Х – любая шестнадцатеричная цифра. В этот регистр будет записан результат. Второй операнд должен быть задан подобным путём или константным 8-битным значением в виде 2-х шестнадцатеричных цифр.
Форматы команды SUB показаны на рис. 28.

SUBCY

Команда SUBCY выполняет 8-разрядное вычитание двух операндов c использованием входного займа(CARRY). Первый операнд - любой регистр, в который будет записан результат операции. Второй операнд, возможно, также любой регистр или значение 8-разрядной константы. Флаги будут сформированы по завершению операции. SUBCY операция может использоваться для организации вычитания и счётчиков циклов, формат которых превышает 8 бит.
На рис. 29 показаны особенности выполнения команды SUBCY.

В команде SUBCY в качестве первого операнда задаётся регистр, указанный как ‘sХ’, где Х – любая шестнадцатеричная цифра. В этот регистр будет записан результат. Второй операнд должен быть задан подобным путём или константным 8-битным значением в виде 2-х шестнадцатеричных цифр.
Форматы команды SUBCY показаны на рис. 30.

COMPARE

Команда COMPARE выполняет 8-разрядное вычитание двух операндов, но в отличие от команды SUB, результат отбрасывается, и формируютсятолько флаги. Флаг ZERO установлен, когда все разряды временного результата нулевые и это говорит о равенстве входных операндов. Флаг CARRY когда произошёл займ из старшего разряда, а это означает, что второй операнд был больше, чем первый. Например, если ‘s05’ содержит 27 16 и выполняется команда COMPARE  s05,35, то флаг CARRY будет установлен (35>27)  и флаг ZERO будет сброшен (35?27).
Особенности выполнения команды COMPARE показаны на рис. 31.

В команде COMPARE в качестве первого операнда задаётся регистр, указанный как ‘sХ’, где Х – любая шестнадцатеричная цифра. В этот регистр будет записан результат. Второй операнд должен быть задан подобным путём или константным 8-битным значением в виде 2-х шестнадцатеричных цифр.
Форматы команды COMPARE показаны на рис. 32.



SR0, SR1, SRX, SRA, RR

Вся группа команд сдвига вправо изменяют содержимое одного регистра, и при этом используют флаги. Особенности выполнения команд сдвигов показаны на рис. 33.


Каждая команда использует один операнд, которым является один из регистров, указанный как ‘sХ’, Х – любая шестнадцатеричная цифра. Ассемблер поддерживает имена регистров для упрощения написания программ.
Формат команд сдвига вправо изображён на рис.34.

Биты 2- 0 определяют тип сдвига в порядке, описанном в таб. 2.

Таб. 2 – Значения битов 2 – 0 для команд сдвига вправо


Бит 2

Бит 1

Бит 0

Команда

1

1

0

SR0 sX

1

1

1

SR1 sX

0

1

0

SRX sX

0

0

0

SRA sX

1

0

0

RR sX

 


 

SL0, SL1, SLX, SLA, RL
Вся группа команд сдвига влево обрабатывают содержимое указанного регистра, используя при этом флаги.

 

Каждая команда использует один операнд, которым является один из регистров, указанный как ‘sХ’, Х – любая шестнадцатеричная цифра. Ассемблер поддерживает имена регистров для упрощения написания программ.
Формат команд сдвига вправо изображён на рис.36.

Биты 2- 0 определяют тип сдвига в порядке, описанном в таб. 3.


 

Таб. 3 – Значения битов 2 – 0 для команд сдвига влево


Бит 2

Бит 1

Бит 0

Команда

1

1

0

SL0 sX

1

1

1

SL1 sX

0

1

0

SLX sX

0

0

0

SLA sX

1

0

0

RL sX

OUTPUT

Команда OUTPUT позволяет вывести содержимое любого регистра в логическую оболочку KCPSM3. Портовый адрес (в диапазоне от 00 до FF) может быть задан как константное значение или косвенно как содержимое любого регистра. Флаги не изменяются этой операцией.
Особенности выполнения команды OUTPUT показаны на рис.37.

Требуется, чтобы логика интерфейса пользователя  декодировала значение адреса порта PORT_ ID и фиксировала данные, заданные OUT_PORT. WRITE_STROBE устанавливается в течение операции вывода он используется для синхронизации регистра данных или подаётся на разрешающий вход оперативной памятиRAM.
Каждая команда OUTPUT в качестве первого параметра использует регистр, заданный как ‘sX’, X - любая шестнадцатеричная цифра. Второй параметр задаёт адрес порта - это может быть регистр, заданный подобным образом, или 8-разрядная константа (2 шестнадцатеричные цифры).
Форматы команды OUTPUT показаны на рис. 38.

 

INPUT

Команда INPUT предоставляет возможность ввода данных в один из внутренних регистров KCPSM3 извне. Адрес порта(в диапазоне от 00 до FF) может быть задан константным значением или косвенно как содержимое любого регистра. Операция не ипользует флаги.
Особенности выполнения операции INPUT показаны на рис. 39.

Требуется, чтобы логика интерфейса пользователя  декодировала значение адреса порта PORT_ID и выдавала правильные данные в IN_PORT.
READ_STROBE  устанавливается в течение входной операции, но не обязательно декодировать этот сигнал во внешнем. Однако он может быть полезен для определения того, прочитаны ли данные, например, при использовании буфера FIFO.
В каждой команде INPUT задаётся регистр назначения как ‘s’, завершенный шестнадцатеричной цифрой. Второй параметр адрес порта ввода, используя значение регистра подобном образом, или путём указания адреса порта 8-разрядной константой( 2 шестнадцатеричных цифры).
Форматы команды INPUT показаны на рис. 40.


STORE

Команда STORE позволяет записать содержимое любого регистра в 64-байтовую оперативную память(scratch pad memory). Адрес ячейки памяти (в диапазоне от 00 до 3F) может быть задан константным значением или косвенно как содержимое любого регистра. Эта операция не использует флаги.
Особенности выполнения команды STORE показаны на рис. 41.

D каждой команде STORE первый параметр – регистр, заданный как ‘s’, завершенный шестнадцатеричной цифрой. Второй параметр должен указывать адрес памяти, используя значение регистра в подобном пути или задавать адрес ячейки памяти 6-разрядной константой, используя 2 шестнадцатеричных цифры.
Хотя ассемблер отвергнет константы больше, чем 3F, ответственность гарантировать, что значение ‘sY’ в пределах адресного диапазона, ложится на программиста.
Форматы команды STORE изображены на рис. 42.



FETCH

Команда FETCH позволяет записать данные, хранящиеся в 64-байтовой оперативной памяти(scratch pad memory), в любой из внутренних регистров. Адрес ячейки памяти (в диапазоне от 00 до 3F) может быть определен по константному значению или косвенно как содержимое любого из регистров. Эта операция не воздействует на флаги.
Особенности выполнения команды FETCH показаны на рис. 43.

В каждой команде FETCH должен быть указан регистр назначения как символ ‘s’, завершенный шестнадцатеричной цифрой. Второй параметр должен задавать адрес ячейки памяти, используя значение регистра в подобном пути или при помощи 6-разрядной константы, используя 2 шестнадцатеричных цифры.
Хотя ассемблер отвергнет константы, больше, чем 3F, ответственность гарантировать то, что значение ‘sY’ в пределах адресного диапазона, ложится на программиста .
Форматы команды FETCH показаны на рис. 44.