MP32: микропроцессор MIPS для ПЛИС Altera

MP32 представляет собой ядро процессора 4KEc с архитектурой MIPS32 для программируемых логических схем (ПЛИС, FPGA) фирмы Altera.

LEAD Technologies Inc. V1.01

Используя 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 0×19000000 0×19000000
ram.s1 0×00000000 0×00000000
rom.s1 0x1fc00000 0x1fc00000
pio.s1 0×18000000
uart.s1 0×18000100
spi.spi_control_port 0×18000200

(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.

 
proj/mips/mp32-howto.txt · Последние изменения: 2011/12/19 17:25 vak
 
Copyright (C) 1996-2013 Serge Vakulenko
serge@vak.ru