
Мне очень нравится проект Марсоход – это сообщество замечательных людей, увлеченных интересной темой. Оно состоит как из опытных разработчиков на ПЛИС, так и из начинающих, как профессиональных разработчиков, так и любителей. Кто-то шел по тернистому пути освоения программируемой логики сам, кого-то вели преподаватели в ВУЗе. Сам я отношусь ко второй категории, и считаю, что мне повезло: обучали меня схемотехнике и, в частности, ПЛИСам на кафедре автоматики и вычислительной техники (ныне компьютерных систем и программных технологий) Санкт-Петербургского Политеха, на базе которой создан официальный центр обучения Altera в России.
Не знаю, сознательно или нет, на сайте https://marsohod.org не затронута тема синтезируемого процессора Altera Nios II. Пробежавшись по темам на сайте, не обнаружил ни одного проекта на Nios II, зато нашел целую ветку, посвященную процессору Amber ARM. Считаю, что Nios незаслуженно обошли вниманием. Бытует мнение, что процессор Nios утратил свою актуальность, что в реальных проектах его никто не использует, что с появлением Altera SoC FPGA с аппаратным процессором ARM Nios исчезнет за ненадобностью и т.д. Сразу скажу, что слухи о его смерти несколько преувеличены, более того, недавно вышла новая ревизия процессора Nios II Gen 2, которая и будет развиваться, начиная с версии 14.0, однако в данном тексте речь пойдет исключительно о Nios II Gen 1.
В микросхемах Altera SoC FPGA (Cyclone V SoC, Arria V SoC, Arria 10 SoC) Nios II может быть использован как сопроцессор, выполняющий какие-то определенные функции (управление моторами, зарядом аккумуляторов, тачскрином и т.п) для того, чтобы разгрузить основное вычислительное ядро. Синтезируемый процессор Nios II в отличие от любого другого синтезируемого процессора замечателен тем, что он разработан фирмой Altera для ПЛИС фирмы Altera, соответственно позволяет получить наилучшее соотношение производительность/аппаратные затраты при реализации на Alter-овских ПЛИСах. Для связи процессора Nios II c остальными компонентами системы-на-кристалле Altera разработала собственную шину Avalon. Процесс создания системы осуществляется в среде системной интеграции Qsys.
Существуют три варианта конфигурации процессора: economy (/e), standard (/s) и fast (/f). На рисунке ниже приведены их особенности.
Для использования Nios II в конфигурациях standard и fast необходимо приобретение IP-ядра у Altera. В конфигурации economy процессор доступен бесплатно. Для первого знакомства и решения большинства задач нам его вполне достаточно. Я поставил перед собой задачу сделать максимально простую и легковесную систему.
Кроме различных конфигураций процессора, мы также располагаем большими возможностями в отладке:
Зачастую аппаратные затраты на средства отладки сравнимы с аппаратными затратами на сам процессор, а порой их превышают. Что такое "Hello World!" проект для embedded системы? Конечно же, это мигающие светодиоды. Ими мы и займемся, а для мигания светодиодами отладка не очень-то нужна, откажемся от нее в данном проекте и, таким образом, существенно упростим и облегчим систему.
Платы Марсоход2 у меня нет, есть Altera Cyclone III Starter Kit (на базе EP3C25F324C8). На ней также имеются четыре светодиода, которыми мы и будем мигать. Отличие в логической емкости для нас в данном случае несущественно. Чтобы добиться работоспособности на своей плате, все описанные в данном тексте шаги я привел для Altera Cyclone III Starter Kit, но для платы Марсоход2 они аналогичны. Окончательный проект я скомпилировал под EP3C10E144C8, назначив выводы в соответствии с разводкой платы Марсоход2. Разработка велась в Quartus II 13.0, версия 14.0, к сожалению, не поддерживает Cyclone III и Stratix III.
Итак перейдем к разработке, начнем с железа. В Quartus II создадим проект Marsohod_nios. Из Quartus II запускаем среду системной интеграции Qsys, выглядит она вот так:
Сразу видим блок типа Clock Source под названием clk_0, он транслирует внешний тактовый сигнал на блоки проектируемой системы, обеспечивая необходимый коэффициент ветвления (fanout) тактового сигнала. Также он транслирует внешний сигнал сброса. Под названием блока перечислены названия сигналов, под типом блока – их назначение. В графе Export отображается, выводится ли данный сигнал наружу и если да, то как он будет называться. В нашем случае наружу выводится вход тактовой частоты под именем clk и вход сброса под именем reset. В левом фрейме находятся разбитые по категориям IP-блоки, которые можно добавить в систему. Также можно создать свой блок (New Component) на основе HDL описания. Не все IP-блоки доступны для нашей ПЛИС, например, блок Hard Processor System мы можем использовать только в Cyclone V SoC и Arria V SoC. Для проекта нам понадобятся:
- процессор Nios II (Embedded Processors ? Nios II Processor);
- память, из которой будет исполняться программа; для этих целей вполне подойдет встроенная память ПЛИС (Memories and Memory Controllers ? On-Chip ? On-Chip Memory (RAM or ROM);
- блок параллельного ввода/вывода (PIO) для управления светодиодами (Peripherals ? Microcontroller Peripherals ? PIO (Parallel I/O).
Создадим процессор Nios II:

Выберем конфигурацию economy (Nios II/e). Замечу, что кроме логических элементов, сам процессор в любой конфигурации использует блоки внутренней памяти ПЛИС: Memory Usage (e.g Startix IV) - Two M9Ks (or equiv.). Поэтому не следует удивляться, когда компилятор Quartus II сообщит, что памяти использовано больше выделенного нами объема под команды и данные. Из оставшихся вкладок нас интересует только "JTAG Debug Module", так как в остальных вкладках находятся настройки для более продвинутых конфигураций процессора. В этой вкладке выберем No Debugger – обойдемся без отладчика в данном проекте. Внизу появятся ошибки и предупреждение. Ошибки связаны с тем, что процессору пока что еще неоткуда брать команды, а предупреждение напоминает нам о том, что у нас не будет возможности отлаживать наши программы. Нажмем кнопку Finish, увидим новые сообщения об ошибках связности, все они устранятся в процессе создания системы, так что бояться нечего.
Создадим память команд и данных для нашего процессора:

Так как мы пока что еще не знаем наверняка, сколько понадобится памяти для нашей программы, оставим значение по умолчанию: 4096 байт. Процессор 32-разрядный, соответственно ширина слова 32 бита. Поскольку нам нужна память и для команд, и для данных, она должна иметь тип RAM. Галочка "Initialize memory content" означает, что содержимое памяти будет инициализировано файлом .hex.
Создадим блок управления светодиодами – четырехразрядный порт, работающий на выход:

Мы добавили все компоненты в систему, и она выглядит так:
Займемся объединением компонентов, попутно устраняя кучу появившихся ошибок и предупреждений. Сперва подключим тактовый сигнал и сигнал сброса, порождаемые блоком clk_0, ко всем потребителям. Процесс объединения интуитивно понятен: нажимая на пустые кружочки подключаем тот или иной сигнал к тому или иному потребителю. Как я уже говорил, компоненты системы объединяются альтеровской шиной Avalon. Процессор на этой шине является ведущим (master), а память и блок PIO – ведомыми (slave). Процессор имеет отдельный интерфейс для команд (instruction_master), отдельный для данных (data_master). Объединим устройства шиной Avalon, также нажимая на кружочки: память onchip_memory2_0 подключим к обоим интерфейсам процессора, так как она является памятью и команд, и данных, а блок pio_0 к data_master. Кроме двух перечисленных Avalon-интерфейсов, процессор имеет третий интерфейс - custom_instruction_master - он предназначен для выполнения пользовательских аппаратно-ускоренных команд. Такая возможность – интересная и полезная особенность процессора Nios II. Теперь необходимо указать процессору, откуда ему выбирать команды, – вернемся в настройки процессора и смэппируем векторы сброса, исключения и останова (во вкладке JTAG Debug Module) в память on_chip_memory2_0. Теперь осталось устранить конфликты в адресном пространстве (System ? Assign Base Addresses), а также вывести наружу выходы PIO, нажмем в графе Export напротив external_connection, назовем их "leds".
Получившаяся система имеет следующий вид:

Система почти что готова, осталось пробежаться по остальным вкладкам, сохранить систему и запустить процесс генерации. Важная вкладка Clock Settings, в ней мы задаем входную тактовую частоту. На моей плате, в отличие от платы Марсоход2, она составляет 50 МГц. Кроме этой вкладки, тактовую частоту, а также настройки сигнала сброса, можно задать в окне редактирования блока Clock Source. Параметры системы можно проверить во вкладке System Inspector. Сохраним систему под названием "nios_basic.qsys", перейдем во вкладку Generation. В ней мы можем создать модель нашей системы для симуляции в ModelSim, а также тестбенч для нее, но в рамках данного проекта мы этого делать не будем, просто сгенерируем HDL-описание (неважно VHDL или Verilog) и символ .bsf.
Теперь отложим железо и займемся софтом. Запустим прямо из Qsys IDE для программирования под Nios II: Tools ? Nios II Software Build Tools for Eclipse. Создадим workspace. Я его поместил в \Marsohod_nios\software. Создадим проект "Nios II Application and BSP from Template". BSP (Board Support Package) – это набор драйверов и библиотек для нашей аппаратной системы. IDE создает его автоматически, извлекая информацию из файла "nios_basic.sopcinfo", который генерируется Qsys-ом одновременно с HDL-описанием системы. Укажем этот файл в поле "Target hardware information", введем имя проекта "hello_nios", выберем тип проекта "Blank Project". В результате, имеем два проекта в нашем workspace: hello_nios и hello_nios_bsp. Теперь необходимо запустить автоматическую генерацию нашего BSP: Правой кнопкой мыши нажимаем на проект hello_nios_bsp, Nios II ? Generate BSP. Теперь напишем наш код, он занимает всего несколько строк:
#include "system.h"
#include "altera_avalon_pio_regs.h"
int main ()
{
char leds = 0x1;
int i = 0;
while(1)
{
IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, leds);
for (i=0; i<(ALT_CPU_CPU_FREQ/500); i++); // Delay
// Johnson code counter on leds
leds = ((leds<<1) & 0xE) | (!(leds>>3) & 0x1);
}
return 0;
}
Будем выводить на светодиоды счетчик Джонсона, мне нравится код Джонсона, он имеет большое значение в информатике и схемотехнике и на светодиодах выглядит красиво: четырехразрядное слово заполняется сначала единицами, затем нулями и т.д. Создавая систему, мы не добавили в нее таймеров, но для мигания светодиодами они и не нужны. Используем программную задержку, реализованную циклом for. Величина задержки получена эмпирически и зависит, в первую очередь, от тактовой частоты системы (ALT_CPU_CPU_FREQ). Макроопределение PIO_0_BASE соответствует базовому адресу блока PIO, запись по нему приводит к записи в порт. В файле system.h содержится основная информация о процессоре и периферийных блоках, в том числе определены ALT_CPU_CPU_FREQ и PIO_0_BASE. Файл altera_avalon_pio_regs.h является библиотечным файлом для работы с периферийным блоком параллельного ввода/вывода.
Общий вид программного проекта в Nios II Software Build Tools (SBT):

При попытке сделать Build проекта (одновременно с проектом осуществляется Build BSP) обнаруживаем сообщения об ошибке: полученный .elf-файл не помещается в выделенные нами 4 килобайта памяти. Для начала пойдем по самому простому пути – увеличим объем памяти до 8 килобайт – вернемся в Qsys, откроем настройки блока onchip_memory2_0 и зададим в поле "Total memory size" размер 8192. Переназначим базовые адреса, сгенерируем систему заново. Вернемся в Nios II SBT, снова сгенерируем BSP и запустим build проекта. На этот раз он прошел успешно, в результате имеем:
Info: (hello_nios.elf) 4304 Bytes program size (code + initialized data).
Info: 2408 Bytes free for stack + heap.
Оставшиеся 1480 байт используются системой для служебных целей. Теперь нам необходимо сгенерировать из .elf-файла .hex-файл, который будет использован для инициализации нашей памяти onchip_memory2_0. Эту задачу решает утилита elf2hex, проще всего ее запустить следующим образом: правой кнопкой мыши на проект, Make Targets ? Build... В окне Make Targets выбираем mem_init_generate. В результате, в проекте появляется папка mem_init, в которой, в числе прочих, есть нужный нам файл nios_basic_onchip_memory2_0.hex.
Переходим к созданию проекта в Quartus II. Добавим в проект нашу Nios-систему и подключим к ней выводы:

Выходы leds проинвертированы для удобства управления: на моей плате горящему светодиоду соответствует логический ноль, так как светодиоды объединены по схеме с общим анодом. На плате Марсоход2 светодиоды объединены по схеме с общим катодом и инверсия не нужна. Ниже представлен список файлов входящих в проект:

Файл Marsohod_nios.bdf – модуль верхнего уровня, файл nios_basic.qip – скриптовый IP Variation файл, обеспечивающий подключение всех необходимых файлов исходного описания IP-ядра, в нашем случае – Nios-системы. Файл Marsohod_nios.sdc не является обязательным, но без него TimeQuest Timing Analyzer выдает массу критических предупреждений, которые не влияют на работоспособность системы, однако портят впечатление о проекте. Данный файл содержит лишь информацию о входном тактовом сигнале clk, никаких других временных характеристик задавать для нашего проекта не нужно. Altera предлагает хитрые способы включения сгенерированного .hex-файла в квартусовский проект с использованием .qip файла, однако мне самым простым видится его копирование в папку проекта, при этом его можно добавлять в список файлов проекта, а можно и не добавлять, компилятор его в любом случае подхватит. Назначаем выводы ПЛИС: clk – тактовый сигнал с генератора, reset – кнопка, leds[3..0] – светодиоды. Конфигурируем неиспользуемые выводы "As input tri-stated with weak pull-up". Рекомендую так делать, особенно если работа ведется с малознакомой платой: порой плата может быть сделана так, что подключение неиспользуемых выходов на землю может привести к печальным последствиям.
Скомпилировав проект, получим следующий отчет:

Как видно из отчета, наша Nios-система в минимальной конфигурации заняла всего 708 логических элементов. Памяти задействовано 66 Кбит: 64 Кбит – память программ и 2 Кбит под нужды процессора. Также получаем довольно странное предупреждение:
Warning (113015): Width of data items in "nios_basic_onchip_memory2_0.hex" is greater than the memory width. Wrapping data items to subsequent addresses.
Сначала попробуем сконфигурировать ПЛИС, не обращая внимания на это предупреждение. Все получилось: светодиоды бегают, а кнопка, которую мы назначили на вход сброса, их гасит.
Теперь попробуем разобраться, что же это за предупреждение мы получили. В нем говорится о том, что ширина слов данных в нашем .hex файле больше, чем разрядность памяти, т.е. больше 32 разрядов, и что компилятор эти слова разбивает на кратное количество 32-разрядных. В результате, в память попадают все данные правильно, иначе бы ничего не заработало, однако почему же ширина слов не совпадает? Посмотрим файл nios_basic_onchip_memory2_0.hex в Nios II SBT. Все строки в нем, кроме первой и последней, имеют длину 74 символа (не считая двоеточия в начале). Строка .hex файла имеет следующий формат:
|
0..5 |
6..7 |
8..71 |
72..73 |
|
Адрес в памяти |
00 |
Данные |
Контрольная сумма |
При этом мы видим, что адрес в каждой следующей строке, больше, чем в предыдущей на 8, т.е. в каждой строке 8 32-разрядных слов (32 байта). Такое количество слов данных задано по умолчанию в утилите elf2hex. Компилятору Quartus II нужно, чтобы в каждой строчке было одно 32-разрядное слово, и адрес в каждой следующей строчке был больше, чем в предыдущей на 1. Когда мы генерируем .hex-файл, Nios II SBT запускает make-файл mem_init.mk, который в свою очередь запускает необходимую утилиту с нужными аргументами, в нашем случае это elf2hex. Для того, чтобы получить .hex-файл в подходящем квартусу формате, нам необходимо добавить аргумент командной строки "--record=4", означающий, что в одной строке 4 байта данных. По умолчанию он имеет значение 0x20, т.е. 32 байта. Найдем строчку, описывающую дополнительные аргументы командной строки для утилиты elf2hex:
elf2hex_extra_args = $(mem_no_zero_fill_flag)
И допишем туда необходимый аргумент:
elf2hex_extra_args = $(mem_no_zero_fill_flag) --record=4
Теперь удалим имеющийся .hex-файл и заново создадим его. В результате получаем файл такого формата, который требуется. Кладем файл в папку с проектом Marsohod_nios, перекомпилируем его в Quartus II. Теперь эти предупреждения не появляются.
На этом можно было бы и остановиться, однако то, что наша программа для мигания светодиодами занимает 8 килобайт памяти, никуда не годится. Постараемся максимально сократить размер исполнимого когда, для этого обратимся к настройкам BSP: правой кнопкой мыши на hello_nios_bsp, Nios II ? BSP Editor... В правой части окна видим всевозможные настройки BSP. Поскольку наша программа написана на чистом C, поддержка C++ нам не нужна – смело снимаем галочку "enable_c_plus_plus". Светодиоды бегают в бесконечном цикле, программа никогда не выходит, соответственно можно снять галочки "enable_clean_exit" и "enable_exit".
Посмотрим, насколько сократился объем исполнимого кода теперь, после отключения этих трех опций.
Info: (hello_nios.elf) 696 Bytes program size (code + initialized data).
Info: 7496 Bytes free for stack + heap.
Как видим, существенно сократился – более чем в 6 раз. Сумма размера программы и оставшегося свободного пространства нам дает 8192, т.е. больше не используется никаких зарезервированных областей памяти, и 696 байт – это реальный объем используемой памяти. Наибольший вклад в использование памяти вносит опция "enable_exit", так что если в ней нет необходимости, рекомендую ее отключать. Постараемся еще уменьшить размер программы и поместить ее в 512 байт. Опции "enable_lightweight_device_driver_api", "enable_reduced_device_drivers", "enable_small_c_library" в общем случае могут сократить объем исполнимого кода, но не в нашем, так как наш примитивный проект сам по себе не использует библиотеки, размер которых позволяют сократить эти опции. Опция "enable_sopc_sysid_check" в нашем случае неактуальна, так как мы не добавляли в аппаратную систему блок System ID, присваивающий уникальный идентификатор системе. Этот идентификатор может проверяться софтом, для защиты от подделки или каких-либо других целей.
Основные опции, позволяющие сократить объем исполнимого кода, мы просмотрели, и из очевидного остаются только уровни оптимизации компилятора для BSP (bsp_cflags_optimization). По умолчанию стоит -O0, поставим -O2 и посмотрим, что будет.
Info: (hello_nios.elf) 504 Bytes program size (code + initialized data).
Info: 7688 Bytes free for stack + heap.
Теперь наш код помещается в 512 байт. Однако оптимизацию, как известно, следует использовать с большой осторожностью. Например, попытка оптимизации самого проекта ни к чему хорошему не приведет: компилятор уберет за ненадобностью цикл for, который формирует нам задержку, и все светодиоды будут гореть постоянно. В нашем случае оптимизация BSP позволила сократить объем исполнимого кода и не повлияла на работоспособность программы. Теперь можно установить размер памяти равным 512 байт, пересобрать проект и сконфигурировать ПЛИС. В итоге, имеем законченный работоспособный проект, требующий минимум ресурсов.
Данный проект дает лишь общее представление о том, что такое Nios II и как с ним работать: примитивная программа на примитивном железе. Для создания реальных проектов на базе Nios-систем необходимо глубже разбираться в архитектуре процессора и его возможностях: отладка программ и аппаратное ускорение инструкций, обработка прерываний и работа по DMA, работа с внешней памятью и работа под ОС. Всему этому и многому другому можно научиться на курсах в официальном центре обучения Altera.
Исходники проекта Вы можете скачать на сайте официального дистрибьютора Altera - компании “ЭФО”.
Надеюсь, данная статья будет интересна пользователям Марсохода. Успехов в освоении ПЛИСов!
С уважением, Андрей Антонов, компания “ЭФО”
E-mail: Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.





Если эти макросы- универсальные, т.е. можно их использовать и для регистра control JTAG UART, то вполне, я раньше думал они (IOWR_...SET_BI T S()) для портов ввода/вывода
Чем не нравится IOWR_...SET_BIT S() и IOWR_..._CLEAR_ BITS()?
У AVR это можно было сделать накладывая маску, в NIOS обращение к регистрам идет с помощью макросов IORD(...), IOWR(...), т.е. способ в "лоб" это:
1-завести переменную в 32 бита (temp)
2-провести IORD(...) регистра control в переменную temp
3-провести IOWR(...) переменной temp с маской в регистр control
Есть ли более быстрый способ устанавливать биты отдельно? Я уже листал юзер гайды и мануалы, но почему-то примеров на C так и не нашел sad.gif
А что компилятор в программу (в бинарник) напихал, что она так много весит? Неужели это таблица векторов прерываний и прочие обработчики исключений?
И где\чем это можно посмотреть?
не где не могу найти. в документе hal api про порты ввода вывода не слова???
Заранее спасибо!
Вопрос такой: возможно ли запустить одновременно 2 ядра NIOS на одном кристалле. Ядра и код - разные. Память разделяемая.
Проект в моей плате (DVK601) заработал но если cоздаю заново workspace в HEX е вместо данных нули
:020000020000FC
:040000000041003487
:04000100084000149F
:040002000800683A50
:0400030000000000F9
:0400040000000000F8
...
:04007D00000000007F
:04007E00000000007E
:04007F00000000007D
:00000001FF
куда копать
В лоб написать как решить вот это "int main(void) и int main(int, char**,char**) - разные функции, описана первая, линкуется вторая".
Возможно конечно мы вообще на разных языках говорим, и я сегодня первый день за С сел)
Книгу я со временем прочитаю, спасибо, но проект то хочется сегодня уже реализовать
я имею ввиду, что SBT даже для вот этого простенького примера генерирует довольно большой проект, с десятками файлов, тысячей настроек. И без знания основ - будет очень сложно понять, что за косяк и где искать причину.
wm-help.net/.../1357034433 хотя бы
На самом простом языке напишите пожалуйста, что мне нужно сделать)
Спасибо.
Глупо)
parameter name omitted - дословно - опущено имя параметра. Так можно делать в заголовках, но в реализации параметры должны быть названы.
Поменял)
Теперь другие ошибки:
main.c:11: error: parameter name omitted
11 строчка это как раз int main(int, char**, char**)
int main(void) и int main(int, char**,char**) - разные функции, описана первая, линкуется вторая.
Ошибка следующая:
D:\fpga_stuff\projects_quartus\marsohod\software\hello_nios_bsp/HAL/src/alt_main.c:154: undefined reference to `main'
Подскажете решение?
Вот какие ошибки выдает:
eclipse undefined reference to main
eclipse project dont gave an elf file
Нужно добавить файл .c в проект (в левом фрейме нажимаем на проект правой кнопкой мыши, выбираем что-то типа Add source file). Собственно файл откроется в центральном фрейме и Вы сможете писать туда свой код.
Прошу прощения, что так долго сюда не заглядывал.
Чтобы вывести что-то на PIO нужно осуществить запись по базовому адресу из адресного пространства данного блока системы-на-крис талле. Все адреса объявлены в файле system.h
PIO_0_BASE - базовый адрес блока PIO_0, т.е. наших светодиодов в данном примере. Но в статье вроде как все это написано.
Для того, чтобы записать по какому-то адресу в памяти, нужно добавить к базовому адресу памяти соответствующее смещение.
Все, разобрался, теперь возник еще один вопрос.
Я совсем не работал в Eclipse
Можете подсказать куда там вбивать код?
И как этот файл с кодом привязывать к самому проекту?
И да, я в этом деле совсем новичок...
Error: Led.nios2_qsys_ 0: Reset slave is not specified. Please select the reset slave
Error: Led.nios2_qsys_ 0: Exception slave is not specified. Please select the exception slave
Вот эти ошибки, чуть промазал с копированием
Info: Led.nios2_qsys_ 0: Please note that for early evaluation, preview versions of new Nios II Gen2 Processors are available with this release.
Info: Led.nios2_qsys_ 0: Please note that for early evaluation, preview versions of new Nios II Gen2 Processors are available with this release.
Никак не разберусь)
Пример задачи, которое хорошо распараллеливаю тся и решаются в железе: всяческое кодирование и шифрование. А вот аппаратный парсинг это как русский бунт: бессмысленный и беспощадный :) Пытался я как-то шутки ради аппаратно разбирать сообщения протокола NMEA от GPS-модуля... По той же причине аппаратная реализация TCP/IP особого смысла не имеет.
Если говорить о Nios II то он по производительно сти сравним с ARM Cortex-M3, M4. До производительно сти полноценных Application Processor-ов типа Cortex-A9 он конечно не дотягивает (ну тут на помощь приходят Cyclone/Arria V SoC), но с задачами парсинга, управления шиной, общения с пользователем и т.п. он успешно справляется
Обозвал Embedded Coder C Coder-ом.
Идеальный вариант сводится к тому, что Вы сначала с использованием средств Simulink попрождаете имитационную модель вашего устройства, а затем с использованием HDL Coder/Embedded Coder генерируете и оптимизируете аппаратную/прог раммную реализацию, не влезая в HDL/C код.
Наличие Nios в вашем устройстве не в коем случае не ограничивает его возможности, а наоборот расширяет.
Если Вы внимательно прочитали мою писанину про Nios, то наверное обратили внимание, что там можно добавлять как свои полноценные устройства, реализующие аппаратно какие-то функции, так и дополнительные пользовательски е инструкции процессора, в которых используется аппаратное ускорение.
Кроме перечисленных средств Matlab есть еще у Altera свое средство DSP Builder, которое также интегрируется в Simulink.
У DSP Buildera-более узкий круг решаемых задач, как понятно из названия.
Ну насчет фурье - все опять же наоборот - плис способна выполнить все преобразование на несколько тактов, дольше отсчеты собирать, чем преобразование выполнять. Насчет double и float - ну кто же мешает скнонфигугирова ть плис как числодробилку? Вы похоже не очень понимаете отличие FPGA от CPU. Если есть интересе - 2500 рублей за Cyclone III на этом сайте не сильно большая цена, чтобы прочувствовать все отличия.
Суть NIOSII на FPGA в том, что вы его конфигурируете под свои нужны и связываете его со своими блоками периферии. Нужно больше GPIO - пожалуйста, захотелось FFT в реалтайме считать - получите. Пока в размер влезает, конечно.
С точностью до наоборот: вы можете заточить софт-процессор под те функции, которые будите использовать, в хардварном чипе есть только то, что заложил производитель. Ну и на одной современной плисине помещается не только процессор, но и еще достаточно много любой периферии. Т.е. Получаем и то и другое и сразу и удобно. Это ведь лучше, чем выбор "или"?
Спасибо за ответ! Хочу продолжить беседу! Андрей, ответьте, пожалуйста, на ряд вопросов! У меня есть предубеждение, что используя встроенный процессор(тот же NIOS) ПЛИС теряет все свои преимущества и в таком случае лучше использовать просто ARM процессор в чистом виде. Ваше мнение? И еще: в случае сложных алгоритмов работы: вложенные циклы, ветвления, мат. обработка, насколько эффективны здесь ПЛИСы? Ведь всё это должно синтезироваться в реальную электрическую схему? Можно сказать, что в подобных случаях можно подключить NIOS, но ведь тогда можно и просто использовать какой-нибудь Cortex-M4 или серию TMS320...(очень производительны е DSP)? Не делает ли NIOS из ПЛИСины обычный контроллер (ничем не лучше и не хуже)?
Решение задач цифровой обработки сигналов, неважно на FPGA или на DSP-процессоре сейчас начинается в Матлабе. Построив там математическую модель вы можете преобразовать ее в аппаратное устройство с помощью HDL-Coder, или в программу для DSP-процессора с помощью C-Coder. Там же можно оценить какой вам понадобится процессор или ПЛИС.
Также рекомендовал бы Вам посмотреть в сторону OpenCL ru.wikipedia.org/wiki/OpenCL
Altera поддерживает этот стандарт:
altera.com/.../overview.html
Возможно Вам это будет интересно и полезно.
Успехов!
Здравствуйте, Алексей.
Тут конечно кому что больше нравится, но определенно FPGA для этих задач подходит. Вопрос только какая именно FPGA, тут нужно четче сформулировать требования. Хотя бы о каких частотах идет речь. Применение FPGA позволит Вам довольно легко масштабировать Вашу задачу.
Абсолютная цена FPGA будет скорее всего выше, чем у подходящего Вам DSP-процессора, однако грамотное использование ПЛИСа, позволит Вам выжать из него гораздо больше. Итоговая производительно сть (и возможно энергопоторебле ние) будет лучше.
Насколько я понимаю, Ваша задача отлично распараллеливае тся: одновременно осуществляется большое количество простых вычислений. FPGA позволит вам реализовать не десятки вычислительных ядер, которые есть в DSP и GPU-процессорах , а сотни и даже тысячи.
Все конечно не нужно, я просто постарался рассмотреть различные интересные потенциально непонятные моменты. Понятно, что использовать процессор для мигания светодиодами - это гвозди микроскопом забивать, просто никак руки не доходят до полноценных проектов.
Цитирую WolfTheGrey:
Не знаю даже что и сказать, у меня кнопка Generate не заблокирована даже для пустой Qsys-системы.
А какую версию Quartus II вы используете?
Дело в том, что написал небольшой код на верилоге (помигать светодиодами), который проверенно работает на CPLD, а на данной fpga нет никакой реакции. Процессор прошивку схавывает и ничего не делает.
Теперь о статье: "Запустим прямо из Qsys IDE для программировани я под Nios II: Tools ? Nios II Software Build Tools for Eclipse."
Вот на этой части, я малость застопорился, не нашел: Targed Hardware information. У меня нет таких файлов, наверное потому, что в: "просто сгенерируем HDL-описание (неважно VHDL или Verilog) и символ .bsf." у меня кнопка generate заблокирована.
Печалька :P
Здравствуйте! Еще раз спасибо за помощь. Hello word удалось запустить с SDRAM. Поменял тайминги. Только вот на моей SDRAM спидгрейд -75 указан. И не удалось PLL по pdf Вашему настроить, не разводится. Оставил задержку 3 нс. Еще, пробовал ЖК дисплей запустить с SDRAM, не получилось)) С on-chip memory все работает...
Опять же внимательно смотрим даташит и вводим правильные временные характеристики в Qsys.
akizukidenshi.com/.../...
Озадачили Вы меня. С ходу ничего не могу подсказать. Я ведь и сам, признаться, давно этим не занимался.
Давайте я сделаю проект, напишу статейку, и там подробно все распишу.
Единственное, хочу обратить Ваше внимание на то, что на плате Марсоход2 стоит MT48LC4M16A2, а не MT48LC4M32B2. Надо бы почитать даташиты на обе микросхемы, может они отличаются по временным характеристикам.
Вообще полезно читать даташиты на микросхемы :)
Например сколько циклов Latency следует поставить? Смещение в 3 нс... почему именно 3? Хорошо бы понимать. Я бы использовал режимы PLL, например Zero-Delay Buffer.
Пока что могу предложить почитать:
pldworld.com/.../...
alteraforum.com/.../...
Открываю Run Configuration. Под шабкой он пишет The expected Stdout device name does not match the selected target byte stream device name. Без ошибок. Загружаю. На 65% загрузки выдает ошибку. Elf файл не загрузился. Наверно где то косякнул. Могу прислать весь проект. Тока не знаю как)
Так)) Надо было сразу более развернутый вопрос задать))
В общем, SDRAM хочу использовать для хранения команд и данных, как ОЗУ. SDRAM контроллер использую. Как настраиваю его:
1)Выбираю MT48LC4M32B2
2)Data Width 16
3)Chip select 1
4)Banks 4
5)Row 12
6)Column 8
7)И усё
Тактовую частоту для SDRAM задаю со смещением в 3 нс от системной частоты(не знаю зачем так делается, увидел эту в одной зарубежной лабе). Распиновку уже 100500 раз проверил. Далее BSP:
Settings->Common->hal.linker-> в двух местах указываю sdram; Вкладка linker script -> Linker Section Name -> везде кроме .entry указываю sdram.
Здравствуйте.
Что именно не получается? На какой стадии? В Qsys используете компонент SDRAM Controller?
Для чего хотите использовать внешнюю память? И для команд и для данных?
Делали проект с нуля или добавляете SDRAM в проект под катом? Используете дебаггер? Без отладки как-то совсем тяжко делать проект с внешней памятью...
В общем масса встречных вопросов возникает :)
Обязательно сделаю проектик с внешней памятью и напишу об этом в обозримом будущем.
Никогда не пользовался аргументами командной строки функции main для Nios, и никогда не возникало проблем с тем чтобы компилятор их требовал.
Честно говоря вообще никогда не сталкивался с тем чтобы компилятор ругался int main () без аргументов.
Можно void написать, но суть от этого не меняется.
Да и непонятно кто будет эти аргументы программе передавать, она же сама собой запускается, не из командной строки, не из bootloder-а
Попробуйте пройти еще раз по шагам...
А какой версией ПО вы пользуетесь?
у меня int main () - ругался, и хотел
int main(int, char**, char**)
Отлично запустилось на 2м циклоне
Автор - я, но опубликовано от имени моей фирмы.
замечания/пожелания/предложения приветствуются