Шапка

4.4 Архитектура NOVIX NC4016

4.4.1 Введение

NC4016 фирмы Novix, ранее известный как NC4000, - 16-разрядный стековый микропроцессор, разработанный для непосредственного выполнения примитивов языка FORTH. Это был первый однокристальный FORTH-компьютер. Некоторые из появившиеся именно в нём решений позднее были повторены во многих разработках. Основная область использования - управление в реальном масштабе времени и быстрое исполнение программ общего назначения на языке FORTH.

NC4016 использует для стеков данных и возврата отдельные внешние микросхемы памяти. Из-за того, что два стека и шина памяти подключены тремя группами выводов, NC4016 может исполнять большинство инструкций за один такт.

4.4.2 Блок-схема

Блок-схема NC4016 показана на рис. 4.6 .

Рис. 4.6 Блок-схема NC4016

Секция ALU содержит буфер для двух верхних элементов стека данных: ( TOP для верхнего и NEXT для следующего ). Кроме того, в него входит специальный регистр MD для поддержки операций умножения и деления и регистр SR для быстрого целочисленного вычисления квадратного корня. АЛУ может выполнять операции над регистром TOP и одним из NEXT , MD или SR .

Стек данных на 256 элементов состоит из внутреннего указателя стека, который вырабатывает адрес, и внешней микросхемы памяти. Отдельная 16-разрядная шина позволяет обращаться к стеку данных одновременно с выполнением других операций. Как уже отмечалось, два верхних элемента стека буферируются в регистрах T и N в АЛУ.

Стек возврата находится в отдельной микросхеме памяти и очень похож на стек данных за исключением того, что в регистре INDEX буферируется только один верхний элемент. FORTH сохраняет счётчик циклов в стеке возврата, поэтому для эффективной поддержки циклов со счётчиком регистр INDEX может уменьшаться.

Внутри кристалла защиты от переполнения и антипереполнения стеков нет. В многозадачной среде через порт ввода-вывода можно подключить внешнюю схему управления памятью, чтобы предоставить каждой задаче отдельную страницу, уже не ограниченную 256 элементами. Это позволяет защититься на аппаратном уровне от перезаписи стека другой задачи и уменьшает накладные расходы на переключение контекста.

Счётчик программы ( Program Counter ) указывает на инструкцию, которая будет считываться в следующем цикле. Он автоматически изменяется инструкциями перехода, цикла или вызова подпрограмм. Системная память 16-разрядная. Побайтная адресация не поддерживается.

К отдельным выводам NC4016 подходят две шины ввода-вывода: порт «B» шириной 16 бит и порт «X» шириной 5 бит. Порты позволяют получить прямой доступ к устройствам ввода-вывода и решать задачи управления, не затрагивая шину памяти. Некоторые биты портов можно использовать в качестве старших разрядов адреса для расширения адресного пространства.

Для увеличения производительности NC4016 может использовать 4 независимых 16-разрядных шины ( программной памяти, стека данных, стека возврата и ввода-вывода ) для передачи данных в каждом такте.

4.4.3 Обзор системы команд

NC4016 положил начало использованию декодированного формата инструкций в стековых машинах. Команды процессора разбиты на независимые битовые поля, которые подобно горизонтальному микрокоду одновременно управляют различными частями процессора. NC4016 и его преемники среди FORTH-машин являются единственными 16-разрядными компьютерами, использующими такую технику. Декодированный формат упрощает аппаратный разбор инструкций.

На рис. 4.7a показан формат вызова подпрограмм. Старший бит установлен в «0», а в остальные хранят 15-разрядный адрес подпрограммы, то есть адрес ограничивается младшими 32K слов памяти.

Рис. 4.7a Формат инструкций NC4016 -- вызов подпрограмм

Формат инструкции перехода по условию показан на рис. 4.7b . Бит_12 и бит_13 выбирают переход по равенству T нулю, безусловный переход или при организации циклов декремента и перехода по равенству нулю регистра INDEX . Биты 0..11 содержат младшие 12 разрядов адреса назначения, ограничивая зону перехода блоком в 4K слов, содержащим саму инструкцию.

Рис. 4.7b Формат инструкций NC4016 -- условный переход

Рис. 4.7c раскрывает формат вычислительных операций, в котором есть несколько полей, отвечающих за различные ресурсы процессора. Бит_0 и бит_1 управляют работой сдвигового регистра на выходе АЛУ. Бит_2 определяет шаг операции деления без восстановления остатка. Бит_3 разрешает сдвигать T и N как один 32-разрядный регистр.

Рис. 4.7c Формат инструкций NC4016 -- операции АЛУ

Бит_5 активирует операцию возврата из подпрограммы. Это позволяет выполнять возврат вместе с предшествующей арифметической операцией, получая его во многих случаях «бесплатно».

Бит_6 указывает на необходимость сохранения элемента в стеке. Вместе с битом_4 управляет операциями сохранения и удаления.

Бит_7 и бит_8 отвечают за выбор источника для АЛУ и позволяют выполнить шаг операции последовательного умножения или взятия корня. Биты 9..11 определяют выполняемое АЛУ действие.

Формат инструкции обращения к памяти показан на рис. 4.7d . На выполнение требуется два такта: один на выборку инструкции и один на чтение или запись операнда. Адрес памяти всегда берётся из регистра T . Бит_12 указывает тип операции: чтение или запись. Биты 0..4 определяют небольшую константу, которая может быть добавлена или отнята от значения T для выполнения автоинкремента или автодекремента адреса. Биты 5..11 идентичны по своему действию аналогичным битам из предыдущей инструкции работы с АЛУ.

Рис. 4.7d Формат инструкций NC4016 -- обращение к памяти

Рис. 4.7e представляет вспомогательную инструкцию. Она экономит время при работе с памятью за счёт обращения к «пространству пользователя», занимающему первые 32 слова адресного пространства. При этом загрузка в стек адреса элемента перед обращением не проводится [* смещение от начала блока задаётся константой в самой инструкции] . Кроме того, она может использоваться для обмена значениями между регистрами и сохранения в стеке 5-битной константы ( за один такт ) или 16-битной ( за два такта ). Биты 5..11 выполняют те же действия, что и аналогичные биты в инструкции работы с АЛУ.

Рис. 4.7e Формат инструкций NC4016 -- обращение к области пользователя, обмен между регистрами, операции с константами

NC4016 специально проектировался для выполнения программ на языке FORTH. Декодированный формат позволяет совмещать в одной инструкции цепочку слов языка. Последовательности операций и отдельные слова FORTH, поддерживаемые NC4016, перечислены в табл. 4.2a , 4.2b , 4.2c .

4.4.4 Возможности архитектуры

Все примитивные операции в NC4016, кроме выборки из памяти, сохранения в памяти и выборки длинной константы исполняются за один такт. Это требует много больше связей внутри кристалла, чем есть в «Классической Стековой Машине», но сильно увеличивает производительность.

NC4016 позволяет комбинировать не конфликтующие между собой последовательные операции в одной инструкции. Например, значение переменной может быть выбрано из памяти и добавлено к элементу на вершине стека с помощью последовательности «@ +» на языке FORTH. Эти операции могут быть упакованы в одной инструкции NC4016.

Подобным же образом, с помощью бита_5 «subroutine return» можно комбинировать возврат из подпрограммы с другими операциями. В результате большинству подпрограмм выход «достаётся даром». Кроме того, компилятор для NC4016 выполняет оптимизацию хвостовой рекурсии. Удаление хвостовой рекурсии предполагает замену пары инструкций «subroutine exit»/«subroutine call» на безусловный переход к вызываемой подпрограмме.

Ещё одним нововведением NC4016 является механизм доступа к первым 32 адресам основной памяти, как к глобальным пользовательским переменным. Это облегчает реализацию компиляторов для языков высокого уровня, позволяя хранить в легкодоступных переменных ключевую информацию, подобную указателям на вспомогательный стек в основной памяти. Кроме того, с помощью 32 быстрых переменных можно эмулировать набор регистров и достигать разумной производительности при использовании компиляторов, изначально предназначавшихся для регистровых машин.

4.4.5 Реализация и область применения

NC4016 построен по 3µm HCMOS технологии, использует менее 4000 вентилей, работает с тактовой частотой до 8 MHz и упакован в 121 выводной корпус PGA.

На момент разработки NC4016 выбранная технология не позволяла разместить стековую память на одном кристалле с процессором. Вследствие этого, минимальная система требует трёх микросхем 16-разрядной памяти: одной для программы и данных, одной для стека данных и одной для стека возврата.

Большую часть команд, включая условные переходы и вызовы подпрограмм, NC4016 исполняет за один такт. При такой схеме время между началом такта и готовностью микросхемы памяти к выборке инструкции приобретает первостепенное значение. Оно приблизительно равно половине цикла тактирования, то есть скорость обращения к памяти должна быть в два раза выше тактовой частоты процессора.

NC4016 изначально проектировался как концептуальный прототип. По этой причине у него есть несколько недостатков, для нейтрализации которых требуются большие программные и аппаратные накладные расходы. Например, предполагалось, что NC4016 будет обрабатывать прерывания, но он некорректно на них реагирует из-за конструктивной ошибки. Novix выпустил заметку по применению, показывающую способ обхода проблемы с помощью 20-выводной микросхемы PAL. Следующие редакции кристалла исправят эти недостатки.

NC4016 нацелен на рынок встраиваемых систем. Он показывает очень высокую производительность при скромных размерах системы. Среди возможных применений управление лазерными печатающими устройствами, управление графическими дисплеями, системы связи ( T1 маршрутизаторы, факсы и т.п. ), сетевые контроллеры и системы оптического распознавания символов.

Информация для этого раздела взята из Golden et al. ( 1985 ), Miller ( 1987 ), Stephens & Watson ( 1985 ) и «Novix's Programmers' Introduction to the NC4016 Microprocessor» ( Novix 1985 ).

Табл. 4.2(a) Система команд NC4016 - Примитивы FORTH ( см. Приложение _B  , табл. B.1 )

: 0< @ LIT SWAP
; 0BRANCH AND NOP XOR
! 1+ BRANCH OR
+ 1- DROP OVER
- 2* DUP R>
0 >R I R@

Табл. 4.2(b) Система команд NC4016 -- Составные примитивы FORTH

nn nn AND lit - DROP DUP DUP @ SWAP nn -
nn ! nn I@ lit -c DUP nn ! OVER +
nn + nn I@ + lit AND DUP nn ! + OVER +c
nn +c nn I@ - lit OR DUP nn ! - OVER -
nn - nn I@ AND lit SWAP - DUP nn ! AND OVER -c
nn -c nn I@ OR lit SWAP -c DUP nn ! OR OVER SWAP -
nn @ nn I@ SWAP - lit XOR DUP nn ! SWAP - OVER SWAP -c
nn @ + nn I@ XOR @ + DUP nn ! XOR R> DROP
nn @ +c nn I@! @ +c DUP nn I! R> SWAP >R
nn @ - nn I! @ - DUP nn I! + SWAP -
nn @ -c nn OR @ -c DUP nn I! - SWAP -c
nn @ AND nn SWAP - @ SWAP - DUP nn I! AND SWAP DROP
nn @ SWAP - nn SWAP -c @ SWAP -c DUP nn I! OR SWAP OVER !
nn @ SWAP -c nn XOR @ OR DUP nn I! SWAP - SWAP OVER ! nn+
nn @ OR lit + @ XOR DUP nn I! XOR SWAP OVER ! nn -
nn @ XOR lit +c @ AND DUP @ SWAP nn+

Обозначения:

nn
5-разрядная константа или смещение
lit
16-разрядное число, лежащее в памяти сразу после инструкции

Табл. 4.2(c) Система команд NC4016 -- Слова специального назначения

 
Стек данных
Стек возврата
 
Команда
на входе
 
на выходе
на входе
 
на выходе
Функция
ффффф
фффф.
 
ффффф.
фффф.
 
ффффф.
фффффффф
nn I@ N Выбрать значение из регистра «nn» ( 5-разрядный номер регистра включён в виде константы в инструкцию )
nn I! N Сохранить N в регистре «nn» ( 5-разрядный номер регистра включён в виде константы в инструкцию )
+c N1 N2 N3 Сложение с переносом ( с использованием внутреннего бита переноса )
-c N1 N2 N3 Вычитание с заёмом ( с использованием внутреннего бита переноса )
*' D1 D2 Шаг беззнакового умножения ( берёт два 16-разрядных числа и получает 32-разрядный результат )
*- D1 D2 Шаг знакового умножения ( берёт два 16-разрядных числа и получает 32-разрядный результат )
*F D1 D2 Шаг умножения дробей ( берёт две 16-разрядных дроби и получает 32-разрядное произведение )
*/' D1 D2 Шаг деления ( берёт 16-разрядные делимое и делитель и получает 16-разрядные частное и остаток )
*/'' D1 D2 Последний шаг деления ( обработка переноса для деления с восстановлением остатка )
2/ N1 N2 Арифметический сдвиг вправо ( эквивалентен делению на два для неотрицательных чисел )
D2/ D1 D2 32-разрядный сдвиг вправо ( эквивалентен делению на два для неотрицательных чисел )
S' D1 D2 Шаг операции взятия квадратного корня
TIMES N1 N2 Цикл с обратным отсчётом, использующий в качестве счётчика значение на вершине стека возврата

Previous part:

Next part: