. ЗПУ - это микропроцессор стековая машина, разработанная норвежской компанией Zylin AS для выполнения контрольного кода в электронных системах, которые включают программируемую логическую матрицу (FPGA).
ZPU - относительно недавний стековый автомат с небольшой экономической нишей, у которого растет число пользователей и реализаций. Он был разработан так, чтобы потребовать очень небольшого количества электронной логики, что делает больше электронной логики доступной для других целей в FPGA. Чтобы его было легко использовать, он имеет порт GNU Compiler Collection. Это значительно упрощает применение, чем процессоры без компиляторов. Жертвуя скоростью в обмен на небольшой размер, он сохраняет промежуточные результаты вычислений в памяти, в стеке с расширением, а не в регистрах.
Zylin Corp. сделала ZPU открытым исходным кодом в 2008 году.
Многие электронные проекты включают электронную логику в FPGA. Также расточительно иметь микропроцессор, поэтому обычным делом является добавление ЦП к электронной логике в ПЛИС. Часто можно было бы использовать меньшую и менее дорогую ПЛИС, если бы только ЦП использовал меньше ресурсов. Это именно та ситуация, для решения которой был разработан ZPU.
ZPU разработан для решения различных задач системы, которые лучше всего решаются программным обеспечением, например, пользовательским интерфейсом. ZPU очень медленный, но его небольшой размер помогает разместить любой необходимый высокоскоростной алгоритм в FPGA.
Другая проблема заключается в том, что большинство процессоров для FPGA имеют закрытый исходный код и доступны только от конкретного производителя FPGA. Иногда проект должен иметь дизайн, который можно было бы широко распространить в целях проверки безопасности, использования в образовательных целях или по другим причинам. Лицензии на эти проприетарные процессоры могут предотвратить такое использование. ZPU имеет открытый код.
Некоторым проектам нужен код, который должен быть небольшим, но запускаться на ЦП, который по своей сути имеет более крупный код. В качестве альтернативы проекту может быть полезен широкий выбор кода, компиляторов и средств отладки для коллекции компиляторов GNU. В этих случаях может быть написан эмулятор для реализации набора инструкций ZPU на целевом процессоре, а компиляторы ZPU могут использоваться для создания кода. В результате система работает медленно, но упаковывает код в меньший объем памяти, чем многие процессоры, и позволяет проекту использовать широкий спектр компиляторов и кода.
ZPU был специально разработан для минимизации количество электронной логики. Он имеет минимальный набор инструкций, но может быть закодирован для коллекции компиляторов GNU. Это также минимизирует количество регистров, которые должны быть в ПЛИС, сводя к минимуму количество триггеров. Вместо регистров промежуточные результаты хранятся в стеке, в памяти.
Он также имеет небольшой код для экономии памяти. Инструкции стековой машины не обязательно должны содержать идентификаторы регистров, поэтому код ZPU меньше, чем у других процессоров RISC, и, как утверждается, ему требуется только около 80% пространства ARM Holdings Thumb2. Например, немедленное подписание помогает ZPU хранить 32-битное значение не более чем в 5 байтах пространства инструкций и всего в одном. Большинству процессоров RISC требуется не менее восьми байтов.
Наконец, около 2/3 его инструкций могут быть эмулированы микропрограммным обеспечением, реализованным с использованием остальных 1/3 «необходимых» инструкций. Хотя результат очень медленный, итоговый процессор может потребовать всего 446 справочных таблиц (мера сложности FPGA, примерно эквивалентная 1700 электронным логическим элементам).
ZPU имеет вектор сброса, состоящий из 32 байтов кодового пространства, начиная с нулевой позиции. Он также имеет одно прерывание, чувствительное к краям, с вектором, состоящим из 32 байтов кодового пространства, начиная с адреса 32. Каждый вектор со 2 по 63 имеет 32 байта пространства, но зарезервирован для кода, имитирующего инструкции с 33 по 63.
Базовый ZPU имеет 32-битный путь к данным. ZPU также имеет вариант с 16-битным трактом данных, чтобы сохранить еще больше логики.
ZPU имеет хорошо протестированный порт коллекции компиляторов GNU. Энтузиасты и инженеры по прошивке портировали ECos, FreeRTOS и μClinux. По крайней мере, одна группа энтузиастов скопировала популярную среду разработки Arduino и адаптировала ее к ZPU.
Сейчас существует несколько моделей ядра ZPU. Помимо оригинальных ядер Zylin, существуют также ядра ZPUino и ZPUFlex. Ядро Zylin разработано для минимального использования ПЛИС и включает 16-разрядную версию. ZPUino имеет практические улучшения в скорости, может заменять эмулируемые инструкции аппаратными средствами и встроен в структуру системы на кристалле. ZPUFlex разработан для использования блоков внешней памяти и может заменять эмулируемые инструкции аппаратными средствами.
Академические проекты включают исследования и улучшения энергоэффективности, а также исследования надежности.
Для повышения скорости большинство разработчиков внедрили эмулированные инструкции и добавили кэш стека. Помимо этого, один разработчик сказал, что двухстековая архитектура разрешит конвейерную обработку (т.е. повышение скорости до одной инструкции за такт), но это также может потребовать изменений в компиляторе.
Один разработчик снизил потребление энергии на 46% с помощью кеш стека и автоматическая вставка стробирования часов. Энергопотребление тогда было примерно эквивалентно небольшому ядру с открытым исходным кодом Amber, которое реализует архитектуру ARM v2a.
Частями ZPU, которым в наибольшей степени способствует отказоустойчивость, являются адресная шина, указатель стека и счетчик программ.
"TOS" - это сокращение от «Top Of Stack». «NOS» - это аббревиатура от «Next to the top Of Stack».
Имя | Двоичное | Описание |
---|---|---|
BREAKPOINT | 00000000 | Остановите ЦП и / или перейдите к отладчик. |
IM_x | 1xxxxxxx | Отправьте или добавьте подписанный 7-битный сразу к TOS. |
STORESP_x | 010xxxxx | Вставьте TOS и сохраните его в стеке со смещением сверху. |
LOADSP_x | 011xxxxx | Извлечь из значения, проиндексированного в стеке, и вставить его в TOS. |
EMULATE_x | 001xxxxx | Эмулировать инструкцию с кодом в векторе x. |
ADDSP_x | 0001xxxx | Извлечь из значения, проиндексированного в стеке, и добавить это значение в TOS. |
POPPC | 00000100 | Извлечь адрес из TOS и сохранить его на ПК. |
LOAD | 00001000 | Вставить адрес и передать загруженное значение памяти в TOS. |
СОХРАНИТЬ | 00001100 | Сохранение NOS в памяти, на которую указывает TOS. Поп оба. |
PUSHSP | 00000010 | Вставьте текущий SP в TOS. |
POPSP | 00001101 | Извлечь TOS и сохранить его в SP. |
ADD | 00000101 | Целочисленное сложение TOS и NOS. |
AND | 00000110 | Побитовое И для TOS и NOS. |
OR | 00000111 | Побитовое ИЛИ TOS и NOS. |
NOT | 00001001 | Побитовое НЕ из TOS. |
FLIP | 00001010 | Обратный порядок следования битов TOS. |
NOP | 00001011 | Нет операции. (Обычно используется для циклов задержки или таблиц кода.) |
Кодовые точки с 33 по 63 могут эмулироваться кодом в векторах от 2 до 32: LOADH и STOREH (16-битный доступ к памяти), LESSTHAN (набор сравнений 1 для истины, 0 для ложного), LESSTHANOREQUAL, ULESSTHAN, ULESSTHANOREQUAL, SWAP (TOS с NOS), MULT, LSHIFTRIGHT, ASHIFTLEFT, ASHIFTRIGHT, CALL, EQ, NEQ, NEG, SUB, XOR, LOADB и STOREB (8-битный доступ к памяти), DIV, MOD, EQBRANCH, NEQBRANCH, POPPCREL, CONFIG, PUSHPC, SYSCALL, PUSHSPADD, HALFMULT, CALLPCREL