- Категория: Forth
- Опубликовано 09 Июнь 2012
- Просмотров: 13470
KF 332 – новая реализация конфигурируемого процессорного ядра
Продолжение работ, проводимых в области разработки систем на кристалле и конфигурируемых процессорных ядер (софт-процессоров) привело к накоплению технических решений, которые в конечном итоге позволили несколько пересмотреть подходы к проектированию. Кроме того, этому же способствуют произошедшие в последние годы существенные изменения в области архитектур ПЛИС FPGA основных мировых производителей. Из основных факторов можно назвать более четко выразившееся расслоение на high-end и low-end серии FPGA, существенное удешевление последних, и увеличение удельного веса выделенных аппаратных ресурсов: блоков DSP и блочной памяти с быстрым синхронным интерфейсом. Кроме того, существующие ПЛИС нижнего и среднего ценового диапазонов предоставляют в распоряжение разработчика несколько тысяч логических ячеек. Это позволяет обеспечивать для процессора достаточную функциональность, развитую систему команд и накристальную память программ (в ряде случаев – и данных). В то же время перенос основных алгоритмов работы системы на процессорное ядро может снизить требования к аппаратному составу периферийных устройств и выполнить их на том же кристалле.
Для реализации в ПЛИС Xilinx семейств Spartan-3 и Virtex-II/II Pro/4 было переработано ядро стекового процессора KF216, который применялся в ряде разработок на базе ПЛИС предыдущего поколения: Spartan-II и Spartan-IIE. При переходе к новым семействам в архитектуре ПЛИС произошли следующие изменения:
– вместо блоков памяти объемом 4096 бит новые ПЛИС получили блоки объемом 18кбит (в том числе с организацией 1кx18);
– в составе ПЛИС появились выделенные блоки умножения;
– улучшена организация глобальных тактовых сетей, что сделало весьма привлекательной реализацию проектов в стиле «чистого» конечного автомата (в отличие от «смешанного» стиля проектирования, комбинирующего управление синхронными и асинхронными сигналами);
– больший объем ПЛИС начального уровня позволил использовать в качестве регистровых устройств триггеры логических ячеек при сохранении приемлемого уровня заполнения кристалла (предыдущие семейства ввиду меньшего объема делали выгодным использование для этой цели распределенной памяти логических ячеек, что несколько усложняло описание).
Характеристики процессорного ядра
- Организация регистров – раздельные стеки данных и возвратов.
- Архитектура памяти – раздельный доступ к коду и данным (гарвардская архитектура)
- Исполнительное устройство – двухтактный цикл работы (50 MIPS при тактовой частоте 100 МГц)
- Разрядность данных – 32 (масштабируется)
- Глубина стека данных – 8 (регулируется константой в HDL-описании без необходимости коррекции общей архитектуры)
- Глубина стека возвратов – 8 (регулируется константой в HDL-описании без необходимости коррекции общей архитектуры)
- Разрядность кода – 18 (ориентировано на блочную память FPGA)
- Объем адресуемой памяти программ – до 16 кслов (масштабируется)
- Объем адресуемой памяти данных – до 4 Гслов x32
- Пространство ввода-вывода – до 4 Гслов x32.
- Тактовая частота – в зависимости от семейства ПЛИС и наличия дополнительных устройств на кристалле
- Virtex-II Pro-6: ~100 МГц (предварительная оценка средствами САПР; без оптимизации)
- Virtex-4-12: 142 МГц
- Virtex-4-10: 107 МГц
- Spartan-3-4: 64 МГц
- Объем (8/8 уровней стека) – около 1850 логических ячеек
- Дополнительно:
- Система прерываний – произвольное количество источников со срабатыванием по фронту тактового сигнала. Приоритет настраивается коррекцией HDL-описания.
- Аппаратная поддержка циклов – аппаратно реализованы регистры текущего и конечного значения счетчика, регистр адреса начала цикла, условный переход к началу с автоинкрементом счетчика, прозрачная одноцикловая поддержка системой команд. Максимальная глубина стека циклов настраивается в HDL-описании.
- Система команд – 38 кодов операций аппаратной стековой машины. Прямое исполнение базовых команд языка Форт, исполнение процедурных языков (Си и ему подобные) – при наличии компилятора переднего плана (front-end)
- Аппаратный контроль исключительных ситуаций – 6 векторов перехода по фиксированным адресам в случае исчерпания/переполнения стеков (данных, возврата, циклов); аппаратный сброс
- Аппаратная поддержка управления многопоточными устройствами DSP
- Аппаратная поддержка LCD (ks066), RS232, USB (FT245, 232) с параметризуемыми генераторами описаний на VHDL
- Программирование и отладка
- Транслятор языка Форт
- Аппаратный контроллер для загрузки программы: RS-232 или USB
- Среда проектирования: графическая оболочка редактирования, кросс-компиляции, загрузки программы и отладки с использованием одного из аппаратных интерфейсов (Windows 9x/2000/NT/XP)
Реализованная стековая архитектура является достаточно удобной как с точки зрения реализации в ПЛИС, так и с точки зрения исполнения распространенных алгоритмов. Стековая машина в своем явном виде используется в языке программирования Форт, поэтому команды этого языка имеют прямое представление в системе команд процессора. Что касается распространенных языков программирования высокого уровня, то одним из промежуточных представлений для их программ также являются стековые операции. Раздельные стеки данных и возвратов способствуют уменьшению т.н. «оверхеда» – дополнительных действий, требующихся процессору, чтобы организовать передачу параметров между отдельными модулями программы.
Интерфейс модуля процессора
Непосредственно процессорный модуль (ядро) реализован в единственном исходном файле на языке VHDL.
Для образования процессорной системы на кристалле (SoC) требуются блоки памяти команд и данных (создаваемые, например, приложением Core Generator в САПР ISE), подключаемые в соответствии с описанием сигналов. Организация памяти команд: x18, организация памяти данных x32.
Назначение сигналов.
Имя |
Напр |
Описание |
clk |
I |
Тактовый сигнал процессора. |
reset |
I |
Вход сброса. Высокий активны уровень. Асинхронный сигнал. |
cmd |
I |
Вход команды (18 бит). Предназначен для подключению к выходу блочной памяти FPGA. |
dio |
I |
Вход данных устройства ввода-вывода (32 бита). Внешний контроллер устройств ввода-вывода должен обеспечить установление правильных уровней на этой шине, анализируя состояние шины addr. |
dmem |
I |
Вход данных памяти (32 бита). Внешний контроллер памяти данных должен обеспечить установление правильных уровней на этой шине, анализируя состояние шины addr. Может быть использован совместно с блочной памятью. |
dwr |
O |
Выход с активным высоким уровнем, сигнализирующий о том, что по следующему фронту тактового сигнала будет выполнена запись в память данных. |
iowr |
O |
Выход с активным высоким уровнем, сигнализирующий о том, что по следующему фронту тактового сигнала будет выполнена запись в устройство ввода-вывода. |
addr |
O |
Выход адреса (32 бита) для адресации памяти данных и устройств ввода-вывода. Копия верхней ячейки стека данных. |
data |
O |
Выход данных (32 бита) для записи в память данных и устройства ввода-вывода. Копия второй сверху ячейки стека данных. |
ip |
O |
Выход счетчика команд. Предназначен для подключения к адресному входу блочной памяти. Текущая реализация поддерживает 16 кслов программы (14 бит адреса). |
Система команд
Система команд приведена в следующей таблице. Левый крайний столбец определяет старший полубайт самого младшего байта команды, а верхняя строка – младший полубайт. Остальные биты команды равны нулю. (Т.е. команда OVER имеет код 16H).
H\L |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
A |
0 |
NOP |
|
|
|
|
|
|
|
|
|
|
1 |
I |
R> |
TEMP> |
DEPTH |
RDEPTH |
DUP |
OVER |
|
|
|
|
2 |
RET |
|
|
|
|
|
|
|
|
|
|
3 |
@ |
[C]@ |
NOT |
|
|
|
|
SHL |
SHR |
SHRA |
INPORT |
4 |
EXEC |
>R |
DROP |
|
|
|
|
|
|
|
|
5 |
NIP |
+ |
– |
AND |
OR |
XOR |
= |
> |
< |
|
|
6 |
LOOP |
|
|
|
|
|
|
|
|
|
|
7 |
! |
[C]! |
DO |
|
|
|
|
|
|
|
OUTPORT |
|
Команды реализуются при наличии аппаратного доступа к памяти команд со стороны ядра |
|
Команды реализуются при наличии аппаратного стека циклов |
Команда TEMP>, не входящая в перечень широко известных команд стековой машины, служит для реализации Форт-слова SWAP (обмен верхних ячеек стека). При выполнении команды NIP второе сверху число не просто удаляется, а переносится во временный регистр TEMP. Таким образом, последовательность команд NIP TEMP> эквивалентна команде SWAP. Данное решение введено для совместимости с процессором KF216, стек данных в котором был реализован на базе распределенной памяти логических ячеек. Такое решение позволяло сэкономить ресурсы (в объеме, который с появлением более емких ПЛИС новых семейств перестал быть актуален), однако ограничивало возможности стека данных записью в него одного числа за цикл работы. Поскольку команда SWAP переписывает одновременно два числа, она была разбита на упомянутую последовательность команд, каждая из которых модифицирует только одну ячейку стека.
Команды перехода и загрузки констант приведены в следующей таблице.
Биты |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
LITL |
0 |
1 |
Младшее слово загружаемой константы |
|||||||||||||||
LITH |
1 |
0 |
Старшее слово загружаемой константы |
|||||||||||||||
LIT0 |
1 |
1 |
Младшее слово загружаемой константы, знакорасширяемой до 32 бит |
|||||||||||||||
JMP |
0 |
0 |
0 |
1 |
Адрес безусловного перехода |
|||||||||||||
IF |
0 |
0 |
1 |
0 |
Адрес перехода, если верхнее число на стеке равно 0 |
|||||||||||||
CALL |
0 |
0 |
1 |
1 |
Адрес вызываемой подпрограммы |
Поскольку разрядность кода меньше разрядности данных, 32-битная константа загружается за 2 машинных цикла. Команда LITH не вызывает загрузку числа на стек, а задает его старшее слово в специальном служебном регистре, который непосредственно не доступен. Последующий вызов LITL сформирует загружаемое 32-битное число из старшей части, хранящейся в служебном регистре, и младшей части, содержащейся в битах 15-0 выполняющейся команды LITL. После загрузки старшей части константы можно выполнять LITL произвольное количество раз.
Для загрузки коротких констант, представляемых 16 битами, служит команда LIT0. Она игнорирует содержимое служебного регистра, загружаемого по LITH, и знакорасширяет число, представленное в битах 15-0, до 32 разрядов (иными словами, биты 31-16 являются копией 15-го бита загружаемого числа, так что -1 представляется 32 единичными битами, как это требует дополнительное двоичное представление чисел).
Две команды, начинающиеся с префикса [C], соответствуют операциям чтения и записи памяти команд. Эти команды присутствуют и поддерживаются только в том случае, если архитектура системы подразумевает наличие компилятора, для работы которого действительно требуется доступ к памяти команд по крайней мере на запись. Как правило, для этого используется второй порт блочной памяти, что дает возможность считывать поток команд из ее первого порта. Однако в процессе разработки с использованием IDE под управлением Windows чаще удобнее производить программирование «в системе», без перезагрузки прибора или выключения питания. Для этого существуют HDL-модули, обеспечивающие доступ к памяти команд через интерфейсы RS-232 или USB (с использованием микросхем FT245 или FT232). Поскольку память команд становится возможным загружать и просматривать непосредственно из оболочки, а компиляция «на лету» требуется не во всех системах, второй порт памяти кода не подключен к процессорному ядру, а используется исключительно для связи с управляющей ЭВМ.
В качестве заключения
Приведенная информация демонстрирует подходы к построению конфигурируемых систем на кристалле и основное назначение данного материала не состоит в привлечении инвесторов, заказчиков или соисполнителей (тем не менее варианты сотрудничества могут быть рассмотрены). В настоящее время основные усилия концентрируются в направлении создания методических материалов по разработке процессоров с использованием языков описания аппаратуры (HDL) для их последующей реализации на базе ПЛИС, и в перспективе – на базе ASIC. Проектирование и использование процессоров подобного класса не должно рассматриваться в среде разработчиков как исключительное явление, а стать одним из вариантов, подлежащих рассмотрению наряду с прочими техническими решениями.