Компиляция PicoBlaze программы

Перевод Войтов Г.

Источник : Xilinx.com

 

Введение

          Существуют десятки 8-разрядных архитектур микроконтроллеров и соответствующих им систем команд. Современные FPGAs могут эффективно реализовать практически любой 8-разрядный микроконтроллер, и доступные FPGA ядра программного обеспечения поддерживают популярные системы команд как например PIC, 8051, AVR, 6502, 8080, и Z80 микроконтроллеров. Xilinx PicoBlaze микроконтроллер особенно часто проектируется и оптимизируется для Virtex и Spartan серий FPGA и COOLRUNNER-II CPLDS. Реализация PicoBlaze потребляет значительно меньше ресурсов, чем сопоставимые 8-разрядные микроконтроллеры. PicoBlaze обладает рядом достоинств, которые вкратце будут перечислены ниже.
          PicoBlaze является компактным, способным, и рентабельным 8-разрядным RISC микроконтроллерным ядром оптимизированным для Spartan™-3, Virtex™-II, VIRTEX-II Pro™ и Virtex-4 FPGA и CoolRunner™-II CPLD.
          Удобный в работе Ассемблер — ассемблер PicoBlaze представляет собой простую программу DOS. Программа компилируется менее чем за 3 секунды и в результате будет сгенерирован VHDL, Verilog и М - файл (для Системного Генератора Xilinx) для определения прошивки блока памяти программы. Другие инструменты развития включают графическое объединенную развитую среду (IDE), графический имитатор (ISS) системы команд и исходный код VHDL и имитационные модели.
          Мощная работа — PicoBlaze выполняет от 44 до 100 миллионов команд за секунду. Это зависит в основном от параметров FPGA.
          Минимальный размер схемы — PicoBlaze занимает 192 логических ячеек, которые представляет только 5% платы Spartan-3 XC3S200. Поскольку ядро потребляет небольшую часть площади FPGA, можно одновременно использовать несколько устройств для решения больших задач.
          Возможность 100%-й вложенности — ядро PicoBlaze полностью прошивается в пределах FPGA или CPLD и не требует никаких внешних ресурсов. Его функциональные возможности легко расширяются при подключении дополнительных логических схем к его портам ввода - вывода.

Что такое - KCPSM3 ?

          KCPSM3 – это очень простой 8-разрядный микроконтроллер, используемый прежде всего в устройствах Spartan-3, но также подходящий для использования в VIRTEX-II и Virtex- IIPRO.
          Микроконтроллер может использоваться как для простой обработки данных, так и в приложениях, требующих комплексной, но не критичной ко времени машины.
          Макрос KCPSM разработан под воздействием одного доминирующего фактора, в котором он превосходит все другие устройства – это его размер! Как результат - микроконтроллер, который занимает только 96 Spartan-3 ячеек и является всего лишь 5% в устройстве XC3S200 и меньше чем 0.3% из XC3S5000. Кроме того преимущества в занимаемой площади кристалла, следует отметить, что единственного блока оперативной памяти (RAM) достаточно для хранения программы вплоть до 1024 команд. Даже с такими ограничениями в размере, примечательно то, что микроконтроллер выполняет приблизительно от 43 до 66 MIPS (миллионов команд в секунду) в зависимости от типа устройства, на котором он реализован, и уровня его скорости.
          Одной из большинства захватывающих особенностей KCPSM3 является то, что он полностью прошивается в FPGA и не требует никакой внешней поддержки.
          Сам факт того, что ЛЮБАЯ логика может быть подключена к модулю внутри устройства Spartan-3 или VIRTEX-II означает, что можно сделать необходимые дополнения с целью обеспечения максимальной гибкости. Важно не только то, что заключено внутри модуля KCPSM3 и делает его полезным, но и оборудование, c которым он сопряжён. KCPSM3 представлен как VHDL и как предварительно скомпилированный программный макрос, который просто включается в проект. Размещения нескольких KCPSM3 в пределах одного проекта очевидно. В случае, когда требуется не критичное ко времени комплексное устройство, этот макрос не сложный для вставки и очень упрощает проект.

Размер программы

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

16 регистров общего назначения

          Есть 16 регистров общего назначения 8-битов обозначенных от ‘s0’ до ‘sF’, которые могут быть переименованы в ассемблерном коде. Все операции одинаково используют регистры без резервирования отдельных для специальных задач и без приоритета одного над любым другим регистром. Отдельного аккумулятора нет, ведь любой регистр может использоваться во всех операциях.

АРИФМЕТИКО-ЛОГИЧЕСКОЕ УСТРОЙСТВО

          Арифметический Логический Модуль (АРИФМЕТИКО-ЛОГИЧЕСКОЕ УСТРОЙСТВО) выполняет много простых операций необходимых в 8-битном обрабатывающем модуле. Все операции выполняются, используя операнд, расположенный в любом из регистров (sX). Результат помещается в тот же регистр. Для операций над двумя операндами, может быть указан второй регистр (sY) или константное 8-разрядное значение (kk). Простая система команд даёт возможность использования константных значений без дополнительного увеличения программного размера или длительности обработки, т.е. операция ‘ДОБАВИТЬ 1’ та же как и встроенная операция ИНКРЕМЕНТА.           У операций суммирования (ADD) и вычитание (SUB) есть опция включения признака переноса как входного сигнала (ADDCY и SUBCY) для выполнения арифметических операций более чем 8-битыними операндами.           Побитовые операторы LOAD, AND, OR и XOR обеспечивают установку и проверку значения отдельных разрядов.           Имеется группа операций SHIFT и ROUTE.           Команды COMPARE и TEST позволяют проверить содержимое регистра без его изменения, а так же выполнить контроль по паритету.

Флаги и элементы управления ходом выполнения программы

          Результаты операций арифметико-логического устройства определяют состояние флагов ZERO и CARRY. Флаг ZERO устанавливается в случае, если все разряды результата арифметико-логического устройства сброшены в 0 (0016). Флаг CARRY установлен, если в результате арифметической операции возникло переполнение. Это также используется для фиксирования спадающих разрядов регистра при выполнении команд SHIFT и ROUTE. При выполнении команды TEST, признак переноса используется для хранения результата 8-разрядной проверки нечётности ODD PARITY.           Состояние флагов может используется для определения порядка выполнения команд в программах, использующих условные переходы. Команды JUMP используются для перехода с использованием абсолютного адреса (aaa) в пределах программного пространства. Команды CALL и RETURN обеспечивают организацию наиболее часто используемых фрагментов кода в подпрограммы. CALL осуществляет переход на абсолютный адрес (aaa) и сохранение текущего адреса внутри стека, что требуется для последующего выполнения команды возврата из подпрограммы RETURN. Стек поддерживает вплоть до 31 уровня вложенности подпрограмм.

Сброс

          Вход RESET сбрасывает процессор в исходное состояние. Программа будет выполняться начиная с адреса ‘000’ , при этом прерывания будут отключенные. Флаги состояния и стек CALL/REURN стек также будут сброшены. Примечание: эта команда не воздействует на содержимое регистров общего назначения.

Ввод/Вывод

          KCPSM3 фактически имеет 256 входных и 256 выведенных портов. Доступный порт указывается по значению 8-разрядного адреса, хранящегося в ‘PORT_ID’. Адрес порта может быть указан в программе как абсолютная величина (pp), но возможно и косвенное указание в любом из 16 регистров ((sY)). При выполнении операции ‘INPUT’ значение из входного порта переносится в любой из 16 регистров. Операция ввода подтверждается импульсом, который подаётся на READ_STROBE. Не всегда необходимо использовать этот сигнал входного интерфейса, но может быть полезно указать, что процессор получил данные. В течение ‘OUTPUT’, содержимое любого из 16 регистров записывается в порт вывода. Операцию вывода подтверждает импульс, который поступает на WRITE_STROBE. Этот стробирующий сигнал использует логику интерфейса, чтобы гарантировать, что были переданы действительные данные. Обычно, WRITE_STROBE используется в качестве сигнала синхронизации или разрешающего сигнала.

Внутренняя память

          Это внутренние 64 байта памяти общего назначения. Содержимое любого из 16 регистров может быть записано в любую из 64 ячеек, используя команду STORE. Дополнительная команда FETCH позволяет содержимое любой из 64 ячеек памяти записать в любой из 16 регистров. Это позволяет хранить намного больший переменных в пределах процессора и стремится использовать всё пространство I/O именно для ввода и вывода сигналов. 6-разрядный адрес, указывающий расположение во внутренней памяти может быть задан в программе как абсолютная величина (SS), или, возможно, косвенно - как содержимое любого из 16 регистров (sY). Используются только младшие 6 битов регистра, чтобы не выйти за пределы 00 - 3F 16пространства доступной памяти.

Прерывания

          Процессор обрабатывает единственный входной сигнал прерывания. Но при необходимости можно использовать не сложную логику, чтобы комбинировать множественные сигналы. Прерывания заблокированы (masked) по умолчанию, и затем программно разрешаются и маскируются. Активный сигнал прерывания заставляет KCPSM3 сгенерировать ‘CALL 3FF’ (обращение к подпрограмме расположенной в последней ячейке памяти) - где пользователь может определить подходящий jump вектор к программе обработки прерывания. В это время, генерируется импульс на выход INTERRUPT_ACK, флаги ZERO и CARRY автоматически сохраняются и любые дальнейшие прерывания заблокированы. Команда ‘RETURNI’ гарантирует, что в конце ISR состояние флагов будет восстановлено и устанавливает разрешение или блокировку дальнейших прерываний.

Константные значения

Постоянные Значения

          Постоянные значения, возможно, указаны для использования в большинстве аспектов программы. • Значение константных данных для использования в операции ALU. • Базовый адрес порта доступа специфических сообщений или контроля внешней логики KCPSM3. • Значения базового адреса для управления последовательностью выполнения программы. • Значения базового адреса для доступа ко внутренней оперативной памяти. Система команд KCPSM3 проектировалась с учётом возможности констант быть указанными в пределах любой команды. Отныне использование констант не влияет на размер программы или длительности её выполнения. Это фактически расширяет простую систему команд целым диапазоном ‘виртуальных команд’.

Постоянные циклы

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

Постоянный размер программ

          Программная длина составляет 1024 команды и соответствует формату 1024x18 одного блока оперативной памяти Spartan-3, VIRTEX-II или VIRTEX-IIPRO. Это означает, что все адресные значения занимают 10-битные поля в пределах кода команды (assembler поддерживает метки строки, чтобы упростить написание программы).

Использование KCPSM3 (VHDL)

          Принципиальный метод, которым KCPSM3 будет использоваться, находится в VHDL потоке проекта. KCPS M3 macro обеспечен как исходный VHDL – файл (kcspm3.vhd) который был записан, чтобы обеспечить оптимальную и предсказуемую реализацию в Спартанском-3 или VIRTEX-II(PRO) устройствах. Код подходит для реализации и моделирования в качестве макрокоманды.

Обьявление компонента KCPSM3 :

component kcpsm3
Port ( address : out std_logic_vector(9 downto 0);
instruction : in std_logic_vector(17 downto 0);
port_id : out std_logic_vector(7 downto 0);
write_strobe : out std_logic;
out_port : out std_logic_vector(7 downto 0);
read_strobe : out std_logic;
in_port : in std_logic_vector(7 downto 0);
interrupt : in std_logic;
interrupt_ack : out std_logic;
reset : in std_logic;
clk : in std_logic);
end component;

Использование компонента KCPSM3 :

processor: kcpsm3
port map( address = > address,
instruction = > instruction,
port_id = > port_id,
write_strobe = > write_strobe,
out_port = > out_port,
read_strobe = > read_strobe,
in_port = > in_port,
interrupt = > interrupt,
interrupt_ack = > interrupt_ack,
reset = > kcpsm3_reset,
clk = > clk);

Подключение программы на ПЗУ(ROM)
Принципиальный метод, по которому KCPSM3 программа ROM будет использоваться, находится в VHDL потоке проекта. Ассемблер KCPSM3 генерирует файл VHDL, в котором создаётся блок оперативной памяти и определяется его начальное содержимое. VHDL может использоваться для реализации и моделирования процессора.

VHDL обьявление компонента Rom:

component control
Port ( address : in std_logic_vector(9 downto 0);
instruction : out std_logic_vector(17 downto 0);
proc_reset : out std_logic;
clk : in std_logic);
end component;

Использование компонента Rom:

program_rom: control
port map( address = > address,
instruction = > instruction,
proc_reset = > kcpsm3_reset,
clk = > clk);

Примечание - имя ROM программы (показано как control выше в примерах) зависит от имени программы. Например, если программный файл назван ‘Phone.psm’, то ассемблер сгенерирует файл определения прошивки программной ROM ‘phone.vhd’.

Verilog и System Generator

          Хотя первоначальный поток проекта - VHDL, KCPSM3 может использоваться в любом потоке проекта, поддерживаемом Xilinx. Ассемблер также генерирует файлы определения программной памяти, подходящие Verilog и Simulink.

.v- Ассемблер генерирует файл Verilog, в котором описан блок оперативной памяти RAM и его начальное содержимое. Это Verilog –файл может использоваться для реализации и моделирования процессора. Kcspm3.ngc файл используется для описания процессора.

kcpsm3.ngc - файл NGC генерируется в ходе синтеза файла kcpsm3.vhd в XST (без вставки I/O буферов). Этот файл может использоваться в качестве ‘черного ящика’ в устройсвах Spartan-3, VIRTEX-II или VIRTEX-IIPRO, и он будет объединён с остальной частью проекта в течение фазы трансляции (ngdbuild). Примечательно, что шины описаны в стиле ‘IN_PORT <7:0>’ с индивидуальными сигналами от ‘in_port_0’ до ‘in_port_7’.

.m - Ассемблер генерирует m- функцию, используемую определяющую содержимое блока памяти System Generator средствами MATLAB Simulink. .coe - Файл COE, генерируемый ассемблером, подходит для использования с Xilinx Core Generator. Файл содержит начальную прошивку блока ROM. Файлы, полученные при помощиCore Generator, так же могут использоваться в потоке проекта и и подключаться к чёрному ящику kcpsm3.

Ассемблер KCPSM3

          Ассемблер KCPSM3 обеспечен как простая программа DOS. Написание программы осуществляется при помощи стандартного Notepad, или инструментами Wordpad. Файл сохраняется с расширением ‘.psm’ (максимальная длина имени – 8 символов). Чтобы откомпилировать программу, необходимо в командной строке ввести ‘kcpsm3 [.psm] , где filename – это имя программы.

          На рис. 1 приведен пример компиляции psm – файла.

1

Рис.1. Компиляция psm -файла

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

          Так как выполнение ассемблера очень быстрое, сложно увидеть сообщение об ошибке. Чтобы просмотреть сообщения об ошибках, нужно в командной строке перенаправить вывод в текстовый фай:

kcpsm3 [.psm]> screen_dump.txt

Ассемблер KCPSM3 фактически использует четыре входных файла и генерирует 15 выходных файлов. Они показаны на рис.2.

2

Рис.2. Компиляция программного файла