Altera Nios II QiuckStart. Осваиваем принципы построения системы и инфраструктуру сборки.

Общались на днях с товарищами на тему одного проекта и так, между делом, было брошено замечание, в стиле «а если сюда поставить ПЛИС и контроллер, то вообще всё круто будет», на что сразу последовал вопрос «а нафига плодить сущности? зачем столько мозгов в системе — контроллер ведь можно воткнуть внутрь ПЛИС, например взять Nios?». Ответ был в стиле «а ты пробовал? я пробовал завести Nios, кучу времени убил, результата не получил — это большой гемор и всё равно требует лишней обвязки (память, епром...) которые уже есть в контроллере». Естественно такое заявление подействовало на порядки лучше любого «а слабо?!» и я засел за освоение мат. части. Как оказалось, информации по теме дофига и больше (в списке ссылок только малая часть того, чем я пользовался, а сколько всего я даже не смотрел...), но она вся какая-то разрозненная, везде освещается какая-то часть процесса, а как собрать это всё воедино и вникнуть в концепцию понять с лёту не так-то просто. В общем на то, что бы запустить первую работающую программу ушло примерно два дня (правда надо сделать скидку на то, что я параллельно конспектировал действия). А результатом моих колупаний является эта вводная в процесс проектирования систем на базе FPGA фирмы Altera с использованием процессорного ядра Nios II.


1. Введение


Nios II — это программный 32-разрядный процессор, оптимизированный для реализации в FPGA производства компании Altera. Процессор построен по архитектуре RISC, имеет 32-х разрядные шины данных и адреса, 32 регистра общего назначения и 32 источника внешних прерываний. Кроме того есть возможность определить до 256 собственных инструкций процессора, что является принципиальным отличием софт процессоров от обычных (число базовых инструкций что-то я нигде не видел, возможно потому что оно тоже варьируется в зависимости от конкретной сборки). Эти кастомные инструкции вызываются из C кода с помощью автоматически сгенерированных макросов, что позволяет не морочиться с ассемблерными вставками, а просто «обращаться к нужной функции процессора», причём без каких-либо накладных расходов. В библиотеке заранее присутствует несколько кастомных инструкций (например, математика с плавающей точкой), которые можно подключить при настройке ядра. К, собственно, процессорному ядру существует куча блоков обвязки, называемые Intellectual Property cores (IP cores). В число таких блоков входят таймеры (кстати, не забываем, что благодаря PLL мы можем настроить таймеры практически на любую частоту), контроллеры памяти, интерфейсы (UART, SPI и тд.).
Структура типовой системы
Правда, всё это хозяйство немножко платное, но есть триал — полнофункциональный, но с какими-то хитрыми временнЫми ограничениями (девайс должен быть подключен к компу через JTAG, иначе он будет работать ограниченное время, а потом отрубаться — такое вот фирменное западло). Согласно условиям предоставления триала, лицензию на это добро необходимо приобрести перед тем, как начать поставки изделия, так что считаем, что для поиграться и для проектирования девайсов, не требующих продолжительной автономной работы и предназначенных для домашнего или внутреннего применения, халявно.
Отдельно стоит упомянуть об одной интересной фишке — C-to-Hardware (C2H) Acceleration Compiller. C2H — это утилита, позволяющая часть ресурсоёмкого программного кода конвертировать в аппаратный блок, описанный на VHDL, или Verilog HDL и встроить его внутрь процессора Nios II. При этом утилита рассчитана чисто на программистов, так что знания HDL`ов от пользователя не требуется: нажал кнопочку — получил профит. Хотя, конечно, желательно понимание того, что можно соптимизировать таким образом, а что не очень, и как это лучше описать на C, что бы акселератор сгенерил код по-эффективнее. Да, условия использования те же — можно считать, что для нас бесплатно.

Для работы с Nios II требуется плата с установленной FPGA фирмы Altera (подходят любые FPGA, а вот с CPLD проблемы...), питальником, кварцем и разъёмом JTAG. Желательно, что бы там ещё была конфигурационная флешка, внешняя оперативка и пачка всякой переферии, которой можно поуправлять. Так же нам потребуется программатор, например USB Blaster. На компе должны стоять системы Quartus II и Nios II EDS (он же Eclipse с альтеровскими модами). Для отладки ещё пригодится ModelSim, но мы эту тему затрагивать не будем.
Инструментарий для разработки SoPC

Создание прошивки FPGA для устройства с использованием Nios II делится на две части — описание железа и описание софта. Начнём с первой.

2. «Аппаратная» часть


Сначала надо создать в Quartus`е новый проект и выбрать ПЛИС, с которой мы будем работать. После этого можно создавать процессор. Обычно в проекте создают топ-левел файл (схема, или HDL — по вкусу), который будет описывать как ядро подключено к внешнему миру, но мы сейчас, что бы не возиться, поступим проще — описание процессора само будет топ-левелом. Для создания описания системы жмём Tools->SOPC Builder (SOPC расшифровывается как System on a Programmable Chip — система на программируемом кристалле). Появится окно Altera SOPC Builder и модальный диалог Create New System. В диалоге выбираем язык HDL, с которым работаем (на этом языке будет сформировано описание процессора) и имя системы. Основное окно SOPC Builder`а имеет две вкладки — System Contents и System Generation. Первая вкладка отвечает за описание системы, она разделена на несколько зон. В центральной части находится, собственно, описание того, что есть в нашей системе, сверху список тактовых сигналов, слева библиотека компонентов, а снизу консоль ошибок и предупреждений и управляющие кнопки. На второй вкладке находятся некоторые настройки генерации системы, которые нам пока не интересны, так что работать будем только с первой.
Первым делом нужно проверить, что тактовый сигнал, добавленный по умолчанию, соответствует имеющемуся кварцу и, если это не так, отредактировать его. Теперь идём в список библиотек и находим там ядро процессора NIOS (Processors->Nios II Processor), дабл клик на него — открывается диалог конфигурации. Конфигурация ядра Nios II
Тут нужно выбрать модификацию ядра. Предлагается три варианта:
  • Nios II/f (Fast) — ядро, оптимизированное для достижения максимальной производительности, самый быстрый и навороченный, но и самый прожорливый вариант, включает кеш памяти, всякие шняги типа MMU, MPU и прочую байду, которую любят взрослые операционки, а ля Linux;
  • Nios II/e (Economy) — минималистичное ядро, оптимизированное по размеру, имеет только базовые фишки, зато занимает в два-три раза меньше места, чем вариант Fast;
  • Nios II/s (Standart) — нечто среднее между двумя другими вариантами, типа баланс функциональности и размера — есть конвейер, гадание на кофейной гуще (то есть предсказание), аппаратное умножение/деление, но нет MMU, MPU, внешних векторов прерываний, продвинутых исключений и прочих плюшек.
Нам для простых опытов вполне хватит варианта /e. Ниже предлагают выбрать где размещать вектора сброса и прерываний, у нас пока негде. Да и вообще, пока больше ничего трогать не будем (впрочем, в /e ничего особо потрогать и не дают), только возьмём на заметку последнюю вкладку — Custom Instructions, позволяющую расширять систему команд процессора. Жмём Finish и видим, что у нас в системе теперь есть процессор, а в нижней зоне нас ругают за отсутствие памяти. Добавим её. Вообще-то у меня на отладочной плате есть микросхемы памяти и флеша, но для начала я решил сделать вид, что у меня только сама ПЛИС, без внешней обвязки. Добавляем из библиотеки Memories and Memory Controllers->On-Chip->On-Chip Memory (RAM or ROM), в диалоге настройки оставляем всё по умолчанию, только один нолик к объёму добавим. В колонке Connection видим, что память подключилась к процессору, а внизу к сообщению об отсутствии векторов добавились сообщения о косых адресах. Сначала пофиксим адреса: System->Auto-Assign Base Addresses. Теперь идём в свойства процессора и выставляем расположение векторов (смещения оставляем по умолчанию). Кроме этого, нам нужно что-то, чем можно поуправлять, например светодиоды. Добавим параллельный порт — Peripherals->Microcontroller Peripherals->PIO (Parallel IO), в настройках ставим разрядность 8, направление Output. После добавления можно тыкнуть в модуль ПКМ и сделать ему Rename во что-нибудь вменяемое, типа pio_led. Это имя запомним, оно нам потом понадобится.
Конфигурация системы в SOPC Builder
Кстати, для справки: здесь и дальше постоянно мелькает слово Avalon — это название фирменной системной шины, которая используется для соединения модулей между собой.
Теперь всё должно быть нормально, для первого раза этого должно хватить. Жмём кнопку Generate и соглашаемся на сохранение файла описания системы, SOPC Builder автоматически перейдёт на вторую вкладку и начнёт генерацию описания нашего процессора.
По окончанию процесса генерации компилируем проект системы в квартусе и получаем пачку варнингов о не подключенных пинах. Идём в Pin Planner, расставляем номера выводов и компилируем ещё раз. Кстати, можно обратить внимание, что кроме наших восьми светодиодов и тактового вывода, был автоматически добавлен вывод reset_n — сброс процессора, который можно посадить на какую-нибудь кнопку. Полученный файл прошивки (*.sof) заливаем в ПЛИС привычным методом. При желании прошивку можно рассмотреть в RTL Viewer`е и Chip Planner`е.
Карта использования элементов FPGA
Дальше дело за программной частью проекта.

3. Программная часть


Инструментарий для разработки программой части системы
Запускаем Eclipse (тот который называется Nios II EDS->Nios II Software Build Tools for Eclipse) и создаём новый проект из шаблона (File->New->Nios II Application and BSP from template). Появляется диалог создания проекта. В верхней части выбираем файл описание системы (*.sopcinfo) и ядро, для которого будем писать (в системе может быть много процессорных ядер). Далее вводим имя софтины и выбираем шаблон проекта Blank Project. Жмём Finish, будет создано два проекта — собственно проект с нашей программой и проект BSP — Board Support Package.
Создание нового проекта в Nios II EDS
Что бы настроить BSP ПКМ на BSP проекте и выбираем Nios II->BSP Editor, правда настраивать там по-началу особо нечего.
Создаём новый файл C для исходника нашей программы. Файл автоматически добавится в проект, но вот добавить его в сборочный скрипт нужно руками — ПКМ на файле в дереве проектов и жмём Add to Nios II Build.
Пишем простой код (стянуто с примера Hello LED)

#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"

int main (void)
{
	alt_u8 led = 0x2;
	alt_u8 dir = 0;
	volatile int i = 0;
	
	while (1)
	{
		if(led & 0x81)
		{
			dir = (dir ^ 0x1);
		}
		if(dir)
			led = led >> 1;
		else
			led = led << 1;
		IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);
		for(i = 0; i < 200000; i++);
	}
	return 0;
}


Вообще-то, если верить примерам, такая программа должна начинаться с выполнения функции alt_main(), а не main, как обычно, к моменту выполнения которой инициализируется только кеш CPU и указатель стека, но мы заморачиваться не будем.
Собственно, интерес в этом коде представляет строчка IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led). IOWR_ALTERA_AVALON_PIO_DATA это макрос, который находится в заголовочном файле altera_avalon_pio_regs.h. Заголовочные файлы подтягиваются проектом BSP на основании конфигурации системы. Список заголовков, которые навытягивались можно посмотреть в каталоге <BSP_PROJECT>/drivers/inc, как работает макрос смотреть в документации по переферии. PIO_LED_BASE — базовый адрес нашего регистра ввода-вывода. Он тоже формируется автоматически на основе описания системы. Собственно «PIO_LED» — это в точности имя регистра, которое мы задали при описании системы, только записанное заглавными буквами. Объявлена константа в файле system.h, находящимся в корне проекта BSP, где, кстати, хранится описание практически всей системы, полученное из файла *.sopcinfo. Ну и за компанию, раз уж пошли по инклудам, — третий подключенный заголовок (altera_types.h) содержит банальное описание типов данных фиксированной разрядности, вроде alt_u8 и несколько простых макросов для инлайнинга.

Теперь попробуем залить это в контроллер (напомню, что сам процессор уже залит в ПЛИС и ждёт программы). Для этого сохраняем файл с исходником и жмём Run As->Nios II Hardware, начнётся компиляция. Если нигде ничего не напутали, скомпилироваться должно без ошибок, но вероятно не запустится — во всяком случае у меня в тулките версии 10.1 не запустилось. На стадии заливки программы в камень выскакивает окно Run Configurations и сообщает нам, что не может найти подходящий девайс для заливки с мотивацией типа

 [Target Connection]: Connected system ID hash not found on target at expected base address.
или

 [Target Connection]: Expected base address of system ID component is undefined.


Настройка загрузчика ПО в процессор
(кстати, сообщения об ошибках там выводятся в самом верху окна — я далеко не сразу их заметил).
Дело вот в чём: в инфраструктуре сборки системы Nios II есть специальный предохранитель для защиты от заливки софта, собранного под одну модификацию системы в другую систему. Для идентификации системы используется два параметра — ID системы и временная метка генерации описания. Эти два параметра сохраняются при генерации описания системы в самой системе и в файле *.sopcinfo, откуда потом выковыриваются конфигуратором BSP. Перед заливкой софта в чип сравниваются параметры сохранённые в BSP с теми, что считаны из реальной FPGA и если они не совпадают — выдаётся ошибка и загрузка не происходит, как в моём случае. Теперь небольшой нюанс: за System ID и System timestamp отвечает отдельный модуль, который мы не подключили при генерации системы, соответственно этих параметров в системе просто нету. Выхода тут два — либо пойти в SOPC Builder и добавить искомый модуль (Peripherals->Debug and Performance->System ID Peripheral), после чего пересобрать всю систему, либо отключить проверку, поставив галки «Ignore mismatched system ID» и «Ignore mismatched system timestamp». Для начала можно, конечно, пойти вторым путём, что бы всё-таки запустить программу сейчас и убедиться, что оно работает, но правильнее первый метод, ибо не просто так это придумано =). Далее приведу в качестве резюме список шагов, которые надо выполнить при обновлении конфигурации системы (реальный список короче на те части, которые не изменились):
  • [SOPC Builder/Qsys] внести нужные изменения в систему;
  • [SOPC Builder/Qsys] сгенерировать описание системы;
  • [Quartus II] внести необходимые изменения в конфигурацию (Pin Mapping, вспомогательные модули и тд.);
  • [Quartus II] скомпилировать конфигурацию процессора;
  • [Quartus II Programmer] залить конфигурацию в FPGA;
  • [Nios EDS (Eclipse)] обновить BSP (Nios II->Generate BSP, или Nios II->BSP Editor...);
  • [Nios EDS (Eclipse)] внести нужные изменения в программу;
  • [Nios EDS (Eclipse)] перекомпилировать программу;
  • [Nios EDS (Eclipse)] загрузить полученный *.elf в процессор.
В итоге, конечно, получается дофига действий и достаточно долго, если заниматься этим серьёзно, надо искать методы автоматизации процесса, а то запаришься на кнопочки жать.
После выполнения всего этого мы видим, что наша первая программа работает и радостно бегает огонёчком. Что ещё надо для счастья? А надо, на самом деле, ещё дофига всего, так что не расслабляемся, а идём курить маны. Единственное, что хочу отметить — сейчас всё наше творение хранится во внутренней энергозависимой памяти, для нормальной работы нужно это добро запихать во флешь. Для этого необходимо в структуру системы добавить ещё модуль контроллера флешь памяти (Memories and Memory Controllers->Flash->EPCS Serial Flash Controller). Кроме того, необходимо, что бы в настройках ядра Nios II была включена отладка по JTAG хотя бы первого уровня, а вектор reset указывал на добавленный контроллер флешь. Перед заливкой конфигурации не забываем назначить ноги контроллера флешь памяти на нужные выводы. Заливать конфигурацию, кстати, можно простым методом в энергозависимую память — всё равно потом флешь будет перезаписан. Когда система готова нужно рефрешнуть BSP и собрать софтину (получить *.elf). Имея свежие файлы *.sopcinfo, *.bsp, *.sof и *.elf в Eclipse`е идём в меню Nios II->Flash Programmer.
Программатор Flash памяти из состава Nios II EDS
В окне программатора жмём File->New, в появившемся диалоге выбираем *.bsp файл, проверяем, что считанные из него данные соответствуют нашим ожиданиям и жмём OK. Желательно выставить галочки Options->Erase Flash Before Programming и Options->Run From Reset After Programming. Добавляем в список Files to flash conversion наши *.sof и *.elf и жмём Start. Всё, если ничего не сломалось, наша программа во флеше и будет автоматически запускаться при подаче питания на устройство. Кстати говоря, часть процесса, связанная с флешь программером, легко скриптуется встроенными средствами.
Ну, пожалуй, теперь приведённой информации должно быть достаточно для стартового импульса, дальше, как говорится, дело техники — лопатить доки и практиковаться.

4. Ссылки


  1. FAQ по встраиваемым системам от Altera — хорошая отправная точка, дающая базовые представления о системе.
  2. Embedded Design Handbook — обзорная по проектированию систем с применением Nios II, по идее, начинать надо отсюда (знал бы заранее, много нервов и времени сэкономил).
  3. Nios II Processor Reference Handbook — описание архитектуры процессора.
  4. Quartus II Handbook — документация по использованию Quartus II.
  5. User Guide SOPC Builder — документация по использованию SOPC Builder (в свежей документации на квартус почему-то описан Qsys, но нет почти ничего про SOPC Builder).
  6. Nios II Software Developer's Handbook — документация по программированию процессора Nios II.
  7. Embedded Peripherals IP User Guide — документация по работе с периферией, добавляемой в SOPC Builder`е (всякие PIO, UART, SPI и тд.).
  8. Nios II Hardware Development Tutorial — проектирование конфигурации процессора.
  9. Nios II Flash Programmer User Guide — использование утилиты программирования флешек из состава Nios II EDT.
  10. Nios II Custom Instruction User Guide — руководство по созданию и применению собственных инструкций процессора.
  11. Сборник документации, относящейся к процессору Nios II. Собственно, большая часть pdf-ок, приведённых выше, оттуда.
  12. Пачка примеров для Nios II.
  13. Видео-уроки от Альтеры. Некоторые немножко протухли, но смотреть можно.
  14. Раздел по SoPC на форуме ELECTRONIX.ru.
  15. Несколько толковых статей по Nios II для начинающих. Жаль только нашлось, как обычно, когда я уже почти закончил написание этой статьи.
  16. Переводы некоторых глав документации по Nios II от того же автора. Честно сказать, лично я читать не смог, в оригинале читается легче, но, наверняка, кому-то проще на русском.

  • +10
  • 16 апреля 2011, 20:30
  • Alatar

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

RSS свернуть / развернуть
… а по чем такой чип?
0
Какой такой? Цена на FPGA от альтеры колеблется в диапазоне от $6-10 за первый циклон в минимальной конфигурации до $10K и выше за какой-нить навороченный стратикс
0
а чем вобще различаются разные чипы помимо количества ячеек?
0
Вопрос довольно запутанный — без поллитры не разберёшься, но в общих чертах как-то так:
у альтеры есть три серии — Lowest Cost Cyclone, Mid-Range Arria и High-End Stratix. В каждой серии есть по несколько семейств различающихся по поколениям (I, II, III...) и фичам (GX, LS, E...).
Внутри одного семейства чипы отличаются количественными показателями (число LE, памяти, блоков умножения, PLL, ножек и тд.) и быстродействию (speed grade). Сами семейства отличаются между собой внутренней организацией (структура логических ячеек, типы блоков памяти) и фичами (тип блоков аппаратного умножения, наличие высокоскоростных трансиверов, аппаратных интерфейсов памяти, PCIe, 100Gigabit Ethernet, криптомодулей, возможность частитчной переконфигурации и тд.). А вот чем принципиально отличаются между собой серии я так и не понял. Походу разница только в фичастости на уровне одного поколения, потому что, например, DSP блоки плавно мигрировали из Стратикса в Циклоны. И, кстати, похоже именно под это дело сейчас подогнали Arria V, пропусти III и IV.
0
Продолжу вопрос.
Такой чип для которого вы создали проект. Или скажем наоборот. В какой чип влезет проект уровня STM32F100. И сколько он будет стоить.
0
Про STM32F100 ничего сказать не могу, ибо не представляю его уровень, а за себя скажу.
У меня чип EP3C25Q240 (CycloneIII, 24.5kLE, 600kbit mem, TQFP240), стоит он порядка $50, проект занял 6% LE и 57% памяти. Но тут почти никакой обвязки, всякие UART, SPI, FIFO скушают ещё LE и памяти. В общем, спокойно можно брать камень поменьше (баксов за 20) и ставить внешнюю оперативку.
0
Мдаа посмотреля на цены у нас — Ваш экземпляр 66$ в рознице. Прикольно конечно, но не могу представить куда такое ставить. Вот Вы в каких проектах используете их. Назовите пару тройку для примера, если не секрет.
0
Ну у меня особо проектов-то пока нет, я только начал изучать. Сейчас работаю над системой управления движением объекта, но тут можно было и обычный контроллер применить. На горизонте маячит задача реалтайм обработки видео-потока — вот тут без хорошей ПЛИС не обойтись. Проект, который упоминается в начале статьи — измерительный прибор, который должен контролировать переходные процессы в электрической цепи; соответственно, должен с дикой частотой цифровать сигналы с датчиков и обрабатывать их.
Что касается моего экземпляра — это отладочная плата, в конечное устройство вполне могут пойти чипы подешевле. Хотя, конечно, зависит от задачи.
Кстати, попробовал обвешать проект переферией — три 32-х разрядных порта, таймер, пара UART, SPI, PLL, LCD контроллер и ещё какой-то байды кинул. Объём занимаемой памяти почти не изменился, а LE скушало 13% (примерно 3k3 LE).
0
Вот спасибо. Теперь хоть стало понятно, что 25К ЛЕ можно впихнуть проц и стандартную периферию и это займет 20% остается 80% на всякий скоростной ногодрыг.
Я правильно пнял? Или программа для проца тоже занимает LE?
0
LE не используется под память программ, можно конечно извратиться и сделать память и на LE, но 25К — это 3 килобайта всего.
память программ может занимать внутренние блоки памяти, там около 50-80кБайт в младших циклонах есть, но может и во внешней памяти находиться.
0
Всё, что может занимать LE конфигурируется в квартусе. Дальше, в процессе написания программы ты никак не сможешь заюзать дополнительные LE (ну если только не переконфигурять FPGA на лету)
0
Ну у меня особо проектов-то пока нет, я только начал изучать. Сейчас работаю над системой управления движением объекта, но тут можно было и обычный контроллер применить. На горизонте маячит задача реалтайм обработки видео-потока — вот тут без хорошей ПЛИС не обойтись.
кстати, в тему о возможностях ПЛИС. У меня студент на обычном циклоне 2 сделал робота на подвижной платформе, с управляемой видеокамерой, беспроводной передачей на компьютер видеопотока и дистанционным управлением естественно)
www.youtube.com/watch?v=sDsp19plW_c
0
Alatar спасибо за статью. Прочитал с интересом и уже в серьёз начинаю задумываться изучать ПЛИС.(хотя в наличии тока CPLD
EPM3032-ALC4410). А можешь подсказать FPGA в районе 50-80 долларов, и что какими ресурсами данный чип будет обладать.
Я так понимаю корпуса идут в BGA и их на коленке не съёшь.
И ещё хотелось бы прочесть статью по конфигурациооным микросхемам.
Я как то пытался на альтеровском сайте но либо я смотрел не внимательно, либо ещё что то короче говоря не нашёл ни как они называются и сколько стоят, ни схем подключения.
0
Младшие модели циклонов идут в корпусах TQFP, так что проблем с пайкой больших нет. За $50-80 вполне можно взять третий циклон как у меня (см. пред. коммент).
Про конфигурационные флешки я мельком затрагивал в первой своей заметке про FPGA ( we.easyelectronics.ru/plis/osvoenie-plis-s-ispolzovaniem-yazyka-verilog.html )
А кратце: фирменные называются EPCSxx, где xx — объём. Вместо фирменных вполне можно ставить аналоги, например от ST.
0
в районе $80 можно и кит неплохой найти, правда с доставкой наверное подороже немного получится.
www.arrownac.com/offers/altera-corporation/altera-bemicro/index.html
или
www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=139&No=593

в обоих китах четвертый циклон на 22к ячеек, в него что угодно влезет, есть SDRAM память и usb blaster прямо на плате.
первый — с езернетом, но пины выведены на не очень удобный разъём, у второго разъёмы человеческие + ацп и акселерометр.
0
Спасибо за статью, наконец то запустил первый ниос. Хочу рассказать о небольших граблях которые нашел. С memory on-chip прога запустилась на раз, а вот прошить флеш удалось не сразу.
Квартус (я использую 9.1sp2) при создании проекта автоматически сконфигурировал ножки на EPCS16 (плата у меня такая же как у Alatar). По этой причине не удавалось присоединить на их место ножки с Nios проца для работы с флеш памятью. И вроде как черт бы с ним, по умолчанию так по умолчанию, но при записи прошивки с помощью NoisII Flash programmer'а выскакивала ошибка
Error code: 8 for command $SOPC_KIT_NIOS2/bin/…
Только после того как зашел в квартусе в device and pin options -> Dual-Purpose pins и сделал все пины, кроме NCEO, «Use as regular I/O» удалось присоединить в Pin planner'е ножки флеши к Nois'у и прошить без ошибок.
0
Да есть такое дело, но я об этом писал в первой статье, по-этому тут не стал упоминать. Хотя, наверно, стоило.
0
Привет всем!
Имею дисплей с интерфейсом схожим с motorola 8080: DATA[15:0], RS, WR, RD, CS.
Как его завести на Nios?
Пробовал на Avalon-MM Tristate Slave — дак там адресация 8и битная, те будут два выхода RS, а у меня один на ЖК…
0
Непонятен вопрос. Что именно не получается? Откуда беруться два выхода RS и зачем? Ищите описание итерфейса. Для эксперимента можно попробовать запустить этот дисплей на обычном мк, а потом уже портировать код в Nios
0
дисплей на контроллере SD1963, проверен на работе с МК STM32F2xx, дисплей имеет стандартную шину DATA[15:0], RS, WR, RD, CS. Выбор команды/данных производится линией RS; чтение/запись производится установкой 0 на RD или WR. Интерфейс создаю в SOPC на базе шаблона Avalon-MM Tristate Slave.
0
А в каком quartus вы делали? В Q v11, также?
0
Я работал в 10.1sp1. 11 я пока не пробовал, но должно быть так же. Единственное, там, вроде сейчас вместе с SOPC Builder (или вместо? думаю, вряд ли) добавлен Qsys. По сути тажа фигня, только навороченнее. Он, кстати, и в 10.1 есть, но только в платной версии и типа «бета».
0
Я вот тоже слышал что там Qsys, будем осваивать новое)
0
Ну я когда писал статью, думал, про SOPC писать, или про Qsys. Решил про первое, потому что для основ они идентичны, но SOPC есть сейчас и везде, а Qsys тогда был только в платной десятке и не понятно, будет ли вообще бесплатный =).
0
Автору спасибо за статью.
В официальном мануале, шедшим в комплекте с моей DE0-Nano, многие моменты опущены, а тут все места грабель освещены.
У меня были мои специфичные грабли.
Ну, во-первых, тот Эклипс, что вместе с квартусом 11 веб едишен — гадость. Глючный, так и не получилось через него залить проект.
Во-вторых, у меня есть на плате 32 МБ SDRAM. Корка есть под него в SOPC (QSYS еще не ковырял). Но там есть специфичный момент — в плате есть задержка распространения сигнала и надо её скорректировать. Официальная дока говорит, что конкретно в моем случае (DE0-Nano) нужно сделать, чтобы тактовый сигнал памяти опережал системный клок на 3 нс. Даже есть готовая корка в SOPC (если скачаешь Altera University), но именно она у меня отказалась работать. При компиляции квартус ругался, что там какой-то косяк с PLL. Ручками сделал в мегавизарде PLL, память толком не тестил, но вроде работает.
Кстати, самая дохлая версия NIOS (которая /e) работает без ограничений.
Отосплюсь и попробую QSYS
0
Добрый день! Делаю в Q11 добавляю процессор, память и порт- настройки по умолчанию; и при генерации проекта, выдает ошибку, и предупреждает что нет вектора сброса. У вас говориться что он сам добавляет вектор сброса. Вот что пишет:

To Do: cpu.cpu_0: No reset vector has been specified for this CPU. Please parameterize the CPU to resolve this issue

To Do: cpu.cpu_0: No exception vector has been specified for this CPU. Please parameterize the CPU to resolve this issue

Info: cpu.onchip_memory2_0: Memory will be initialized from onchip_memory2_0.hex

Error: Generation skipped because the system has validation errors.
0
Разобрался… На первой вкладке ниоса нужно указать reset vector и exception vector)
0
Я не внятно написал, а Вы не внимательно прочли =) Там есть пункт «Теперь идём в свойства процессора и выставляем расположение векторов (смещения оставляем по умолчанию).» — именно вектора сброса и исключений и имелись ввиду.
0
А можно это растолковать?
«Что бы настроить BSP ПКМ на BSP проекте и выбираем Nios II->BSP Editor,»
0
ПКМ — правая кнопка мыши?
0
Я думаю что стоило бы просто приложить к статье проэкт в архиве. Отвалилось бы много вопросов.
0
Когда я это постил возможности прикреплять файлы к статье ещё не было, а заливать на внешний сервис заломало. Да и смысла не вижу — что даст готовый проект? С статье единственный исходник приведён целиком, а больше и опускать-то нечего. Ну разве что таблица ассигментов… ИМХО, создание поэтапно параллельно с чтением статьи снимает вопросы лучше, чем изучение готового проекта, приложенного к ней. Кстати, именно из этих соображений я «забыл» добавить System ID — что бы обратить на него внимание (я таким приёмом часто пользуюсь).
0
Я так и делал… Сидел и не получилось :) Слишком много неясностей… Не для того кто делает впервый раз…
0
Ясно, значит я недостаточно ясным языком пишу, учтём-с. Впрочем, для того тут комментарии и придуманы, что бы можно было спросить, что не ясно =)
0
Да я думал что статья тут уже давно и я тут оди такой :) Вот и нестал спрашивать… А вообще надо описать как делать проэкт и как подключать его к ногам и к вложеной корке… Часто бывают в этом проблемы…
0
Ну как подключать к ногам — это основы квартуса, об этом уже писали в других статьях, в том числе и я, так что я решил, что написать «Идём в Pin Planner, расставляем номера выводов и компилируем ещё раз» будет достаточно — зачем повторяться? Что же касается вложенной корки — там зависит от того, на каком языке ты описываешь железо и, опять таки, делается стандартными для соответствующего языка способами. =)
0
PS что-то мне мало информации для старта) Некоторые шаги описаны поверхностно. В моем понимании, инструкция для startup должна быть полностью пошаговой…
0
Гм… куда уж пошаговее-то? что непонятно?
ПКМ — да, правая кнопка, более-менее стандартное сокращение. Имелось ввиду, что надо вызвать контекстное меню BSP-проекта дереве проектов эклипса.
0
Например как у Альтеры)
naliwator.narod.ru/tt_nios2_hardware_tutorial_3.pdf
0
=) Нет уж, книжки пусть писатели пишут, а мы пока как-нибудь так… :D
0
ЗЫ: просто я как раз таки пытался записывать каждый значимый тык, стерев все наработки и создавая проект с нуля, что бы ничего не пропустить.
0
Ну например у меня с первого раза не получилось :) Проц я сдалал но он небыл никуда подключен. Вобщем потом ещё долго розбирался что и куда и как…
0
Скажите пожалуйста, какой Quartus Вы использовали? Web Edition позволит все это собрать и скомпилировать?
0
Честно признаться, тестилось это на ворованном 10.1sp1, так уж сложилось. Но вообще-то с Web Edition проблем быть не должно. У меня сейчас Q11.1sp1 — там и Qsys есть (в 10.1 Qsys был только в платной версии).
Кстати, если интересно, вот сравнение платной и бесплатной версий — www.altera.com/literature/po/ss_quartussevswe.pdf. В основном различия в поддерживаемых чипах (Web умеет только максы и циклоны, причём не все) и оптимизации синтеза (параллельное компилирование, инкрементальное компилирование и тд).
0
Благодарю за ответ!
Откровенно говоря вопрос возник по следующему поводу: компиляция проекта квартус не проходит в версиях 10, 10.1, 11, 11.1 и все сервиспаки. И «студ-пакет лицензии» пробовал и веб, все заканчивалось следующим:

Warning: FLEXlm software error: Invalid (inconsistent) license key. The license key and data for the feature do not match. This usually happens when a license file has been altered. Feature: quartus License path: C:\altera\11.0sp1\quartus\bin\license.dat; FLEXnet Licensing error:-8,523 For further information, refer to the FLEXnet Licensing documentation, available at «www.acresso.com».
Error: Current license file does not support the EP4CE22F17C6 device

У меня DE0-Nano и с этим ничего не поделаешь -) ПЛИС поддерживается только с 9.1 сервиспака 2.

Пробовал с триальной версией 30 дней компилировать — получается, но в устройство Ноис не загрузишь, так как .elf файл так не создается.

Что можно поделать в этой ситуации?
0
Хм… странно — для вебэдишна емкакого флексЛМа не нужно. Сейчас попробовал собрать на 11.1sp1
0
Сейчас попробовал собрать на 11.1sp1 Web Edition — собирается:
0
Да ёлки палки — что сегодня у меня такое с руками…

Flow Status Successful — Fri Mar 09 22:45:17 2012
Quartus II 32-bit Version 11.1 Build 216 11/23/2011 SP 1 SJ Web Edition
Revision Name nios_test
Top-level Entity Name nios_vlg
Family Cyclone IV E
Device EP4CE22F17C6
Timing Models Final
Total logic elements 1,155 / 22,320 ( 5 % )
Total combinational functions 1,088 / 22,320 ( 5 % )
Dedicated logic registers 564 / 22,320 ( 3 % )
Total registers 564
Total pins 10 / 154 ( 6 % )
Total virtual pins 0
Total memory bits 337,920 / 608,256 ( 56 % )
Embedded Multiplier 9-bit elements 0 / 132 ( 0 % )
Total PLLs 0 / 4 ( 0 % )

Info (293000): Quartus II Full Compilation was successful. 0 errors, 75 warnings
0
Благодарю.
У меня тоже собралось, правда на другой версии. Теперь с прошивкой ядра занимаюсь -)
Видимо я начудил в экспериментах с лицензиями…
Спасибо за помощь!
0
Добрый день! Попытался сделать все как по инструкции: сгенерировал ядро, скомпилил программу, прошил плис… В консоле эклипс пишет
Using cable "USB-Blaster [USB-0]", device 1, instance 0x00
Resetting and pausing target processor: OK
Reading System ID at address 0x00005090: verified
Initializing CPU cache (if present)
OK

Downloading 00002000 ( 0%)
Downloaded 1KB in 0.0s        

Verifying 00002000 ( 0%)
Verified OK                         
Starting processor at address 0x00002020

но на плиске ни на одной ноге единица не выставилась
Подскажите, пожалуйста, в чем может быть проблема (ножки в пин панели выставил правильно)?
0
  • avatar
  • sss
  • 17 марта 2012, 12:26
Разобрался, кроме выходного регистра я добавил в проект spi и при запуске срабатывало прерывание.
0
Alatar, спасибо за статью хорошо и доступно рассказано! Мне на нее скинули ссылку мои студенты.
В плане русских материалов по NIOS II начинающим могу посоветовать обратить внимание на это: fpga.in.ua/category/fpga/cad-pld/nios-soc-design-laboratory-works
там целый курс по ниос под DE2 от украинского центра Альтеры, с пошаговыми инструкциями и практическими примерами типа обработки сигналов и применения аудиокодеков.
На много качественней, чем гугл-перевод от Наливатора.
0
Вот такие курсы (по вышей ссылке) мне не очень нравятся, вот взять лабораторные работы: «Применение фильтра для выделения границ в видеопотоке (Edge Detection)». Ну замечательно звучит, открываешь, а там — возьмем готовый блок «Clocked Video Input», готовый Deinterlacer, готовый Scaler, готовый фильтр и т.д. И что, можно гордиться, что на ПЛИС выделение границ сделал? Вот если бы с основательной теорией, да на Verilog.
Вон еще статья — FIR на Nios делают, и что дальше, так можно и на STM32 или вообще на RPi сделать. ПЛИС тут каким боком?

Потом и выходят специалисты, которые из готовых блоков (которые к тому же чаще всего не бесплатные лепят) устрйоства и считают себя великими специалистами.

Можете меня критиковать. Я ничего не имею против готовых, оптимизированных блоков, но учить людей надо не них, пусть человек сам напишет свой блок, да не на Nios, если уж за ПЛИС взялись, а на Verilog/VHDL, пусть он будет неоптимальный, зато будет понимание материала, только потом можно использовать готовый блок. А то очень удобно, SOPC Builder — поставил контроллер SDRAM и типа у меня проект со SDRAM, я такой крутой! А как SDRAM работает — ни беее, ни меее, ни кукуреку. Не про всех конечно говорю, но образование у нас в целом такое и есть.
0
Ну вы жестко прошлись)
Если бы вы там порылись, то нашли бы и курс по Verilog.
Студентам надо давать и существующие библиотеки, и учить делать самим, то, чего нет. Я так понимаю, там выложен лабораторный курс, вполне возможно он подкреплен и теоретическим курсом (как, например, по ЦОС), просто его еще не опубликовали.
На фоне практически полного отсутствия материалов на русском языке считаю те материалы вполне полезными для новичков.
0
Не совсем понятна Ваша критика. Плис тема очень ёмкая. За десяток лаб специалист из Вас не выйдет в любом случае. А для начинающего в самый раз :-)
0
Создаём новый файл C для исходника нашей программы.
Можете, пожалуйста, поподробнее, как это сделать?
0
Здравствуйте, Alatar. Есть вопрос. Опробовал Ваш проект — заработало. Решил немного изменить код. Сделал мигалку одного светодиода:
#include «system.h»
#include «altera_avalon_pio_regs.h»
#include «alt_types.h»

int main (void)
{
alt_u8 led = 0x2;
volatile int i = 0;

while (1)
{
led=~led;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);
for(i = 0; i < 50000000; i++);
}
return 0;
}

Частота кварца 100 МГц. PLL не пользуюсь. Частота миганий светодиода должна быть 1 Гц. На практике светодиод мигает на много реже. Почему?
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.