Микроконтроллер своими руками: MicroBlaze MCS

Моргаем светодиодом при помощи процессора MicroBlaze, который запущен на Xilinx Spartan 3E.
Для запуска выбрана плата Core3S500E.
Ещё недавно Xilinx разрешало использовать микропроцессор MicroBlaze только при покупке платных версий средств разработки. Пару лет назад было сделано исключение и теперь мы можем попробовать в деле этот процессор в некой «стандартной конфигурации».
Осторожно, трафик (0.7 MB).


Ключ на запуск!
Оборудование и программное обеспечение.
  1. Плата, в которую помещается microblaze, у меня Core3S500E
  2. программатор, у меня это «Digilent JTAG HS2 Programming Cable»
  3. провода/переходники для подключения программатора
  4. Среда разработки ISE WebPACK Design Software


Создаём проект
Project Navigator: Новый прокет
Имя проекта и тип
Выбираем наше устройство 3S500E

Генерация процессора
Xilinx и их партнёры предоставляют уже готовые модули, оптимизированные под конкретные FPGA. Для работы и конфигурирования этих чёрных ящиков используется IP Core Generator.
Запускаем IP Core Generator
Создаём новый проект Core Generator
Оставляем имя проекта и путь по умолчанию для core generator
Выбираем чип FPGA 3S500E, 208 ножек
Мы будем использовать verilog для нашего проекта, выбираем verilog в CoreGenerator
Находим MicroBlaze в каталоге: Embedded Processing/Processor/MicroBlaze MCS
Задаём частоту - 50 MHz, имя инстанса mcs_0
Для моргания светодиодом нам хватит и 4х выводов.
Возвращаемся в Project Navigator и добавляем новый IP Core в проект
Файл описания MicroBlaze MCS IP core находится в поддиректории ipcore_dir
Модуль MicroBlaze MCS поставляется вместе с настроечными скриптами, запускаем эти скрипты в Tcl консоле.
Project Navigator меню View/Panels/Tcl Console
После добавления IP Core мы можем посмотреть пример его инстанцирования
Project Navigator: шаблон инстанцирования IP Core

При генерации IP Core мы выбрали название инстанса mcs_0.
microblaze_mcs_v1_4 mcs_0 (
  .Clk(Clk), // input Clk
  .Reset(Reset), // input Reset
  .GPO1(GPO1) // output [3 : 0] GPO1
);


Сопоставляем выводы FPGA и текстовые названия, используемые в Verilog
Ножки в FPGA назначаются в *.ucf файлах. Среда разработки под FPGA рассматривает назначение вывода как ограничения, такие же как максимальная частота работы задающего тактового генератора.
Project Navigator создаём новый файл
Выбираем имя ucf файла

В файле нужны только ограничения с типом NET * LOC.
NET "clk" LOC = P184;
NET "RST" LOC = P101;

NET "led[0]" LOC = P68;
NET "led[1]" LOC = P78;
NET "led[2]" LOC = P83;
NET "led[3]" LOC = P89;


Создание модуля verilog верхнего уровня
Модуль верхнего уровня выступает клеем для всех модулей.
Параметрами этого модуля выступают все необходимые входы и выходы FPGA.
Добавляем verilog модуль верхнего уровня
Задаём имя модуля верхнего уровня. Так же но с расширением .bit будет называться прошивка для FPGA
module mb_blink(
		input clk,
		input RST,
		output [3:0] led
    );
	 
	 wire Reset;
	 wire [3:0] GPO1;
	 
	 assign Reset = !RST; // на плате Core3S500E перевёрнутый reset
	 assign led = ~GPO1; // Светодиоды будут загораться от логической единицы из процессора

	microblaze_mcs_v1_4 mcs_0 (
	  .Clk(clk), // input Clk
	  .Reset(Reset), // input Reset
	  .GPO1(GPO1) // output [3 : 0] GPO1
	  );
endmodule


Запускаем Tcl скрипты через консоль.
Command>source ipcore_dir/microblaze_mcs_setup.tcl
microblaze_mcs_setup: Found 1 MicroBlaze MCS core.
microblaze_mcs_setup: Existing ngdbuild "-bm" option unchanged.
microblaze_mcs_setup: Done.


Чтобы проверить правильность наших действий, на этом этапе можно провести сборку bit файла (прошивка для fpga).
Генерация bit файла
У нас получилась прошивка для FPGA с микроконтроллером, но она пустая.

Программная часть
Запускаем Xilinx Software Development Kit.
Это программное обеспечение основано на Eclipse и должно быть привычным инструментом для C/C++ программистов.
Для работы с MicroBlaze надо сгенерировать SDK и тестовый проект
Выбираем, что нам нужна новая плата
Выбираем xml описатель Microblase MCS
В качестве базы возьмём Hello World
Заменяем код
#include <xparameters.h>
#include <xiomodule.h>
#include <xiomodule_l.h>
XIOModule gpo1;
volatile u32 ct = 0;
int main() {
	XIOModule_Initialize(&gpo1, XPAR_IOMODULE_0_DEVICE_ID);
	XIOModule_Start(&gpo1);
	while (1) {
		volatile int i = 0;
		for (i = 0; i < 10000000; ++i) {}
		++ct;
		XIOModule_DiscreteWrite(&gpo1, 1, ct);
	}
}


Помещаем код программы в RAM
Tcl скрипт для MicroBlaze MCS содержит функцию для модификации ram внутри .bit файла
Command>microblaze_mcs_data2mem c:/Users/test/workspace/mb_blink_sw/Debug/mb_blink_sw.elf
microblaze_mcs_data2mem: Found 1 MicroBlaze MCS core.
microblaze_mcs_data2mem: Using "mb_blink_sw.elf" for microblaze_mcs_v1_4
microblaze_mcs_data2mem: Added "-bd" options to bitgen command line.
microblaze_mcs_data2mem: Running "data2mem" to create simulation files.
microblaze_mcs_data2mem: Running "data2mem" to update bitstream with software.
microblaze_mcs_data2mem: Done.


Пересобираем проект.

Прошивка .bit
Каждый раз после перезагрузки FPGA переходит в заводское состояние. Прошивка на FPGA может быть загружена через JTAG или из EEPROM.
Для прошивки EEPROM мы будем использовать наш программатор и программное обеспечение от Digilent: Digilent Adept 2.
Прошивка .bit файла через Adept

Что получилось?


Проблемы
  • На Linux (Fedora 20) можно собрать проект на verilog, но полученный код не работает, XSDK часто падает.
  • Если не назвать инстанс процессора mcs_0, выдаётся много странных ошибок про память.
  • 1-2GB памяти недостаточно для комфортной работы с пакетом.
  • При скачивании ISE WebPACK легко скачать Vivado по-ошибке.
  • В видео led не инвертированы и при логической единице потухают. (assign led = GPO1;)
  • +1
  • 25 апреля 2014, 22:34
  • ihanick

Комментарии (2)

RSS свернуть / развернуть
прочитав треть дальше не смог. крайне криво пишете, товарищ
+1
  • avatar
  • xar
  • 26 апреля 2014, 01:12
Все равно полезно. Подробная инструкция. По шагам. Может послужить неплохой точкой отсчета, даже мне с моими «циклонами», когда я опять до них доберусь.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.