С. Хуторной
Система Excalibur - средство разработки SoC-решений фирмы ALTERA. Часть 2. Процессор Nios
Мы продолжаем цикл статей посвященных пакету Excalibur фирмы Altera. В статье рассмотренны характеристики встраиваемого конфигурируемого процессора Nios.В следующих нормерах будут рассмотрены средства разработки аппаратного и программного обеспечения на базе системы Quartus и копмилятора Gnupro.
Процесс проектирования в системе Excalibur начинается с выбора основного элемента проектируемой системы - процессора. Во избежание путаницы, следует предварительно определиться в понятиях. Excalibur - средство разработки систем на кристалле. Понятие "система" в этом случае объединяет все имеющиеся в наличии цифровые устройства и подсистемы, объединённые в один кристалл ПЛИС. Процессор в такой системе является одной из подсистем, которая состоит из процессорного ядра (core) и окружающей его периферии (таймер, универсальный асинхронный приёмопередатчик, различного рода порты ввода/вывода, встроенная память). В то же время, на плате, в которую встраивается ПЛИС, могут размещаться различные устройства, не попавшие, по той или иной причине, в кристалл, - это может быть дополнительная память, преобразователь уровней для последовательного порта и т.п. В дальнейшем описании они будут именоваться внешними устройствами - внешними по отношению к кристаллу ПЛИС.
Для построения процессора используется САПР Quartus. Поэтому далее, параллельно с описанием процессора, по мере необходимости, будут рассматриваться некоторые особенности создания и верификации проекта в системе Quartus. Создание проекта начинается с ряда предварительных действий: определения директории проекта, имени проекта и логического объекта верхнего уровня при помощи мастера создания проектов New Project Wizard [1]. Любой проект, создаваемый в САПР Quartus, впрочем, как и в любом другом САПР, имеет иерархическую структуру. Как правило, логический элемент верхнего уровня, если он один, имеет название самого проекта. New Project Wizard состоит из трёх страниц - трёх этапов подготовки. На первом этапе (page, в терминологии Altera) выбирается папка проекта (по умолчанию, создаваемые проекты размещаются в папке qdesigns…), его имя и имя логического объекта верхнего уровня. Далее производится подключение всех необходимых пользовательских библиотек. После того, как пройден предварительный этап, начинается процедура непосредственно проектирования. Непосредственно ввод проекта может производиться различными средствами: при помощи схемотехнического редактора (Block Diagram/Schematic), текстового редактора (на языках описания аппаратуры - AHDL, VHDL, Verilog HDL). Допустим, все предварительные мероприятия, связанные с созданием проекта, проведены: создана папка "my_sys", выбрано имя проекта и имя логического объекта верхнего уровня, создан Block Diagram/Schematic File с тем же именем. С этого момента начинается проектирование процессора.
Как и в предыдущих версиях САПР фирмы Altera, таких как MAX+plus II, в пакете Quartus присутствует мощное средство, помогающее в создании или модификации того или иного цифрового блока на основе библиотеки мегафункций - MegaWizard Plug-in Manager. Процессор Nios - одна из встроенных мегафункций. На рис. 1 показано начало процесса создания любого элемента при помощи MegaWizard Plug-in Manager.
Рисунок 1. Окно MegaWizard Plug-in Manager
В окне Available Megafunctions (доступные мегафункции) выбираем пункт Altera Excalibur NiosTM. Создаваемый процессор назовем "my_nios". Собственно с этого момента начинается конфигурация процессора как подсистемы, состоящая из пяти этапов (рис. 2).
Рисунок 2. Этапы (page) создания и конфигурации процессорной подсистемы проекта
Рисунок 3. Первый этап (page) создания и конфигурации ядра процессорной подсистемы проекта
На первой странице настройки Mega-Wizard Plug-in Manager предложит создать ядро процессора "my_nios_cpu". При этом конфигурация самого ядра процессора состоит из пяти этапов (рис. 2, 3).
По ходу создания и настройки процессора необходимо ответить на ряд вопросов, связанных с его структурой [2]. Первый - разрядность процессора. Altera Excalibur Nios мегафункция позволяет создавать 16- и 32-разрядные процессоры. Соответственно, 16-разрядный процессор занимает меньше аппаратных ресурсов ПЛИС и является более быстрым. В табл. 1 приведены данные по ограничению адресуемой памяти и используемым аппаратным средствам для 16- и 32-разрядных процессоров.
Таблица 1. Ограничение для 16- и 32-разрядных процессоров Nios
Разрядность шины данных |
Число используемых логических элементов |
Диапазон адресов |
16-бит |
1100 |
128 Кбайт |
32-бит |
1700 |
4 Гбайт |
Предположим, что нам необходим 32-разрядный процессор (Page 1 of 5). Далее, на втором этапе конфигурации ядра (Page 2 of 5) предлагается выбрать разрядность шины адреса процессора. Этот параметр зависит от модели памяти процессора. Исполняемый код программы должен постоянно храниться в памяти, которая может находиться как вне кристалла ПЛИС, так и внутри его. В структуре кристалла ПЛИС имеются встроенные блоки ESB. Доступная ёмкость этих блоков невелика, поэтому приложения, рассчитанные на встроенную в ПЛИС память, могут рассчитывать на ресурс, не превышающий 20 Кбайт (данные относятся к кристаллу EP20K200). Это требует ручной оптимизации исполняемого кода, что, как правило, достигается лишь с помощью ассемблера. Кроме того, если в процессе верификации возникнет необходимость в использовании встроенного анализатора SignalTapTM, то ресурс памяти может сократиться, потому что анализатору для хранения промежуточных данных необходимо наличие свободных ESB-блоков. Поэтому резонно для памяти программ и данных использовать внешнюю память. На отладочной плате, поставляемой вместе с пакетом Excalibur, размещена FLASH-память ёмкостью 1 Мбайт и SRAM общей ёмкостью 256 Кбайт [3]. Исходя из этого, разрядность шины адреса выбрана равной 21 бит.
На следующей странице (Page 3 of 5) предлагается выбрать размер регистрового файла процессора. Максимально доступный размер - 512 регистров общего назначения - соответствует разрядности процессора. Доступ к регистрам производится с помощью скользящего регистрового окна, в котором одновременно может находиться 32 регистра %r0–%r31 [4]. Управление окном производится при помощи специальной инструкции ассемблера. Окно скользит дискретно, по 16 регистров. Регистровое окно делится на четыре части, согласно табл. 2.
Таблица 2. Деление регистрового окна
Входные регистры |
%r24 – %r31 или %i0 – %i7 |
Локальные регистры |
%r16 – %r23 или %L0 – %L7 |
Выходные регистры |
%r8 – %r15 или %o0 – %o7 |
Глобальные регистры |
%r0 – %r7 или %g0 – %g7 |
Нижние или младшие 8 регистров - глобальные регистры. При перемещении регистрового окна глобальные регистры остаются на месте, выходные регистры предыдущего окна становятся входными для следующего, а локальные и входные регистры предыдущего окна - недоступными. Помимо регистров общего назначения, процессор содержит специализированный 11-бит К-регистр, 33-бит регистр счётчика команд PC (program counter) и 5 16-бит контрольных регистров %ctl0, %ctl1, %ctl2, %ctl8, %ctl9.
Page 4 of 5 позволяет производить настройки внутреннего сдвигового регистра и аппаратного умножителя (рис. 4). Большинство алгоритмов цифровой обработки сигналов требует большого количества операций сдвига и умножения. Для реализации этих операций стандартными средствами процессора уходит много времени. Поэтому в современных DSP-процессорах используются аппаратные блоки операции MAC (Multiply And Accumulate). В процессорном ядре Nios существует возможность аппаратной поддержки операции умножения (MSTEP) и сдвига. В табл. 3 приведены данные по необходимому количеству дополнительных логических элементов при реализации аппаратного умножителя. Для операций сдвига также существует аппаратная поддержка, позволяющая производить за один цикл тактовой частоты процессора сдвиг до 31 бит.
Таблица 3. Необходимое количество дополнительных логических элементов при реализации аппаратного умножителя
Умножение |
Дополнительные логические элементы |
Число тактов 16х16>32 |
Число тактов 32х32>32 |
Без аппаратной поддержки |
0 |
80 |
250 |
С аппаратной поддержкой |
200 |
18 |
80 |
Рисунок 4. Аппаратная поддержка операций умножения и сдвига
На последней странице конфигурации процессорного ядра (Page 5 of 5) система Quartus формирует файлы структуры ядра процессора с выдачей на экран отчёта. На этом этап создания ядра процессора Nios закончен.
Следующий шаг - создание подсистемы процессора со всеми необходимыми портами, таймерами, универсальными асинхронными приёмопередатчиками, памятью и т.п. Всю системную периферию процессора можно условно разделить на 7 типовых групп (рис. 5, поле type):
Рисунок 5. Конфигурация системной периферии процессора
- On Chip ROM;
- On Chip RAM;
- Timer;
- Serial I/O (UART);
- Parallel I/O;
- Memory Interface;
- Memory-Mapped Peripheral.
Устройства, принадлежащие к какой-либо из групп, имеют свои настройки, общие для данной группы.
Начнём с менеджера загрузки (boot на рис. 5). Он относится к классу On chip ROM - внутренняя память кристалла ПЛИС, в которую заносится программа загрузки процессорной системы. Сама программа генерируется при компиляции проекта, но исходный ассемблерный код её доступен для редактирования, поэтому при необходимости процесс загрузки и инициализации может быть изменён. Задача boot-менеджера сходна с задачей системы BIOS персонального компьютера. При "включении питания" процессора (понятие "включить питание" для процессора, встраиваемого в ПЛИС, отличается от аналогичного для стандартного процессора, так как используемые в этом случае кристаллы энергозависимые) менеджер загрузки производит инициализацию всей подсистемы процессора и далее, по инструкции JMP, передаёт управление исполняемому коду. Помимо этого, при отладке программного обеспечения с использованием отладочной платы, менеджер загрузки предоставляет дополнительные функции по мониторингу FLASH-памяти платы и ряд других необходимых функций.
К числу настраиваемых параметров группы On Chip ROM относится ёмкость памяти, выраженная в 16-бит словах (окно ROM Size) и путь к файлу содержимого ROM (ROM Input File) с расширением "mif".
Параметры настройки On Chip RAM практически не отличаются от настроек ROM. Необходимо выбрать разрядность создаваемой области памяти (окно RAM Width) и её размер (окно RAM Size), выраженный в количестве слов.
Следующий элемент процессорной системы - таймер. Это единственный элемент, не требующий никакой аппаратной настройки, кроме выбора базового адреса и номера прерывания процессора. Программная настройка таймера значительно сложнее, однако не обязательна. В библиотеке функций для процессора Nios на языке С есть функция, позволяющая без дополнительных программных настроек использовать таймер как счётчик интервалов времени. Для более тонкой программной настройки используются 6 регистров, доступных через базовый адрес, и соответствующее смещение (табл. 4).
Таблица 4. Регистры для тонкой программной настройки
A2..A0 |
Название регистра |
Описание битов регистра |
15 |
... |
4 |
3 |
2 |
1 |
0 |
0 |
Статус |
|
|
|
|
|
Run |
TO |
1 |
Управление |
|
|
|
Stop |
Start |
Contr |
iTO |
2 |
Период (L) |
|
|
Период тайм-аута 1 (15…0 биты) |
|
|
3 |
Период (H) |
|
|
Период тайм-аута 2 (31…16 биты) |
|
|
4 |
Snap (L) |
|
|
Снимок счётчика тайм-аута 1 (15…0 биты) |
|
|
5 |
Snap (H) |
|
|
Снимок счётчика тайм-аута 2 (31…16 биты) |
|
|
*) A2..А0 здесь и далее - смещение относительно базового адреса.
Запись единицы в ячейку Start регистра управления запускает таймер; аналогично, при наличии единицы в ячейке Stop таймер останавливается. Регистр Snap позволяет делать мгновенные снимки содержимого счётчика таймера.
Для взаимодействия процессора с периферией как внутри кристалла, так и вне его, можно использовать два способа:
- напрямую через порт (Serial I/O, Paral-lel I/O);
- через память.
Рассмотрим первый способ. Он включает в себя два интерфейса: по-следовательный и параллельный. По-следовательный интерфейс рассмотрим на примере аппаратной и программной конфигурации UART. Аппаратная настройка периферийных устройств типа UART (универсальный асинхронный приёмопередатчик) заключается в выборе ряда параметров: тактовой частоты (Input Clock Frequency, в нашем случае, 33333000 МГц) и скорости передачи (Baud Rate, 115200 бит/с). При аппаратной конфигурации можно жёстко установить скорость передачи, с запретом изменения её программным способом (Baud rate can be changed by soft-ware, рис. 6). Существует возможность выбрать алгоритм проверки на чётность (Parity), число передаваемых бит (Data bits) и число стоповых бит (Stop bits). Программный доступ к приёмопередатчику осуществляется при помощи пяти 16-бит регистров (табл. 5). Используется упрощённая логика интерфейса RS-232, в данной конфигурации UART не поддерживает сигналов аппаратного управления потоком данных CTS (Clear To Send) и RTS (Request To Send). Для полной совместимости с протоколом RS-232 необходим преобразователь уровней между ТТЛ-логикой выводов кристалла APEX и внешним кабелем.
Таблица 5. Регистры, используемые для программного доступа к приёмопередатчику
А0…А2 |
Название регистра |
15 |
... |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0 |
Rx Data |
|
|
|
|
|
Принимаемые данные |
|
|
|
|
1 |
Tx Data |
|
|
|
|
|
Передаваемые данные |
|
|
|
|
2 |
Статус |
|
|
|
E |
RRDY |
TRDY |
TMT |
TOE |
ROE |
BRK |
FE |
PE |
3 |
Управление |
|
|
TBRK |
iE |
iRRDY |
iTRDY |
iTMT |
iTOE |
iROE |
iBRK |
iFE |
iPE |
4 |
Делитель |
|
|
Делитель частоты для управления скоростью обмена (не обязательный параметр) |
|
|
Рисунок 6. Окно настройки UART
Для реализации параллельного интерфейса между процессором Nios и дополнительной аппаратурой как внутри кристалла ПЛИС, так и вне его, используется модуль типа Parallel I/O. Число этих модулей в составе процессора, или, иными словами, число параллельных портов, неограничено, и лимитируется лишь ёмкостью самого кристалла. Аппаратная настройка этого элемента состоит из двух этапов (рис. 7, 8). На первом этапе (Page 1 of 3 на рис. 7) предлагается выбрать разрядность порта (How many bits of PIO would you like (1-32)?) и тип выводов (Type of pins): входные, выходные, двунаправленные и два первых типа одновременно.
Рисунок 7. Первая страница настройки модуля Parallel I/O
На второй странице настройки (Pa-ge 2 of 3, рис. 8) выбирается тип буферных регистров порта. Это могут быть либо синхронные регистры, управляемые по переднему или по заднему фронту, либо асинхронные. Выбор активируется установкой флага в окне Edge Capture Register. В окне Interrupt source имеется возможность выбора условия генерации прерывания процессора, либо по смене логического уровня в ячейке, либо по фронту. На этом аппаратная настройка порта закончена. Программное управление портом Parallel I/O осуществляется описанным выше UART и таймером аналогично, а именно, через регистры. Параллельный порт имеет три доступных для чтения и записи регистра (табл. 6).
Рисунок 8. Вторая страница настройки модуля Parallel I/O
Таблица 6. Регистры для программного управления портом Parallel I/O
А1…А0 |
Название регистра |
Варьируемая разрядность |
0 |
Входные данные |
Данные, доступные для чтения |
Выходные данные |
Новые данные на передачу |
1 |
Направление передача/приём |
Необязательный параметр направления передачи данных,
активен, когда порт используется как двунаправленный |
2 |
Маска прерывания |
Устанавливает, по каким из битов разрешена генерация
прерывания |
Как видно из таблицы, программная настройка порта позволяет настраивать его на битовом уровне, то есть каждый бит порта независимо от других может настраиваться:
- на приём/передачу;
- на прерывания процессора.
Второй способ взаимодействия процессора с периферией - через память. К нему относятся два типа интерфейса: Memory Interface и Memory-Mapped Peripheral. Аппаратные настройки этих интерфейсов одинаковы ввиду их общности. Это интерфейсы памяти и периферии, отображаемой в памяти. Внешнее периферийное устройство, отображаемое в памяти, - это устройство, использующее совместную с процессором память. Доступ к такого рода периферии возможен через внешнюю память. Процесс аппаратной настройки такого рода периферии состоит из нескольких этапов. Для начала выбирается тип используемой памяти: On Chip или Off Chip. Далее необходимо выбрать разрядность шины данных и шины адреса. Чтение/запись в память может проводиться либо с использованием циклов ожидания, либо по сигналу готовности, аппаратная настройка позволяет выбрать один из этих режимов.
На этом настройка периферии процессора закончена. На рис. 9 показан вид окна настройки периферии после выбора и конфигурации всех необходимых компонентов. Здесь имеется встроенная память ROM для хранения менеджера загрузки процессора (boot), встроенная память RAM (on_chip_ram), универсальный асинхронный приёмопередатчик (uart1), таймер (timer1), 16-разрядный параллельный порт (par_io), интерфейсы с FLASH- и SRAM-памятью (flash и sram, соответственно). Каждому периферийному устройству присвоен свой базовый адрес и номер прерывания.
Рисунок 9. Окно настройки периферии после выбора и конфигурации всех необходимых компонентов
После того как было построено ядро процессора "my_nios_cpu", выбрана и настроена вся необходимая периферия процессорной системы, остаётся решить организационные вопросы (рис. 2, 10).
Рисунок 10. Распределение памяти между системными устройствами
К таким вопросам относятся: с какого адреса при очередном сбросе процессора будет загружаться програм-ма boot-менеджера и какое системное устройство за это отвечает (Reset Address); где и по какому адресу будет находиться таблица векторов прерываний процессора (Vector Table); где будет находиться память программ (Main Program Memory)?
САПР Quartus не имеет встроенных средств, позволяющих синтезировать процессорный модуль напрямую. Поэтому при построении процессора Quartus формирует файлы на языке VHDL или Verilog HDL, которые затем используются такими системами как Leonardo Spectrum для создания файла с расширением *.edf. И уже этот файл используется компилятором Quartus.
В результате всех манипуляций, получили программно-аппаратный модуль, графический символ которого (рис. 11) можно использовать в Block Diagram/Schematic редакторе как отдельный элемент (мегафункцию) общей схемы.
Рисунок 11. Изображение процессора Nios в Block Diagram/Schematic редакторе системы Quartus
Модульная структура проекта позволяет встраивать любое количество процессорных мегафункций в один проект и использовать его как основу для построения мультипроцессорных систем.
При компиляции проекта, в котором используется процессор Nios, помимо общих папок и файлов, генерируемых системой Quartus при компиляции любого проекта, создаётся дополнитель-ная папка, необходимая для разработки программного обеспечения под созданный процессор - my_nios_custom_sdk. В неё входят папки inc и lib, где хранятся "заголовочные" файлы с расширением *.h и файлы библиотеки С, используемые компилятором и линковщиком GNUPro, а также папка пользовательских программ src.
В данной статье основное внимание уделено построению процессора Nios и его аппаратной настройке. В то же время, встраиваемая система подразумевает наличие в кристалле ПЛИС дополнительной логики. Она может быть разработана как в САПР Quartus, так и в любом совместимом EDA (Electronic Design Automation) САПР. В следующей статье будет рассмотрен пример проектирования цифровой схемы в системе Quartus, имитационное моделирование (Simulation Mode), контроль сигналов внутри ПЛИС при помощи логического анализатора SignalTap.
Литература:
- Quartus Programmable Logic Develop-ment System. Tutorial. October 1999. www.altera.com.
- Nios Embedded Processor Software Development Reference Manual. March 2001. www.altera.com.
- Nios Embedded Processor Development Board. March 2001. www.altera.com.
- Nios Embedded Processor Programmer’s Reference Manual. March 2001. www.altera.com.
|