МАРСОХОД

Open Source Hardware Project

Проекты Altera Quartus II для платы Марсоход2

Ваш первый проект на Nios II

nios2

Мне очень нравится проект Марсоход – это сообщество замечательных людей, увлеченных интересной темой. Оно состоит как из опытных разработчиков на ПЛИС, так и из начинающих, как профессиональных разработчиков, так и любителей. Кто-то шел по тернистому пути освоения программируемой логики сам, кого-то вели преподаватели в ВУЗе. Сам я отношусь ко второй категории, и считаю, что мне повезло: обучали меня схемотехнике и, в частности, ПЛИСам на кафедре автоматики и вычислительной техники (ныне компьютерных систем и программных технологий) Санкт-Петербургского Политеха, на базе которой создан официальный центр обучения 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 type

Для использования Nios II в конфигурациях standard и fast необходимо приобретение IP-ядра у Altera. В конфигурации economy процессор доступен бесплатно. Для первого знакомства и решения большинства задач нам его вполне достаточно. Я поставил перед собой задачу сделать максимально простую и легковесную систему.

Кроме различных конфигураций процессора, мы также располагаем большими возможностями в отладке:

nios debug

Зачастую аппаратные затраты на средства отладки сравнимы с аппаратными затратами на сам процессор, а порой их превышают. Что такое "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, выглядит она вот так:

altera qsys

Сразу видим блок типа Clock Source под названием clk_0, он транслирует внешний тактовый сигнал на блоки проектируемой системы, обеспечивая необходимый коэффициент ветвления (fanout) тактового сигнала. Также он транслирует внешний сигнал сброса. Под названием блока перечислены названия сигналов, под типом блока – их назначение. В графе Export отображается, выводится ли данный сигнал наружу и если да, то как он будет называться. В нашем случае наружу выводится вход тактовой частоты под именем clk и вход сброса под именем reset. В левом фрейме находятся разбитые по категориям IP-блоки, которые можно добавить в систему. Также можно создать свой блок (New Component) на основе HDL описания. Не все IP-блоки доступны для нашей ПЛИС, например, блок Hard Processor System мы можем использовать только в Cyclone V SoC и Arria V SoC. Для проекта нам понадобятся:

  1. процессор Nios II (Embedded Processors ? Nios II Processor);
  2. память, из которой будет исполняться программа; для этих целей вполне подойдет встроенная память ПЛИС (Memories and Memory Controllers ? On-Chip ? On-Chip Memory (RAM or ROM);
  3. блок параллельного ввода/вывода (PIO) для управления светодиодами (Peripherals ? Microcontroller Peripherals ? PIO (Parallel I/O).

Создадим процессор Nios II:

create nois

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

Создадим память команд и данных для нашего процессора:

add ram qsys

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

gpio in altera qsys

Мы добавили все компоненты в систему, и она выглядит так:

system

Займемся объединением компонентов, попутно устраняя кучу появившихся ошибок и предупреждений. Сперва подключим тактовый сигнал и сигнал сброса, порождаемые блоком 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".

Получившаяся система имеет следующий вид:

system final

Система почти что готова, осталось пробежаться по остальным вкладкам, сохранить систему и запустить процесс генерации. Важная вкладка 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):

eclipse

При попытке сделать 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-систему и подключим к ней выводы:

quartus prj

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

files

Файл 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". Рекомендую так делать, особенно если работа ведется с малознакомой платой: порой плата может быть сделана так, что подключение неиспользуемых выходов на землю может привести к печальным последствиям.

Скомпилировав проект, получим следующий отчет:

altera quartus report

Как видно из отчета, наша 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".

altera qsys options

Посмотрим, насколько сократился объем исполнимого кода теперь, после отключения этих трех опций.
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 для просмотра.

Комментарии  

+2 #44 igor434 03.09.2016 07:25
Уважаемый автор,подскажит е пожалуйста.где можно посмотреть описание библиотек,типа IOWR_ALTERA_AVA LON_PIO_DATA(PI O_0_BASE, leds);
не где не могу найти. в документе hal api про порты ввода вывода не слова???
Заранее спасибо!
+1 #43 Valio 27.04.2016 23:10
Здравствуйте.

Вопрос такой: возможно ли запустить одновременно 2 ядра NIOS на одном кристалле. Ядра и код - разные. Память разделяемая.
+1 #42 lytnev 06.09.2015 08:23
Добрый день.
Проект в моей плате (DVK601) заработал но если cоздаю заново workspace в HEX е вместо данных нули

:020000020000FC
:040000000041003487
:04000100084000149F
:040002000800683A50
:0400030000000000F9
:0400040000000000F8
...
:04007D00000000007F
:04007E00000000007E
:04007F00000000007D
:00000001FF

куда копать
+1 #41 bevice 10.03.2015 14:52
Soberboy, вы же не написали, что первый день. Я бы тогда посоветовал приобрести какой-нибудь опыт в отрыве от nios, например, пройтись по обязательной программе сначала для DOS
+1 #40 Soberboy 10.03.2015 14:38
bevice, не понимаю, если у Вас была такая же проблема, то почему нельзя в лоб написать как Вы ее решили?)
В лоб написать как решить вот это "int main(void) и int main(int, char**,char**) - разные функции, описана первая, линкуется вторая".
Возможно конечно мы вообще на разных языках говорим, и я сегодня первый день за С сел)
Книгу я со временем прочитаю, спасибо, но проект то хочется сегодня уже реализовать
+1 #39 bevice 10.03.2015 14:17
Soberboy, попробуйте сначала освоить программировани е на C/C++ для x86,
я имею ввиду, что SBT даже для вот этого простенького примера генерирует довольно большой проект, с десятками файлов, тысячей настроек. И без знания основ - будет очень сложно понять, что за косяк и где искать причину.
http://wm-help.net/lib/b/book/1357034433/ хотя бы
+1 #38 Soberboy 10.03.2015 14:07
bevice, так вот я и осваиваю) анлийский я знаю, фразу перевел, но мне это ничего не дало. И Вас я, к сожалению, тоже не понял.
На самом простом языке напишите пожалуйста, что мне нужно сделать)
Спасибо.
+1 #37 Soberboy 10.03.2015 14:00
Все вылечилось тем, что нажал Save All и только потом Build Project.
Глупо)
+1 #36 bevice 10.03.2015 13:59
Soberboy, при всем моем.. Перед тем, как скрещивать код с железом, неплохо бы хотя бы синтаксис кода освоить. Или хотя бы английский.
parameter name omitted - дословно - опущено имя параметра. Так можно делать в заголовках, но в реализации параметры должны быть названы.
+1 #35 Soberboy 10.03.2015 12:51
bevice, то есть в main.c надо было поменять int main () на int main(int, char**, char**)?
Поменял)
Теперь другие ошибки:
main.c:11: error: parameter name omitted
11 строчка это как раз int main(int, char**, char**)
+1 #34 bevice 10.03.2015 11:16
Soberboy, скорее всего, то же что было у меня -
int main(void) и int main(int, char**,char**) - разные функции, описана первая, линкуется вторая.
+1 #33 Soberboy 10.03.2015 10:11
Здравствуйте! Видимо такая же проблема при компиляции, как и у Pss2012.
Ошибка следующая:
D:\fpga_stuff\projects_quartus\marsohod\software\hello_nios_bsp/HAL/src/alt_main.c:154: undefined reference to `main'

Подскажете решение?
+1 #32 Pss2012 27.01.2015 20:05
Здравствуйте! Возникла проблема при компиляции. Перебрал уже кучу ресурсов., пока решения не нашел.
Вот какие ошибки выдает:
eclipse undefined reference to main
eclipse project dont gave an elf file
+2 #31 Dronchic 27.01.2015 12:07
Цитирую Pss2012:

Можете подсказать куда там вбивать код?
И как этот файл с кодом привязывать к самому проекту?
И да, я в этом деле совсем новичок...

Нужно добавить файл .c в проект (в левом фрейме нажимаем на проект правой кнопкой мыши, выбираем что-то типа Add source file). Собственно файл откроется в центральном фрейме и Вы сможете писать туда свой код.
+1 #30 Dronchic 27.01.2015 12:03
Цитирую xxx:
Здравствуйте. Возник вопрос. Я создал проект в QSYS. Там добавил ниос2, ончип_мемори, DDR2, PIO_IN, PIO_OUT и другие элементы. Сгенерировал все. Запустил в ниос эклипсе. Начал писать код на Си. Теперь не знаю как именно обратиться к выводам PIO, к самому ончип мемори. Кто знает подскажите на 1 примере с путем доступа к нему, т.е с какого файла и библиотеки взять


Прошу прощения, что так долго сюда не заглядывал.
Чтобы вывести что-то на PIO нужно осуществить запись по базовому адресу из адресного пространства данного блока системы-на-крис талле. Все адреса объявлены в файле system.h
PIO_0_BASE - базовый адрес блока PIO_0, т.е. наших светодиодов в данном примере. Но в статье вроде как все это написано.
Для того, чтобы записать по какому-то адресу в памяти, нужно добавить к базовому адресу памяти соответствующее смещение.
+1 #29 xxx 19.01.2015 07:52
Здравствуйте. Возник вопрос. Я создал проект в QSYS. Там добавил ниос2, ончип_мемори, DDR2, PIO_IN, PIO_OUT и другие элементы. Сгенерировал все. Запустил в ниос эклипсе. Начал писать код на Си. Теперь не знаю как именно обратиться к выводам PIO, к самому ончип мемори. Кто знает подскажите на 1 примере с путем доступа к нему, т.е с какого файла и библиотеки взять
-1 #28 Pss2012 17.01.2015 21:36
Цитирую Pss2012:
То есть я не то указал
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

Вот эти ошибки, чуть промазал с копированием


Все, разобрался, теперь возник еще один вопрос.
Я совсем не работал в Eclipse
Можете подсказать куда там вбивать код?
И как этот файл с кодом привязывать к самому проекту?
И да, я в этом деле совсем новичок...
+1 #27 Pss2012 17.01.2015 20:33
То есть я не то указал
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

Вот эти ошибки, чуть промазал с копированием
+1 #26 Pss2012 17.01.2015 20:31
А как вы избавились от ошибок
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.

Никак не разберусь)
+1 #25 Dronchic 03.12.2014 10:29
Вообще все, что хорошо распараллеливае тся лучше делать в аппаратуре, все, что плохо распаралелливае тся - лучше делать на процессоре. Если при этом процессор является частью системы-на-крис талле, Вы будете иметь выигрыш в скорости обмена процессора с аппаратными блоками, в габаритах устройства в энергопотреблен ии.
Пример задачи, которое хорошо распараллеливаю тся и решаются в железе: всяческое кодирование и шифрование. А вот аппаратный парсинг это как русский бунт: бессмысленный и беспощадный :) Пытался я как-то шутки ради аппаратно разбирать сообщения протокола NMEA от GPS-модуля... По той же причине аппаратная реализация TCP/IP особого смысла не имеет.
Если говорить о Nios II то он по производительно сти сравним с ARM Cortex-M3, M4. До производительно сти полноценных Application Processor-ов типа Cortex-A9 он конечно не дотягивает (ну тут на помощь приходят Cyclone/Arria V SoC), но с задачами парсинга, управления шиной, общения с пользователем и т.п. он успешно справляется
+1 #24 Dronchic 03.12.2014 10:10
Повторюсь: всё проектирование DSP начинается в Matlab/Simulink
Обозвал Embedded Coder C Coder-ом.
Идеальный вариант сводится к тому, что Вы сначала с использованием средств Simulink попрождаете имитационную модель вашего устройства, а затем с использованием HDL Coder/Embedded Coder генерируете и оптимизируете аппаратную/прог раммную реализацию, не влезая в HDL/C код.
Наличие Nios в вашем устройстве не в коем случае не ограничивает его возможности, а наоборот расширяет.
Если Вы внимательно прочитали мою писанину про Nios, то наверное обратили внимание, что там можно добавлять как свои полноценные устройства, реализующие аппаратно какие-то функции, так и дополнительные пользовательски е инструкции процессора, в которых используется аппаратное ускорение.
Кроме перечисленных средств Matlab есть еще у Altera свое средство DSP Builder, которое также интегрируется в Simulink.
У DSP Buildera-более узкий круг решаемых задач, как понятно из названия.
+1 #23 bevice 02.12.2014 21:17
Цитирую Alexey:
...операции с типом double и float, преобразование фурье и т.д. Без NIOS, как я понимаю, здесь не обойтись? и по сути придется писать код на СИ под этот самый NIOS, ибо на verilog это практически неподъемная задача (либо огромные временные затраты)??

Ну насчет фурье - все опять же наоборот - плис способна выполнить все преобразование на несколько тактов, дольше отсчеты собирать, чем преобразование выполнять. Насчет double и float - ну кто же мешает скнонфигугирова ть плис как числодробилку? Вы похоже не очень понимаете отличие FPGA от CPU. Если есть интересе - 2500 рублей за Cyclone III на этом сайте не сильно большая цена, чтобы прочувствовать все отличия.
Суть NIOSII на FPGA в том, что вы его конфигурируете под свои нужны и связываете его со своими блоками периферии. Нужно больше GPIO - пожалуйста, захотелось FFT в реалтайме считать - получите. Пока в размер влезает, конечно.
+1 #22 Alexey 02.12.2014 19:57
Спасибо за ответы! А как на счет сложных разветвленных алгоритмов и мат. обработки: операции с типом double и float, преобразование фурье и т.д. Без NIOS, как я понимаю, здесь не обойтись? и по сути придется писать код на СИ под этот самый NIOS, ибо на verilog это практически неподъемная задача (либо огромные временные затраты)???
+1 #21 bevice 01.12.2014 19:41
Цитирую Alexey:
[quote name="Dronchic"]Продолжая тему DSP/FPGA.
Спасибо за ответ! Хочу продолжить беседу! Андрей, ответьте, пожалуйста, на ряд вопросов! У меня есть предубеждение, что используя встроенный процессор(тот же NIOS) ПЛИС теряет все свои преимущества и в таком случае лучше использовать просто ARM процессор в чистом виде. Ваше мнение?

С точностью до наоборот: вы можете заточить софт-процессор под те функции, которые будите использовать, в хардварном чипе есть только то, что заложил производитель. Ну и на одной современной плисине помещается не только процессор, но и еще достаточно много любой периферии. Т.е. Получаем и то и другое и сразу и удобно. Это ведь лучше, чем выбор "или"?
+1 #20 Alexey 01.12.2014 19:23
[quote name="Dronchic" ]Продолжая тему DSP/FPGA.
Спасибо за ответ! Хочу продолжить беседу! Андрей, ответьте, пожалуйста, на ряд вопросов! У меня есть предубеждение, что используя встроенный процессор(тот же NIOS) ПЛИС теряет все свои преимущества и в таком случае лучше использовать просто ARM процессор в чистом виде. Ваше мнение? И еще: в случае сложных алгоритмов работы: вложенные циклы, ветвления, мат. обработка, насколько эффективны здесь ПЛИСы? Ведь всё это должно синтезироваться в реальную электрическую схему? Можно сказать, что в подобных случаях можно подключить NIOS, но ведь тогда можно и просто использовать какой-нибудь Cortex-M4 или серию TMS320...(очень производительны е DSP)? Не делает ли NIOS из ПЛИСины обычный контроллер (ничем не лучше и не хуже)?
0 #19 Dronchic 01.12.2014 14:49
Продолжая тему DSP/FPGA.
Решение задач цифровой обработки сигналов, неважно на FPGA или на DSP-процессоре сейчас начинается в Матлабе. Построив там математическую модель вы можете преобразовать ее в аппаратное устройство с помощью HDL-Coder, или в программу для DSP-процессора с помощью C-Coder. Там же можно оценить какой вам понадобится процессор или ПЛИС.
Также рекомендовал бы Вам посмотреть в сторону OpenCL https://ru.wikipedia.org/wiki/OpenCL
Altera поддерживает этот стандарт:
https://www.altera.com/products/design-software/embedded-software-developers/opencl/overview.html
Возможно Вам это будет интересно и полезно.
Успехов!
0 #18 Dronchic 01.12.2014 14:40
Цитирую Alexey:
Приветствую специалистов и любителей в области FPGA. Решил задать свой вопрос именно на этой теме.

Здравствуйте, Алексей.
Тут конечно кому что больше нравится, но определенно FPGA для этих задач подходит. Вопрос только какая именно FPGA, тут нужно четче сформулировать требования. Хотя бы о каких частотах идет речь. Применение FPGA позволит Вам довольно легко масштабировать Вашу задачу.
Абсолютная цена FPGA будет скорее всего выше, чем у подходящего Вам DSP-процессора, однако грамотное использование ПЛИСа, позволит Вам выжать из него гораздо больше. Итоговая производительно сть (и возможно энергопоторебле ние) будет лучше.
Насколько я понимаю, Ваша задача отлично распараллеливае тся: одновременно осуществляется большое количество простых вычислений. FPGA позволит вам реализовать не десятки вычислительных ядер, которые есть в DSP и GPU-процессорах , а сотни и даже тысячи.
0 #17 Alexey 27.11.2014 19:29
Приветствую специалистов и любителей в области FPGA. Решил задать свой вопрос именно на этой теме. Передо мной стоит такая задача. Есть некая следящая система, основной частью которой является CCD матрица, на которую фокуссируется лазерный луч, т.е имеем фокальное пятно. Данное пятно вследствие вибраций непрерывно и хаотично двигается по приемной матрице. Вопрос: Целесообразно ли использовать ПЛИС с целью обработки видео потока матрицы? Необходимо с очень высокой частотой следить за пятном: определять его энергетический центр, границы и производить вычисление над интенсивностью (показателем яркости на матрице в черно-белом формате от 0 до 255, т.е. о цветности (RGB) речи не идет). Или же целесообразней использовать DSP процессор? Буду очень благодарен за ответ, ибо стою на распутье между DSP и FPGA!
0 #16 Dronchic 29.09.2014 11:00
Цитирую WolfTheGrey:
Добрый день, неужели обязательно проделывать все эти манипуляции чтоб помигать светодиодами на ep4ce40 ??


Все конечно не нужно, я просто постарался рассмотреть различные интересные потенциально непонятные моменты. Понятно, что использовать процессор для мигания светодиодами - это гвозди микроскопом забивать, просто никак руки не доходят до полноценных проектов.

Цитирую WolfTheGrey:
файлов, наверное потому, что в: "просто сгенерируем HDL-описание (неважно VHDL или Verilog) и символ .bsf." у меня кнопка generate заблокирована.
Печалька :P

Не знаю даже что и сказать, у меня кнопка Generate не заблокирована даже для пустой Qsys-системы.
А какую версию Quartus II вы используете?
0 #15 WolfTheGrey 26.09.2014 11:05
Добрый день, неужели обязательно проделывать все эти манипуляции чтоб помигать светодиодами на ep4ce40 ??

Дело в том, что написал небольшой код на верилоге (помигать светодиодами), который проверенно работает на CPLD, а на данной fpga нет никакой реакции. Процессор прошивку схавывает и ничего не делает.

Теперь о статье: "Запустим прямо из Qsys IDE для программировани я под Nios II: Tools ? Nios II Software Build Tools for Eclipse."
Вот на этой части, я малость застопорился, не нашел: Targed Hardware information. У меня нет таких файлов, наверное потому, что в: "просто сгенерируем HDL-описание (неважно VHDL или Verilog) и символ .bsf." у меня кнопка generate заблокирована.
Печалька :P
0 #14 _andrey 05.09.2014 18:33
Пробовали раньше его использовать. Куча глюков, проблем.. отказались.
0 #13 Yuva 03.09.2014 10:52
Цитирую Dronchic:
Также нужно не забывать о спидгрейде микросхемы SDRAM. У микросхемы, установленной на плату Марсоход2 он -6

Здравствуйте! Еще раз спасибо за помощь. Hello word удалось запустить с SDRAM. Поменял тайминги. Только вот на моей SDRAM спидгрейд -75 указан. И не удалось PLL по pdf Вашему настроить, не разводится. Оставил задержку 3 нс. Еще, пробовал ЖК дисплей запустить с SDRAM, не получилось)) С on-chip memory все работает...
0 #12 Yuva 02.09.2014 10:27
Если Вы напишете такую статью, то это будет очень здорово! Спасибо за советы! Надеюсь успеть самостоятельно разобраться с sdram))
0 #11 Dronchic 02.09.2014 08:16
Также нужно не забывать о спидгрейде микросхемы SDRAM. У микросхемы, установленной на плату Марсоход2 он -6, насколько я понимаю маркировку микросхемы. По крайней мере на той плате, которая у меня (Спасибо, nckm!).
Опять же внимательно смотрим даташит и вводим правильные временные характеристики в Qsys.
http://akizukidenshi.com/download/ds/micron/64MSDRAM.pdf
0 #10 Dronchic 02.09.2014 07:51
Цитирую Yuva:
На 65% загрузки выдает ошибку.

Озадачили Вы меня. С ходу ничего не могу подсказать. Я ведь и сам, признаться, давно этим не занимался.
Давайте я сделаю проект, напишу статейку, и там подробно все распишу.
Единственное, хочу обратить Ваше внимание на то, что на плате Марсоход2 стоит MT48LC4M16A2, а не MT48LC4M32B2. Надо бы почитать даташиты на обе микросхемы, может они отличаются по временным характеристикам.
Вообще полезно читать даташиты на микросхемы :)
Например сколько циклов Latency следует поставить? Смещение в 3 нс... почему именно 3? Хорошо бы понимать. Я бы использовал режимы PLL, например Zero-Delay Buffer.
Пока что могу предложить почитать:
http://www.pldworld.com/_altera/html/_excalibur/nios-sdram-tuning/SDRAM_PLL_Tuning.pdf
http://www.alteraforum.com/forum/showthread.php?t=24650&GSA_pos=1&WT.oss_r=1&WT.oss=SDRAM_PLL_Tuning
0 #9 Yuva 01.09.2014 12:31
Далее генерю все, без ошибок.
Открываю Run Configuration. Под шабкой он пишет The expected Stdout device name does not match the selected target byte stream device name. Без ошибок. Загружаю. На 65% загрузки выдает ошибку. Elf файл не загрузился. Наверно где то косякнул. Могу прислать весь проект. Тока не знаю как)
0 #8 Yuva 01.09.2014 12:30
Цитирую Dronchic:

В общем масса встречных вопросов возникает :)

Так)) Надо было сразу более развернутый вопрос задать))
В общем, 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.
0 #7 Dronchic 29.08.2014 11:40
Цитирую Yuva:
Здравствуйте! Как sdram в качестве озу подключить к Nios? Замучился. ни как не получается

Здравствуйте.
Что именно не получается? На какой стадии? В Qsys используете компонент SDRAM Controller?
Для чего хотите использовать внешнюю память? И для команд и для данных?
Делали проект с нуля или добавляете SDRAM в проект под катом? Используете дебаггер? Без отладки как-то совсем тяжко делать проект с внешней памятью...
В общем масса встречных вопросов возникает :)

Обязательно сделаю проектик с внешней памятью и напишу об этом в обозримом будущем.
0 #6 Yuva 29.08.2014 05:19
Здравствуйте! Как sdram в качестве озу подключить к Nios? Замучился. ни как не получается
0 #5 Dronchic 25.08.2014 11:56
Цитирую bevice:
Да, повьравьте (или поясните)
у меня int main () - ругался, и хотел
int main(int, char**, char**)

Никогда не пользовался аргументами командной строки функции main для Nios, и никогда не возникало проблем с тем чтобы компилятор их требовал.
Честно говоря вообще никогда не сталкивался с тем чтобы компилятор ругался int main () без аргументов.
Можно void написать, но суть от этого не меняется.
Да и непонятно кто будет эти аргументы программе передавать, она же сама собой запускается, не из командной строки, не из bootloder-а
Попробуйте пройти еще раз по шагам...
А какой версией ПО вы пользуетесь?
0 #4 bevice 22.08.2014 22:06
Да, повьравьте (или поясните)
у меня int main () - ругался, и хотел
int main(int, char**, char**)
0 #3 Bevice 21.08.2014 17:02
О, спасибо!
Отлично запустилось на 2м циклоне
+1 #2 Dronchic 13.08.2014 10:56
Здорово! Для Марсохода переделывал его вслепую, опасался, что где-нибудь накосячу.
Автор - я, но опубликовано от имени моей фирмы.
замечания/пожелания/предложения приветствуются
0 #1 nckm 13.08.2014 10:31
попробовали ваш проект в плате Марсоход2 - работает!!!

Добавить комментарий


Защитный код
Обновить


GitHub YouTube Twitter
Вы здесь: Начало Проекты Проект Марсоход2 Ваш первый проект на Nios II