Простой прототип модулярного процессора с коррекцией сбоев — различия между версиями
Turbo (обсуждение | вклад) (Новая страница: «В данном материале приводится пример модулярного процессорного ядра (МПЯ), которое можн…») |
Turbo (обсуждение | вклад) |
||
Строка 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> |
Версия 08:45, 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 бит). Особенность модулярной арифметики не позволяет без существенных затрат определять факт переполнения, поэтому за переполнением диапазона должен следить программист.
Состав памяти
- Регистр позиционный 78-битный для ввода / вывода RPOS
- Регистры модулярные AMOD, BMOD, CMOD и DMOD для операций
- Регистры U0, U1, U2, U3 - 12-битные для условных переходов.
- Регистр флагов F1 - F16 (F1 - флаг наличия ошибки)
- Программное ПЗУ - здесь хранится программа предварительно записанная в память устройства. Она не будет меняться до момента перепрошивки. Указатель текущей команды стоит в нулевой позиции перед запуском программы.
- Модулярное ОЗУ - размер 4096 строк по модулям (см. "Базис полный")
- Модулярное ОЗУ - размер 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. |