MP32: микропроцессор MIPS для ПЛИС Altera
MP32 представляет собой ядро процессора 4KEc с архитектурой MIPS32 для программируемых логических схем (ПЛИС, FPGA) фирмы Altera.
Используя MP32, можно создавать законченные микропроцессорные системы-на-чипе, способные работать под операционной системой RetroBSD или даже Linux. Ниже будет дан пример проектирования простой системы для платы Altera Embedded Systems Development Kit, Cyclone III Edition.
Ядро MP32 входит в состав системы разработки Altera Quartus II Web Edition. Скачать последнюю версию Quartus II для Windows или Linux, а также документацию можно на этой странице. Для быстрого ознакомления рекомендуются бесплатные видеокурсы (на английском) Using the Quartus II Software: An Introduction и Introduction to Qsys.
Пример системы-на-чипе для FPGA Cyclone III
Для создания простой системы, способной нести RetroBSD Unix, выполняйте следующие шаги.
(1) Скачайте и установите Quartus II Web Edition по этой ссылке. Запустите Quartus II.
(2) Создаём новый проект. Выполните команду меню File / New Project Wizard, нажмите Next. В первом поле введите имя каталога для проекта, например “/home/vak/mp32-example”. Во втором поле требуется название проекта, скажем “mp32”. В третьем поле нужно название для объекта верхнего уровня, обозначающего всю микросхему, например “top”. Нажмите Next. На вопрос о создании нового каталоге ответьте Yes.
Откроется окно добавления файлов к проекту - это мы сделаем позже, а пока нажмите Next. Появится окно выбора типа микросхемы FPGA. В поле Family выберите Cyclone III, в поле Package: FBGA, Pin count: 780, Speed grade: 7. В списке Available devices выделите EP3C120F780C7 (второй снизу). Нажмите Next, еще раз Next и Finish. Мы получили пустой проект.
(3) Мы будем строить систему их готовых компонентов, имеющихся в библиотеке Quartus II. Для этого служит подсистема Qsys. Вызовите её из меню Tools / Qsys.
По каким-то причинам изначально в библиотеке отображаются не все нужные нам компоненты. Чтобы они появились, выполните команду меню Tools / Options. Выберите категорию Internal и поставьте галочку Enable internal features. Нажмите Finish. Теперь кликните правой кнопкой мыши на Library в левой части окна (панель Component Library). В появившемся меню выберите Show Hidden Components. После этого список Library существенно увеличится, и в нём появятся нужные блоки.
(4) Добавляем в систему процессор. В списке Library (левая часть окна) найдите раздел Processors и дважды кликните на нём мышкой. В раскрывшемся списке выберите Altera MP32 Processor и нажмите кнопку +Add ниже. Появится окно выбора параметров процессора. Поставьте следующие параметры:
- В разделе Main:
- Debug Port: да
- Debug Slave: (поставим позже)
- В разделе Caches and Memory Interfaces:
- Instruction Cache Size: 4 kbytes
- Instruction Cache RAM Type: Auto
- Data Cache Size: 4 kbytes
- Instruction Cache RAM Type: Auto
- В разделе Advanced Features:
- Endianness: Little
- CPUNum Value in COP0 EBase Register: 0
- Internal Timer IRQ Number: 7
- Reset Slave: None
- BHT Entries: 256 Entries
- DSP Block Configuration: Latency-optimized
- В разделе MMU Settings:
- MMU Type: FMT
- В разделе Internal Test:
- Enable Altera Internal Test Mode: нет
- Always Encrypt: да
- Activate RTL Monitors: да
- Activate RTL Test-end Checker: да
- Activate RTL Trace: да
- RTL Simulation Caches Cleared: да
- Debug Simgen: нет
Нажмите Finish. В разделе System Contents появится компонент с именем mp32_0.
(5) Добавляем порт отладки. В библиотеке найдите раздел Processor Additions, дважды кликните и выберите EJTAG. Нажмите кнопку +Add. В окне параметров установите:
- Endianness: Little
- EJTAG Pins: Extra EJTAG Pins
Нажмите Finish, в системе появится компонент ejtag_0.
(6) Добавляем оперативную память. Как для RAM, так и для ROM будем использовать внутренние блоки памяти, имеющиеся на FPGA. Их вполне достаточно для работы RetroBSD. В библиотеке откройте раздел Memories and Memory Controllers, в нем раздел On-Chip, а в нём On-Chip Memory (RAM or ROM). Нажмите кнопку +Add. Для RAM установите параметры:
- В разделе Memory Type:
- Type: RAM (Writable)
- Dual-port access: нет
- Block type: Auto
- В разделе Size:
- Data width: 32
- Total memory size: 131072 bytes
- В разделе Read latency:
- Slave s1 Latency: 1
- В разделе Memory initialization:
- Initialize memory content: да
- Enable non-default initialization file: да
- User created initialization file: ram
- Enable In-System Memory Content Editor feature: нет
Нажмите Finish, в системе появится компонент onchip_memory2_0.
(7) Аналогично добавляем ПЗУ (ROM). Нажмите кнопку +Add и установите параметры:
- В разделе Memory Type: ROM (Read-only)
- Type: RAM (Writable)
- Dual-port access: нет
- Block type: Auto
- В разделе Size:
- Data width: 32
- Total memory size: 262144 bytes
- В разделе Read latency:
- Slave s1 Latency: 1
- В разделе Memory initialization:
- Initialize memory content: да
- Enable non-default initialization file: да
- User created initialization file: rom
- Enable In-System Memory Content Editor feature: нет
(8) Добавляем сигналы ввода-вывода общего назначения. С их помощью можно будет мигать светодиодами или опрашивать кнопки. В библиотеке откройте раздел Peripherals, в нем раздел Microcontroller Peripherals, а в нём PIO (Parallel I/O). Нажмите кнопку +Add и установите параметры:
- В разделе Basic Settings:
- Width: 8
- Direction: Bidir
- Output Port Reset Value: 0
- В разделе Output Register:
- Enable individual bit setting/clearing: да
- В разделе Edge capture register:
- Synchronously capture: нет
- В разделе Interrupt:
- Generate IRQ: нет
- В разделе Test bench wiring:
- Hardwire PIO inputs in test bench: да
- Drive inputs to: 0
Нажмите Finish, в системе появится компонент pio_0.
(9) Добавляем асинхронный порт UART. В библиотеке откройте раздел Interface Protocols, в нем раздел Serial, а в нём UART (RS-232 Serial Port). Нажмите кнопку +Add и установите параметры:
- В разделе Basic Settings:
- Parity: None
- Data bits: 8
- Stop bits: 1
- Synchronizer stages: 2
- Include CTS/RTS: нет
- Include end-of-packet: нет
- В разделе Baud rate:
- Baud rate (bps): 115200
- Baud error: 0
- Fixed baud rate: да
- В разделе Simulated RXD-input character stream:
- Contents: (пусто)
- В разделе Modelsim Options:
- Streaming output window: да
- Interactive stimulus window: да
- В разделе Simulated transmitter baud rate:
- Option: Accelerated (Use divisor = 2)
Нажмите Finish, в системе появится компонент uart_0.
(10) Добавляем порт SPI. В том же разделе Interface Protocols / Serial выберите SPI (3 Wire Serial) и нажмите +Add. Установите параметры:
- В разделе Master/Slave:
- Type: Master
- Number of select signals: 1
- SPI clock rate: 10000000 Hz
- Specify delay: нет
- В разделе Data register:
- Width: 8 bits
- Shift direction: MSB first
- В разделе Timing:
- Clock polarity: 0
- Clock phase: 0
- В разделе Synchronizer Stages:
- Insert synchronizers: нет
- В разделе Avalon interface:
- Disable flow control: да
Нажмите Finish, в системе появится компонент spi_0.
(11) Используя мышку, подключите шины, сигналы и прерывания, как показано на рисунке (кликните чтобы увеличить). Имена компонентов можно при желании изменить, нажимая на каждый правой кнопкой мыши и выбирая Rename.
(12) Переключитесь на вкладку Address Map и введите следующие значения адресов:
cpu.instruction_master | cpu.data_master | ||||
ejtag.avalon_slave_ejtag | 0x19000000 | 0x19000000 | |||
ram.s1 | 0x00000000 | 0x00000000 | |||
rom.s1 | 0x1fc00000 | 0x1fc00000 | |||
pio.s1 | 0x18000000 | ||||
uart.s1 | 0x18000100 | ||||
spi.spi_control_port | 0x18000200 |
(13) Сохраните файл конфигурации получившейся системы. Выполните команду меню File / Save, введите имя файла “mp32” и нажмите Save. Если Вам неохота проделывать все вышеуказанные операции, готовый файл можно скачать здесь: mp32.qsys. Но автор не отвечает за его пригодность для каких бы то ни было целей.
(14) Переключитесь на вкладку Generation и установите параметры:
- В разделе Simulation:
- Create simulation model: Verilog
- Create testbench Qsys system: Simple
- Create testbench simulation model: Verilog
- В разделе Synthesis:
- Create HDL design files for synthesis: да
- Create block symbol file: нет
- В разделе Output Directory:
- Path: /home/vak/mp32-example
Нажмите кнопку Generate. Будут созданы файлы с исходным кодом всех компонентов проекта.
(15) Завершите работу программы Qsys (меню File / Exit).
(16) Добавляем систему, созданную с помощью Qsys, в наш проект. Выполните команду меню Project / Add/Remove Files in Project. Щелкните на троеточие справа от поля File, и в открывшемся окне выберите файл mp32.qsys. Нажмите Open, окно закроется. Теперь нажмите Add справа от имени файла. Затем нажмите Ok.
(17) Проект готов к пробному синтезу. Чтобы запустить компиляцию, щелкните правой кнопкой мыши на Compile Design в панели Tasks и из открывшегося меню выберите Start.
Осталось назначить для внешних сигналов соответствие ножкам микросхемы на конкретной плате, и полученный в результате файл можно будет загружать в FPGA.