Весомым конкурентным преимуществом FPGA является возможность создания устройства на одном кристалле. Представьте только- вместо того что бы паять микроконтроллер, spi память, часы реального времени, счетчики событий и прочую перифирию, вы можете все это синтезировать внутри всего лишь одной микросхемы! Самая основная проблема этой идей- это реализация процессора. В этой статье мы покажем, как реализовать Soft-микропроцессор (также «микропроцессор с программным ядром») для FPGA Altera.
Компания Altera предлагает отличное решение для таких задач - процессор Nios II. Семейство softcore процессоров Nios® II - второе поколение встраиваемых процессоров фирмы Altera. Процессоры Nios II дают возможность разработчикам получить производительность свыше 200 Dmips при стоимости логики не более $0,35 на процессор. При трех типах процессоров и возможности выбора из более чем 60 дополнительных IP ядер, системы Nios II обеспечивают исключительную гибкость, позволяя разработчикам подбирать набор процессоров в наибольшей мере соответствующий потребностям встраиваемой системы.
Создаем новый проект для нашей платы. После создания проекта добавите схему (bdf) в проект. Когда все готово приступим к настройке Nios.
Открываем Qsys: Tools -- Osys.
В строку поиска вводим ram, находим пункт On-Chip Memory (RAM or ROM), выбираем его двойным кликом.
В окне настройки памяти изменяем пункт Total memory size c 4096 на 8192 байт. Пункт Enable non-default initialization file оставляем не выбранным. В принципе если у Вас есть готовая прошивка для Nios II вы можете инициализировать память на этом этапе, но если вы хотите иметь возможность отладки (а мы хотим такую возможность), нужно оставить память не инициализированной. Далее добавляем параллельный интерфейс, алгоритм точно такой-же: в поле поиска вводим pio.
Выбираем ширину порта 32 бит- Width (1-32 bits): 32. Направление выбираем Output. Для экспериментов нам хватит. Ну и напоследок добавляем сам процессор:
Версию процессора выберем самую простую Nios II/e. Далее настраиваем соединение наших блоков:
Все блоки необходимо объединить согласно схеме. В настройках процессора Nios II (Classic) Processor необходимо выбрать местоположение векторов сброса и исключений. В качестве местоположения выбираем нашу набортную память onchip_memory2_0.s1. Далее приступаем к генерации нашего Soft-микропроцессора:
В качестве языка синтеза и симуляции выбираем Verilog и жмем Generate. После чего наш проект сохраняется:
И генерируется:
Далее добавляем созданный нами soft-процессор- nios_cpu.qsys, а также известные уже нам модули hvsync_ex.v и pic_gen.v.
Как в проекте Частотомер с VGA выходом добавлем синтезатор частоты и модуль встроенной памяти для хранения изображения цифр. Создаем схему с нашим процессором и модулем вывода VGA изображения:
Пришло время создать программу для нашего процессора! Для этого в меню Пуск выбираем Nios II Software Build Tools for Eclipse и создаем новый проект- New->Nios II Application and BSP from Template:
В настройках выбираем SOPS Info файл из нашего проекта и выбираем создание пустого проекта (Blank Project):
Создадим файл main.c со следующим содержимым:
C++ Code:
/* /* * main.c * * Created on: 19 февр. 2016 г. * Author: Vise */ #include <stdio.h> #include "system.h" #include "altera_avalon_pio_regs.h" <br />//Структура для преобразования int to BCD typedef struct { char value[8]; } BCD_Number; <br />//Функция преобразования int to BCD BCD_Number bin2bcd(int bin_number) { BCD_Number bcd_number; int i; for(i = 0; i < sizeof(bcd_number.value); i++) { bcd_number.value[i] = bin_number % 10; bin_number /= 10; } return bcd_number; } <br />//Главная функция int main () { BCD_Number bcd_number; unsigned long port; unsigned int cnt=1; int i; while(1) //Бесконечный цикл { IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, port); //Записываем BCD число в порт for (i=0; i<(ALT_CPU_CPU_FREQ/5000); i++); //Задержка cnt = (cnt >= 0xFFFF) ? 1u : (cnt+1); //Счетчик bcd_number=bin2bcd(cnt); //Преобразуем в BCd и собираем обратно в 32 битное BCD представление port = bcd_number.value[7]<<28 | bcd_number.value[6]<<24 | bcd_number.value[5]<<20 | bcd_number.value[4]<<16 | bcd_number.value[3]<<12 | bcd_number.value[2]<<8 | bcd_number.value[1]<<4 | bcd_number.value[0]; } return 0; }
В принципе тут все просто: счетчик cnt считает от 1 до 65535, далее мы его преобразуем в BCD вид, и выводим в порт нашего процессора. Далее правой клавишей мыши на проекте nios_first_bsp [nios_cpu] выбираем пунк Nios II->Generate BSP:
На проекте nios_first выбираем Build Project и если мы хотим инициализировать нашу память, то выбираем Make targets->Build:
Осталось последнее, настроить отладку. Синтезируем прошивку ПЛИС. Прошиваем. Если инициализируем нашу память On-Chip Memory (RAM or ROM) *.hex файлом, то на мониторе увидим цифры нашего счетчика. Но мы собрались настроить отладку, приступим. Правой клавишей мыши по проекту nios_first и выбираем Debug As->Debug Gonfigurations. В появившемся окне делаем двойной клик левой клавишей мыши на пункте Nios II Hardware появится новая конфигурация дебагера. В списке Project Name выбираем наш проект nios_first:
На вкладке Target Connection выбираем Refresh Connections:
Нажимаем кнопку Debug, получаем предупреждение о переходе к виду eclipse в режиме отладки:
Нажимаем Yes и переходим в режим отладки нашего приложения:
Поздравляю! Мы создали свой soft-процессор. Ну и по традиции видео работы и исходные файлы:
Исходные файлы проекта Nios II: nios_II.zip