LatticeMico32 является 32-разрядным микропроцессором с soft core, разработанным Lattice Semiconductor и оптимизированным для программируемых вентильных матриц (FPGA). Он использует Гарвардскую архитектуру, что означает, что шины инструкции и данных являются отдельными. Логика арбитража шин может быть использована для объединения двух шин, при желании.
LatticeMico32 лицензируется по бесплатной лицензии. Это означает, что Mico32 не ограничивается ПЛИС Lattice, и может быть легально использован на любой хост-архитектуры (ПЛИС, asic или эмуляции программного обеспечения (например, в qemu)). Можно встроить LatticeMico32 ядра в ПЛИС xilinx и altera.
Давайте приступим к созданию этого процессора для нашей платы VE-LCMXO27000HC!
Для начала скачаем среду разработки с сайта Lattice
После установки запускаем LMS 1.0 for Diamond 3.10. На этом шаге нам необходимо выбрать путь к каталогу workspace:
Рис. 1: Создание нового проекта в LMS 1.0 for Diamond 3.10
Нажав OK мы увидим девственно чистое окно Eclipse:
Рис. 2: Новый проект
Выбираем File->New Platform. Откроется окно конфигурации новой платформы для конкретной FPGA платы. Указываем частоту установленного генератора- 50 МГц, требуемый процессор- LM32, тип установленной FPGA- LCMXO27000HC. Также укажем имя и папку для нашего проекта и выбираем FINISH
Рис. 3: Создание новой платформы FPGA платы
На левой панели мы видим возможные блоки, которые можно добавить к нашей SOC:
Рис. 4: Блоки SOC
Для начала добавим собственно сам процессор. На странице настроек выключим кэш данных и инструкций. С ними у меня почему-то нормально не завелась отладка:
Рис. 5: Процессор LatticeMico32
Далее добавим статическую память SRAM. Количество циклов чтения/записи необходимо установить равным 2. Ширина шины адреса 19 бит, шины данных 8 бит. Включаем Registered data output:
Рис. 6: Статическая память SRAM
В заключение добавим модуль вывода данных. Тип выберем Output Ports Only, ширину 32 бита:
Рис. 7: Модуль вывода данных GPIO
Далее соединим нашими модули с шинами данных и инструкций:
Рис. 8: Готовый микропроцессор LM32
Выбираем пункт меню Platform Tools->Run Generator. Если не допущено никаких ошибок мы получим сгенерированные файлы нашего проекта:
Рис. 9: Генерация файлов микропроцессор LatticeMico32
На этом настройка нашего проекта закончена. На следующем шаге добавим виртуальные индикаторы, из нашего предыдущего проекта Виртуальные светодиоды и 7-ми сегментный индикатор. Для этого добавим файлы display.v, hvsync.v, vga_leds.v а также создадим модуль синтезатора частоты pll с двумя частотами 74 МГц для VGA модуля и 100 МГц для процессора:
Рис. 10: Добавление файлов виртуальных индикаторов
Модуль верхнего уровня должен выглядеть следующим образом:
Verilog Code:
module vga_leds( input wire CLK50MHZ, // outputs: output wire hsync, output wire vsync, //high-color test video signal output wire [3:0]r, output wire [3:0]g, output wire [3:0]b, //SRAM inout wire [7:0]sram_data, output wire [18:0]sram_adr, output wire sram_wen, output wire sram_oen, output wire sram_csn ); wire w_clk_video; wire w_clk_cpu; wire w_locked; main_pll main_pll_inst( .CLKI(CLK50MHZ ), .CLKOP(w_clk_video ), .CLKOS(w_clk_cpu), .LOCK( w_locked) ); wire [31:0]counter; mico_cpu mico_cpu_inst( .clk_i(w_clk_cpu), .reset_n(w_locked), .sramsram_wen(sram_wen), .sramsram_data(sram_data), .sramsram_addr(sram_adr), .sramsram_csn(sram_csn), .sramsram_be(), .sramsram_oen(sram_oen), .gpioPIO_OUT(counter) ); display display_inst( .reset( ~w_locked ), .clk_video( w_clk_video ), .red_leds( counter[15:0] ), .green_leds( counter[15:0] ), .segments( counter[15:0] ), .hsync (hsync), .vsync (vsync), .r (r), .g (g), .b (b) ); endmodule
Компилируем наш проект:
Рис. 11: Синтезированный проект процессора LatticeMico32
Заливаем полученный битстрим в плату:
Рис. 12: Конфигурация платы VE-LCMXO27000HC
В принципе на этом этапе мы уже имеем работающий процессор! Но сам по себе он не представляет никакого интереса. Поэтому займемся созданием программы для нашего процессора. Для этого возвращаемся в Eclipse, переключаемся на вкладку C/C++ и выбираем File->New->Mico Managed Make C Project. Выбираем имя проекта led_test и в качестве шаблона применим LEDTest small size:
Рис. 13: Новый проект для LM32
В файле LEDTest_small_size.c меняем название порта GPIO с LED_BASE_ADDRESS на GPIO_BASE_ADDRESS. После этого наш код будет выглядеть следующим образом:
C++ Code:
/************************************************************** * This example exercises LEDs on LatticeMico32 Development * * board. * * * * The implementation in this file is targeted for a size * * smaller than the LEDTest template implementation. To * * achieve this, the default LatticeDDInit function is over- * * ridden by providing a DDInit.c in the project. * * * * Unlike LEDTest, f/printf functions are non-functional in * * LEDTest_small_size * * * * * *------------------------------------------------------------* * PREREQUISITES: * * * * - GPIO with 8-bit output named LED connected to the * * board's LED pins. * * * * - NOTE: IF YOU INTEND TO USE PRINTF, PLEASE MAKE CHANGES TO* * DDINIT.C * * * **************************************************************/ #include "MicoUtils.h" #include "system_conf.h" int main(void) { unsigned char iValue = 0x1; unsigned char iShiftLeft = 1; /* scroll the LEDs, every 100 msecs forever */ while(1) { /* update GPIO output */ *((volatile unsigned char*)(GPIO_BASE_ADDRESS)) = ~iValue; /* * sleep for approximately 100 msecs; * * NOTE: MicoSleepMilliSecs is not precise and * can fluctuate significantly for processor configurations * without caches */ MicoSleepMilliSecs(100); /* determine next value */ if (iShiftLeft == 1) { if (iValue == 0x80) { iShiftLeft = 0; iValue = 0x40; } else { iValue = iValue << 1; } } else { if (iValue == 0x01) { iShiftLeft = 1; iValue = 0x02; } else { iValue = iValue >> 1; } } } /* all done */ return(0); }
Выбираем Project->Build project:
Рис. 14: Результат компиляции
Осталось настроить отладку. Для этого выбираем Run->Debug configurations... В появившемся окне делаем двойной клик мышью на пункте mico32 hardware. Автоматически должна создаться конфигурация дебаггера:
Рис. 15: Настройка дебаггера
Жмем Debug! Если все настроено верно мы увидим окно отладки:
Рис. 16: Отладка проекта
Видео работы нашего процессора:
Проект дизайна микропроцессора LatticeMico32 для платы VE-LCMXO27000HC: mico_cpu.zip