====== MP32: микропроцессор MIPS для ПЛИС Altera ====== [[http://www.altera.com/devices/processor/mips/mp32/proc-mp32-getting-started.html | MP32]] представляет собой ядро процессора [[http://www.mips.com/products/cores/32-64-bit-cores/mips32-4ke/ | 4KEc]] с архитектурой MIPS32 для программируемых логических схем (ПЛИС, FPGA) фирмы Altera. {{mp32-block-chart.jpg}} Используя MP32, можно создавать законченные микропроцессорные системы-на-чипе, способные работать под операционной системой [[http://retrobsd.org | RetroBSD]] или даже Linux. Ниже будет дан пример проектирования простой системы для платы [[http://www.altera.com/products/devkits/altera/kit-emb-dev-cyc3.html | Altera Embedded Systems Development Kit, Cyclone III Edition]]. Ядро MP32 входит в состав системы разработки Altera Quartus II Web Edition. Скачать последнюю версию Quartus II для Windows или Linux, а также документацию [[https://www.altera.com/download/software/quartus-ii-we | можно на этой странице]]. Для быстрого ознакомления рекомендуются бесплатные видеокурсы (на английском) [[http://www.altera.com/education/training/courses/ODSW1100 | Using the Quartus II Software: An Introduction]] и [[http://www.altera.com/education/training/courses/OQSYS1000 | Introduction to Qsys]]. ===== Пример системы-на-чипе для FPGA Cyclone III ===== Для создания простой системы, способной нести RetroBSD Unix, выполняйте следующие шаги. (1) Скачайте и установите Quartus II Web Edition [[https://www.altera.com/download/software/quartus-ii-we | по этой ссылке]]. Запустите Quartus II. {{quartus-ii-empty.png}} (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. {{qsys-empty.png}} По каким-то причинам изначально в библиотеке отображаются не все нужные нам компоненты. Чтобы они появились, выполните команду меню 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. {{qsys-mp32.png?617x428}} (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.