Многоядерные процессоры с низким энергопотреблением
Система команд. Система команд С18 состоит из 32 базовых инструкций, составляющих язык VentureForth. VentureForth имеет все достоинства языка Форт: экономичность, простота и расширяемость. IntellaSys расширяет возможности VentuerForth добавлением поддержки Forthlet – объектов, которые могут распространяться между ядрами. Список команд с их кратким описанием представлен в таблице 3.
Инструкции имеют длину всего лишь 5 бит, что позволяет упаковывать три или четыре инструкции в одно 18-битное слово. 18-ти битное слово содержит до 4х опкодов (рисунок 4.10), выбираемых слот-селектором и передается на декодер и логику контроля, управляющей функциями ядра. Восемь из 5-ти битовых инструкций могут быть помещены в 3-х битный слот, как последний код операции в слове (3 полных 5-ти битных слота, плюс 3-битный остаток). Таким образом, максимально в оперативной памяти С18 можно разместить 256 команд, что с учетом высокой реентерабельности форт-кода достаточно для реализации многих алгоритмов и прикладных программ.
Типичная последовательность выполнения кода начинается со значения загруженного в программный счетчик и выставленного на шину адреса. Это значение используется двумя способами - выбирает адрес в памяти (в некоторых случаях - порты ввода-вывода) и управляет "инкрементером", который записывает увеличенное значение обратно в счетчик. Выбранное значение подается на шину данных, значение шины фиксируется в регистре IW. Значение в первом слоте подается на блок логики контроля и декодирования, который управляет работой элементов ядра. Также блок имеет логику "предсказания" - если обнаруживается, что ни один из опкодов не использует шину адреса, разрешается выдача значения PC на шину адреса для предварительной выборки следующей команды.
Загрузка литералов (констант/чисел), вызовы, переходы, обращения к памяти и портам требуют операнды. Команда перехода или вызова может иметь 3, 8 или 9-ти битный аргумент. Инструкции-литералы используют 5-битный опкод и 18-битное слово - литерал, который будет помещен на стек.
Некоторые ядра, находящиеся по краям решетки имеют дополнительные устройства в виде параллельных или последовательных портов, аналого-цифрового преобразователя (АЦП), цифроаналогового преобразователя (ЦАП), и, соответственно имеют определенное количество внешних выводов.
Параллельные порты доступны для чтения/записи либо как коммуникационные порты ядра (как правило UP порт), при этом операции с ними являются блокирующими или при помощи специальных регистров DATA, ADDRESS, в этом случае блокировок не происходит. Параллельные порты могут быть использованы, как для подключения внешней памяти, так и как порты ввода-вывода общего назначения. Подключение внешней памяти будет иметь свою специфику для каждого из процессоров семейства - в SEAforth24 параллельные порты принадлежат одному ядру, в SEAforth40 - двум, и третий управляет контролирующими линиями. Время доступа к параллельным портам менее 5нс.
По умолчанию, ядра имеющие два вывода, считаются ядрами с последовательными портами, поскольку имеется возможность организовать полнодуплексный режим работы. Ядра с одним выводом относят к портам общего назначения. Ядра с синхронными и асинхронными последовательными портами отличаются только поддерживающими кодами программ в ПЗУ, никаких реальных отличий в устройстве ядер нет.
Асинхронные порты функционируют как универсальные асинхронные приемо-передатчики (UART), и служат для подключения внешних устройств или других процессоров SEAforth. Код в ПЗУ позволяет загружать устройство через асинхронный порт, и позволяет ядру выходить из режима покоя при поступлении стартового бита. Отличия ядер с синхронными интерфейсами в том, что они используют отдельную линию как сигнал синхронизации.
SPI порты реализуются четырьмя линиями ввода-вывода и также имеют программную поддержку в ПЗУ. Код в ПЗУ предусматривает возможность загрузки исполнимого кода из последовательной флэш памяти - высокий уровень на линии spi-in начинает процесс загрузки. В процессе загрузки SPI работает на скорости 150 кбит/с, позволяя использовать относительно дешевые устройства памяти. По окончании загрузки интерфейс может функционировать со скоростью порядка 10 Мбит/с.
Ядра с одиночным выводом могут использовать его как входной либо как выходной однобитовый порт. Данный порт доступен и конфигурируется через регистр IOCS. Время перехода вывода из состояния с высоким импедансом в активное составляет порядка 110-115нс.
АЦП, имеющиеся на некоторых ядрах представляют собой генераторы, управляемые напряжением (ГУН), связанные с 18 разрядными счетчиками. Аналого-цифровое преобразование осуществляется посредством двух последовательных процедур чтения DATA регистра и вычислении скорости работы генератора. Время полного счета для входного напряжения 400мВ - 40 мкс, для 1500мВ - 75 мкс. Выделенными битами в регистре IOCS ядра счетчик может быть запущен или остановлен, на ГУН подано напряжение с внешнего вывода, или напряжения ноля или питания для калибровки. Характеристика напряжение-код ( Vin - ADCcount ) АЦП является нелинейной. Зависимость Vin(ADCcount) можно с некоторой точностью рассматривать как кубическую вида:
Vin(ADCcount)=a0 * (ADCcount -a1)3+a2
При работе АЦП потребляет не более 4,5 мВт. Время, затрачиваемое на чтение данных из АЦП примерно 5-5,1нс.
ЦАП реализован, как набор двоично-взвешенных источников тока и рассчитан на номинальную нагрузку 75Ом при токе 17 мА. Программно доступен через регистр IOCS.
SERDES - специализированные параллельно-последовательные регистры, предназначенные для осуществления коммуникаций между процессорами. Могут передавать 18-разрядные слова (которые в свою очередь могут быть, как данными, так и инструкциями), могут служить генераторами функций. Имеют две двунаправленные линии - данных и тактовую. Направление устанавливается в регистре IOCS ядра, данные записываются по адресу DATA, для контроля прихода/отправки слова используется адрес UP. Тактирование осуществляется от специального осциллятора. Передача идет на скорости порядка 400Мбит/с, на передачу одного слова требуется 19 тактов.
Процессоры SEAforth являются достаточно мощным решением для встраиваемых систем реального времени за счет высокой скорости исполнения команд и высокой степени параллелизма, недоступной многим другим процессорам. Неоспоримым плюсом является низкое энергопотребление, особенно в пересчете на количество операций в секунду. Система команд доведена до определенного минимума, по функциональности и удобству ее можно сравнивать с системой RISC-контроллеров, таких как PIC16xx, z86, z89. Набор периферийных устройств, по сравнению с современными контроллерами, несомненно, мал и сводится в основном к устройствам передачи данных и преобразователям сигнала. Упор сделан на программную эмуляцию необходимой периферии.
Проведем сравнение процессоров SEAforth с наиболее распространенными целочисленными контроллерами различных архитектур [8-14] (Таблица 4.4).
** программная реализация умножения
Как видно из таблицы 4.4, процессоры SEAforth выигрывают по показателям энергоэффективности в активном режиме, производительности по отдельным ядрам и суммарной производительности. Также большим преимуществом является очень малое время реакции на событие, высокая скорость выдачи данных на внешние выводы — до 90 МГц. Наиболее близки по этим показателям процессорные ядра AVR32 и ARM Cortex-M3 [8-14]. Процессор проигрывает в операциях типа умножение, умножение с накоплением, деление, поскольку они в нем реализованы программными средствами. Также может несколько снизить производительность ограниченный набор команд и необходимость динамической замены кода во время работы приложений. К недостаткам также можно отнести малый размер памяти, небольшой набор периферийных устройств, необходимость подключения внешней памяти для хранения пользовательских программ.
Программное обеспечение включает в себя компилятор-симулятор языка VentureForth, имеющий версии под операционные системы Windows, Mac OS и Linux. Симулятор позволяет производить отладку программ, отслеживать состояние регистров и памяти любого из ядер процессора [5-7]. При отладке программ одновременно отображается состояние всех ядер процессора (отображаются основные регистры ядра), выделяются ядра, находящиеся в активном состоянии.