Простой прототип модулярного процессора с коррекцией сбоев — различия между версиями

Материал из Модулярная арифметики
Перейти к: навигация, поиск
(Новая страница: «В данном материале приводится пример модулярного процессорного ядра (МПЯ), которое можн…»)
 
 
(не показана одна промежуточная версия этого же участника)
Строка 3: Строка 3:
 
== Основные параметры МПЯ ==
 
== Основные параметры МПЯ ==
 
* Вычисления с фиксированной запятой
 
* Вычисления с фиксированной запятой
*  
+
* ...
  
 
== Базис для МПЯ ==
 
== Базис для МПЯ ==
Строка 20: Строка 20:
  
 
Указанный базис включает 8-битные модули (значения для модуля 64, тоже укладываются в 8 бит). Особенность модулярной арифметики не позволяет без существенных затрат определять факт переполнения, поэтому за переполнением диапазона должен следить программист.
 
Указанный базис включает 8-битные модули (значения для модуля 64, тоже укладываются в 8 бит). Особенность модулярной арифметики не позволяет без существенных затрат определять факт переполнения, поэтому за переполнением диапазона должен следить программист.
 +
 +
== Состав памяти ==
 +
# Регистр позиционный 78-битный для ввода / вывода RPOS
 +
# Регистры модулярные AMOD, BMOD, CMOD и DMOD для операций
 +
# Регистры U0, U1, U2, U3 - 12-битные для условных переходов.
 +
# Регистр флагов F1 - F16 (F1 - флаг наличия ошибки)
 +
# Программное ПЗУ - здесь хранится программа предварительно записанная в память устройства. Она не будет меняться до момента перепрошивки. Указатель текущей команды стоит в нулевой позиции перед запуском программы.
 +
# Модулярное ОЗУ - размер 4096 строк по модулям (см. "Базис полный")
 +
# Модулярное ОЗУ - размер 64 строки для хранения позиционных данных
 +
 +
== Таблица микрокоманд ==
 +
<table border=1 cellpadding=5 cellspacing=0>
 +
<tr>
 +
  <td ><b>Код команды (5 бит)</b></td>
 +
  <td ><b>Параметр 1 (кол-во бит)</b></td>
 +
  <td ><b>Параметр 2 (кол-во бит)</b></td>
 +
  <td ><b>Параметр 3 (кол-во бит)</b></td>
 +
  <td ></td>
 +
  <td ></td>
 +
  <td ><b>Описание команды</b></td>
 +
</tr>
 +
<tr>
 +
  <td colspan=7><b>Обмен данными:</b></td>
 +
</tr>
 +
<tr>
 +
  <td >0</td>
 +
  <td>---</td>
 +
  <td colspan=4 ></td>
 +
  <td>Взять число с внешнего устройства и положить в RPOS</td>
 +
</tr>
 +
<tr>
 +
  <td >1</td>
 +
  <td>Код регистра (2 бита)</td>
 +
  <td>Код регистра U (2 бита)</td>
 +
  <td colspan=3 ></td>
 +
  <td>Отправить число из модулярного регистра (AMOD, ... DMOD) в модулярное ОЗУ по указанному адресу (адрес указан в U)</td>
 +
</tr>
 +
<tr>
 +
  <td >2</td>
 +
  <td>Код регистра (2 бита)</td>
 +
  <td>Код регистра U (2 бита)</td>
 +
  <td colspan=3 ></td>
 +
  <td>Отправить число из ОЗУ по указанному адресу (адрес указан в U) в модулярный регистр (AMOD, ... DMOD)</td>
 +
</tr>
 +
<tr>
 +
  <td >3</td>
 +
  <td>Адрес в позиционном ОЗУ (8 бит)</td>
 +
  <td colspan=4 ></td>
 +
  <td>Отправить число из позиционного регистра (RPOS) в позиционное ОЗУ по указанному адресу</td>
 +
</tr>
 +
<tr>
 +
  <td >4</td>
 +
  <td>Адрес в позиционном ОЗУ (8 бит)</td>
 +
  <td colspan=4 ></td>
 +
  <td>Отправить число из позиционное ОЗУ по указанному адресу в позиционный регистр (RPOS)</td>
 +
</tr>
 +
<tr>
 +
  <td >5</td>
 +
  <td>Код регистра (2 бита)</td>
 +
  <td>Код регистра (2 бита)</td>
 +
  <td colspan=3 ></td>
 +
  <td>Скопировать данные из одного регистра в другой (первые 4 бита модулярные, вторые 4 бита U)</td>
 +
</tr>
 +
<tr>
 +
  <td colspan=7><b>Преобразования между системами счисления:</b></td>
 +
</tr>
 +
<tr>
 +
  <td >8</td>
 +
  <td>Код регистра (2 бита)</td>
 +
  <td colspan=4 ></td>
 +
  <td>Преобразовать число в RPOS в модулярный вид и переложить в один из
 +
  регистров (AMOD, ....)</td>
 +
</tr>
 +
<tr>
 +
  <td >9</td>
 +
  <td>Код регистра (2 бита)</td>
 +
  <td colspan=4 ></td>
 +
  <td>Преобразовать число из модулярного регистра (AMOD, ... DMOD) в позиционный вид и положить в RPOS (в случае наличия ошибки, регистр F1 будет содержать 1)</td>
 +
</tr>
 +
<tr>
 +
  <td colspan=7><b>Арифметические операции:</b></td>
 +
</tr>
 +
<tr>
 +
  <td >11</td>
 +
  <td>Код регистра (2 бита)</td>
 +
  <td>Код регистра (2 бита)</td>
 +
  <td colspan=3 ></td>
 +
  <td>Сложить числа из заданных модулярных регистров и положить результат в первый регистр (без контроля переполнения, за переполнением следит программист)</td>
 +
</tr>
 +
<tr>
 +
  <td >12</td>
 +
  <td>Код регистра (2 бита)</td>
 +
  <td>Код регистра (2 бита)</td>
 +
  <td colspan=3 ></td>
 +
  <td>Умножить числа из заданных модулярных регистров и положить результат в первый регистр (без контроля переполнения, за переполнением следит программист)</td>
 +
</tr>
 +
<tr>
 +
  <td >13</td>
 +
  <td>Код регистра (2 бита)</td>
 +
  <td colspan=4 ></td>
 +
  <td>Обнулить заданный модулярный регистр (AMOD-DMOD)</td>
 +
</tr>
 +
<tr>
 +
  <td >14</td>
 +
  <td>---</td>
 +
  <td colspan=4 ></td>
 +
  <td>Обнулить RPOS</td>
 +
</tr>
 +
<tr>
 +
  <td >15</td>
 +
  <td>Код регистра (2 бита)</td>
 +
  <td>Код канала (5 бит)</td>
 +
  <td>Значение для модуля (8 бит)</td>
 +
  <td colspan=2 ></td>
 +
  <td>Положить в модулярный регистр (AMOD-DMOD) модулярный канал номер N заданное значение K (меньше N)</td>
 +
</tr>
 +
<tr>
 +
  <td colspan=7><b>Проверка на ошибки:</b></td>
 +
</tr>
 +
<tr>
 +
  <td >16</td>
 +
  <td>Код регистра (2 бита)</td>
 +
  <td>Позиция в стеке команд (14 бит)</td>
 +
  <td colspan=3 ></td>
 +
  <td>Проверить есть ли ошибка в указаном регистре (за счет двух проверочных модулей) в случае отсутствия ошибки перейти по указанному адресу</td>
 +
</tr>
 +
<tr>
 +
  <td >17</td>
 +
  <td>Код регистра (2 бита)</td>
 +
  <td colspan=4 ></td>
 +
  <td>Исправить однократную ошибку в указанном регистре (дольше чем проверка)</td>
 +
</tr>
 +
<tr>
 +
  <td colspan=7><b>Условные переходы:</b></td>
 +
</tr>
 +
<tr>
 +
  <td >18</td>
 +
  <td>Код регистра U (2 бита)</td>
 +
  <td>Адрес в позиционном ОЗУ (8 бит)</td>
 +
  <td colspan=3 ></td>
 +
  <td>Установить значение регистра U0, U1, U2 или U3 значение взятое из ячейки позиционного ОЗУ</td>
 +
</tr>
 +
<tr>
 +
  <td >19</td>
 +
  <td>Код регистра U (2 бита)</td>
 +
  <td>Значение (14 бит)</td>
 +
  <td colspan=3 ></td>
 +
  <td>Установить значение регистра U0, U1, U2 или U3 значение переданное в команде</td>
 +
</tr>
 +
<tr>
 +
  <td >20</td>
 +
  <td>Код регистра U (2 бита)</td>
 +
  <td colspan=4 ></td>
 +
  <td>Установить значение регистра U0, U1, U2 или U3 значение 0</td>
 +
</tr>
 +
<tr>
 +
  <td >21</td>
 +
  <td>Код регистра U (2 бита)</td>
 +
  <td colspan=4 ></td>
 +
  <td>Вычесть из значения регистра U0, U1, U2 или U3 единицу</td>
 +
</tr>
 +
<tr>
 +
  <td >22</td>
 +
  <td>Код регистра U (2 бита)</td>
 +
  <td colspan=4 ></td>
 +
  <td>Прибавть к регистру U0, U1, U2 или U3 единицу</td>
 +
</tr>
 +
<tr>
 +
  <td >23</td>
 +
  <td>Код регистра U (2 бита)</td>
 +
  <td>Позиция в стеке команд (14 бит)</td>
 +
  <td colspan=3 ></td>
 +
  <td>Переход к команде в позиции X (в стеке команд) если в регистре U0, U1, U2 или U3 значение равно 0.</td>
 +
</tr>
 +
</table>
 +
 +
== Пример решаемой задачи ==
 +
Написать программу, которая выполняет скалярное произведение произвольного числа 32-х битных элементов менее чем 1024 в формате - сначала подается число элементов вектора (N), затем последовательно сначала элемент вектора 1, потом элемент вектора 2 и.т.д. Всего 2*N значений. Финальный результат проверяется на ошибки, в случае наличия ошибки в рассчетах выполняется пересчет.
 +
 +
== Текстовое описание программы ==
 +
Описание приводится с использованием команд, которые поддерживает процессорное ядро.
 +
 +
* 0: Обнулить CMOD
 +
* 1: Обнулить U1
 +
* 2: Взять число с внешнего устройства - положить в RPOS
 +
* 3: Отправить число из позиционного регистра (RPOS) в позиционное ОЗУ по адресу 0
 +
* 4: Установить регистр U0 в значение взятое из ячейки позиционного ОЗУ по адресу 0
 +
* 5: Перейти к команде 18 программы если в U0 находится 0
 +
* 6: Взять число с внешнего устройства и положить в RPOS
 +
* 7: Преобразовать число в RPOS в модулярный вид и переложить в AMOD
 +
* 8: Взять число с внешнего устройства и положить в RPOS
 +
* 9: Преобразовать число в RPOS в модулярный вид и переложить в BMOD
 +
* 10: Умножить числа из AMOD и BMOD и положить результат в AMOD
 +
* 11: Сложить числа из CMOD и AMOD - результат в CMOD
 +
* 12: Положить число из AMOD в ОЗУ с адресом из U1
 +
* 13: Прибавить к U1 единицу
 +
* 14: Положить число из BMOD в ОЗУ с адресом из U1
 +
* 15: Прибавить к U1 единицу
 +
* 16: Вычесть из U0 единицу
 +
* 17: Перейти к позиции 5 в стеке команд
 +
* 18: Проверить есть ли ошибка в регистре CMOD. В случае отсутствия ошибки перейти к команде 32.
 +
* 19: Установить регистр U0 значение взятое из регистра U1
 +
* 20: Обнулить U1
 +
* 21: Обнулить CMOD
 +
* 22: Перейти к команде 31 программы если в U0 находится 0
 +
* 23: Отправить число из ОЗУ по адресу указанному в U1 в модулярный регистр AMOD
 +
* 24: Прибавить к U1 единицу
 +
* 25: Отправить число из ОЗУ по адресу указанному в U1 в модулярный регистр BMOD
 +
* 26: Прибавить к U1 единицу
 +
* 27: Умножить числа из AMOD и BMOD и положить результат в AMOD
 +
* 28: Сложить числа из CMOD и AMOD - результат в CMOD
 +
* 29: Вычесть из U0 единицу
 +
* 30: Перейти к позиции 22 в стеке команд
 +
* 31: Перейти к команде 18 в стеке команд
 +
* 32: Завершить работу программы
 +
 +
== Программа в машинных кодах ==
 +
 +
* 0: 01101 10
 +
* 1: 10100 01
 +
* 2: 00000
 +
* 3: 00011 00000000
 +
* 4: 10010 00 00000000
 +
* 5: 10111 00 00000000010010
 +
* 6: 00000
 +
* 7: 01000 00
 +
* 8: 00000
 +
* 9: 01000 01
 +
* 10: 01100 00 01
 +
* 11: 01011 10 00
 +
* 12: 00001 00 01
 +
* 13: 10110 01
 +
* 14: 00001 01 01
 +
* 15: 10110 01
 +
* 16: 10101 00
 +
* 17: 10111 10 00000000000101
 +
* 18: 10000 10 00000000100000
 +
* 19: 00101 0100 0101
 +
* 20: 10100 01
 +
* 21: 01101 10
 +
* 22: 10111 00 00000000011111
 +
* 23: 00010 01 00
 +
* 24: 10110 01
 +
* 25: 00010 01 01
 +
* 26: 10110 01
 +
* 27: 01100 00 01
 +
* 28: 01011 10 00
 +
* 29: 10101 00
 +
* 30: 10111 10 00000000010110
 +
* 31: 10111 10 00000000010010
 +
* 32: EOP

Текущая версия на 08:59, 9 декабря 2015

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

Основные параметры МПЯ

  • Вычисления с фиксированной запятой
  • ...

Базис для МПЯ

Базис полный (78 бит):

3 5 7 11 13 17 23 29 31 37 41 43 47 53 59 61 64 (Динамический диапазон: 197538326500053845866560 или 78 бит)

Рабочие модули (66 бит):

3 5 7 11 13 17 23 29 31 37 41 43 47 53 59 (Динамический диапазон: 50598956583005595765 или 66 бит)

Проверочные модули:

61 64

Указанный базис включает 8-битные модули (значения для модуля 64, тоже укладываются в 8 бит). Особенность модулярной арифметики не позволяет без существенных затрат определять факт переполнения, поэтому за переполнением диапазона должен следить программист.

Состав памяти

  1. Регистр позиционный 78-битный для ввода / вывода RPOS
  2. Регистры модулярные AMOD, BMOD, CMOD и DMOD для операций
  3. Регистры U0, U1, U2, U3 - 12-битные для условных переходов.
  4. Регистр флагов F1 - F16 (F1 - флаг наличия ошибки)
  5. Программное ПЗУ - здесь хранится программа предварительно записанная в память устройства. Она не будет меняться до момента перепрошивки. Указатель текущей команды стоит в нулевой позиции перед запуском программы.
  6. Модулярное ОЗУ - размер 4096 строк по модулям (см. "Базис полный")
  7. Модулярное ОЗУ - размер 64 строки для хранения позиционных данных

Таблица микрокоманд

Код команды (5 бит) Параметр 1 (кол-во бит) Параметр 2 (кол-во бит) Параметр 3 (кол-во бит) Описание команды
Обмен данными:
0 --- Взять число с внешнего устройства и положить в RPOS
1 Код регистра (2 бита) Код регистра U (2 бита) Отправить число из модулярного регистра (AMOD, ... DMOD) в модулярное ОЗУ по указанному адресу (адрес указан в U)
2 Код регистра (2 бита) Код регистра U (2 бита) Отправить число из ОЗУ по указанному адресу (адрес указан в U) в модулярный регистр (AMOD, ... DMOD)
3 Адрес в позиционном ОЗУ (8 бит) Отправить число из позиционного регистра (RPOS) в позиционное ОЗУ по указанному адресу
4 Адрес в позиционном ОЗУ (8 бит) Отправить число из позиционное ОЗУ по указанному адресу в позиционный регистр (RPOS)
5 Код регистра (2 бита) Код регистра (2 бита) Скопировать данные из одного регистра в другой (первые 4 бита модулярные, вторые 4 бита U)
Преобразования между системами счисления:
8 Код регистра (2 бита) Преобразовать число в RPOS в модулярный вид и переложить в один из регистров (AMOD, ....)
9 Код регистра (2 бита) Преобразовать число из модулярного регистра (AMOD, ... DMOD) в позиционный вид и положить в RPOS (в случае наличия ошибки, регистр F1 будет содержать 1)
Арифметические операции:
11 Код регистра (2 бита) Код регистра (2 бита) Сложить числа из заданных модулярных регистров и положить результат в первый регистр (без контроля переполнения, за переполнением следит программист)
12 Код регистра (2 бита) Код регистра (2 бита) Умножить числа из заданных модулярных регистров и положить результат в первый регистр (без контроля переполнения, за переполнением следит программист)
13 Код регистра (2 бита) Обнулить заданный модулярный регистр (AMOD-DMOD)
14 --- Обнулить RPOS
15 Код регистра (2 бита) Код канала (5 бит) Значение для модуля (8 бит) Положить в модулярный регистр (AMOD-DMOD) модулярный канал номер N заданное значение K (меньше N)
Проверка на ошибки:
16 Код регистра (2 бита) Позиция в стеке команд (14 бит) Проверить есть ли ошибка в указаном регистре (за счет двух проверочных модулей) в случае отсутствия ошибки перейти по указанному адресу
17 Код регистра (2 бита) Исправить однократную ошибку в указанном регистре (дольше чем проверка)
Условные переходы:
18 Код регистра U (2 бита) Адрес в позиционном ОЗУ (8 бит) Установить значение регистра U0, U1, U2 или U3 значение взятое из ячейки позиционного ОЗУ
19 Код регистра U (2 бита) Значение (14 бит) Установить значение регистра U0, U1, U2 или U3 значение переданное в команде
20 Код регистра U (2 бита) Установить значение регистра U0, U1, U2 или U3 значение 0
21 Код регистра U (2 бита) Вычесть из значения регистра U0, U1, U2 или U3 единицу
22 Код регистра U (2 бита) Прибавть к регистру U0, U1, U2 или U3 единицу
23 Код регистра U (2 бита) Позиция в стеке команд (14 бит) Переход к команде в позиции X (в стеке команд) если в регистре U0, U1, U2 или U3 значение равно 0.

Пример решаемой задачи

Написать программу, которая выполняет скалярное произведение произвольного числа 32-х битных элементов менее чем 1024 в формате - сначала подается число элементов вектора (N), затем последовательно сначала элемент вектора 1, потом элемент вектора 2 и.т.д. Всего 2*N значений. Финальный результат проверяется на ошибки, в случае наличия ошибки в рассчетах выполняется пересчет.

Текстовое описание программы

Описание приводится с использованием команд, которые поддерживает процессорное ядро.

  • 0: Обнулить CMOD
  • 1: Обнулить U1
  • 2: Взять число с внешнего устройства - положить в RPOS
  • 3: Отправить число из позиционного регистра (RPOS) в позиционное ОЗУ по адресу 0
  • 4: Установить регистр U0 в значение взятое из ячейки позиционного ОЗУ по адресу 0
  • 5: Перейти к команде 18 программы если в U0 находится 0
  • 6: Взять число с внешнего устройства и положить в RPOS
  • 7: Преобразовать число в RPOS в модулярный вид и переложить в AMOD
  • 8: Взять число с внешнего устройства и положить в RPOS
  • 9: Преобразовать число в RPOS в модулярный вид и переложить в BMOD
  • 10: Умножить числа из AMOD и BMOD и положить результат в AMOD
  • 11: Сложить числа из CMOD и AMOD - результат в CMOD
  • 12: Положить число из AMOD в ОЗУ с адресом из U1
  • 13: Прибавить к U1 единицу
  • 14: Положить число из BMOD в ОЗУ с адресом из U1
  • 15: Прибавить к U1 единицу
  • 16: Вычесть из U0 единицу
  • 17: Перейти к позиции 5 в стеке команд
  • 18: Проверить есть ли ошибка в регистре CMOD. В случае отсутствия ошибки перейти к команде 32.
  • 19: Установить регистр U0 значение взятое из регистра U1
  • 20: Обнулить U1
  • 21: Обнулить CMOD
  • 22: Перейти к команде 31 программы если в U0 находится 0
  • 23: Отправить число из ОЗУ по адресу указанному в U1 в модулярный регистр AMOD
  • 24: Прибавить к U1 единицу
  • 25: Отправить число из ОЗУ по адресу указанному в U1 в модулярный регистр BMOD
  • 26: Прибавить к U1 единицу
  • 27: Умножить числа из AMOD и BMOD и положить результат в AMOD
  • 28: Сложить числа из CMOD и AMOD - результат в CMOD
  • 29: Вычесть из U0 единицу
  • 30: Перейти к позиции 22 в стеке команд
  • 31: Перейти к команде 18 в стеке команд
  • 32: Завершить работу программы

Программа в машинных кодах

  • 0: 01101 10
  • 1: 10100 01
  • 2: 00000
  • 3: 00011 00000000
  • 4: 10010 00 00000000
  • 5: 10111 00 00000000010010
  • 6: 00000
  • 7: 01000 00
  • 8: 00000
  • 9: 01000 01
  • 10: 01100 00 01
  • 11: 01011 10 00
  • 12: 00001 00 01
  • 13: 10110 01
  • 14: 00001 01 01
  • 15: 10110 01
  • 16: 10101 00
  • 17: 10111 10 00000000000101
  • 18: 10000 10 00000000100000
  • 19: 00101 0100 0101
  • 20: 10100 01
  • 21: 01101 10
  • 22: 10111 00 00000000011111
  • 23: 00010 01 00
  • 24: 10110 01
  • 25: 00010 01 01
  • 26: 10110 01
  • 27: 01100 00 01
  • 28: 01011 10 00
  • 29: 10101 00
  • 30: 10111 10 00000000010110
  • 31: 10111 10 00000000010010
  • 32: EOP