Полная версия этой страницы:
Что-то с NIOS II не так
EXeGLuMATOR
Nov 25 2005, 22:40
Имеется - надо принять поток данных (16 бит) и сложить его во внешнюю память (8 бит), потом соотв прочитать и выдать во внешнее устройство (4 бита). В связи со спецификой решения - все делается на параллельных портах. Результат - крайне низкая скорость. Странно очень для RISC-процессора - на кристалле EP1C3 - при частоте проца 200МГц - длительность импульса (поставил бит в порт-снял бит с порта) - соотв частоте 1МГц. Запись 1 МБ памяти занимает около 2-х секунд!!!

Это так и должно быть? Quartus 4.2 sp 1 + все стандартное из комплекта. Может чего-то не так настроил?
А какой именно NIOSII используете? Их не менее трех.
По всей видимости вы используете маленький, так вот у него мипсов в 5 раз меньше тактовой.(В вашем случае 40MHz)
Цитата
А какой именно NIOSII используете? Их не менее трех.
И на программу (поставил бит в порт-снял бит с порта) хотелось бы взглянуть(на С или на ассемблере). Из какой памяти исполняется, какой кэш, все ли попадает в кэш (инструкции).
С памятью другой вопрос. Он обсуждался активно на форуме www.niosforum.com/forum.htm
Вот линка, стоит прочитать:
http://www.niosforum.com/forum/index.php?showtopic=629Проблема для чтения, но она актуально если код у вас во внешней памяти, и вы без кэша вынужденые его от туда читать.
После чего разработчики добавили в ниос 2 версия 5.0 специальный вид памяти: Tightly Coupled Memory (тесно связаная с ядром).
Вот линка на релизные изменения в версии 5.0
http://www.niosforum.com/forum/index.php?s...1651&hl=latency
EXeGLuMATOR
Nov 26 2005, 20:21
Nios не 5 но и не 1-й! Не помню версии - на работе стоит... а инета там нету...

Ниос в самой мелкой комплектации - естественно без кэша и т.п В ЕР1С3 - особо не втолкаешь - память команд и констант - внутренняя. А на проблемы с внешней памятью наткнулись на евалюшн борде, потому и на параллельных портах. Программка ессно на С - встроенное все, что в комплекте было... . процедура IOWR_... ну и тп.
Попробую кэш прикрутить... может влезет... Хотя даже при такте 40 МГц - должно быстрее работать.
Цитата
длительность импульса (поставил бит в порт-снял бит с порта) - соотв частоте 1МГц. Запись 1 МБ памяти занимает около 2-х секунд!!!
Если посчитать та если у вас на операция записи длится 2 импульса или даже 1, то 1 миллион обращений и вылезает в приведенные вами времена. А чего вы хотели?
И что за проблеммы с памятью?
Тот же самый PIO адресуется как ячейка памяти. У NIOS все, что не входит в ядро является памятью.
Извеняюсь, немного ошибся (с нисом работаю редко). Но вот как раз намечаетсяновая работа.
Проблема на которыю я сослался относиться только к Data Master, но не к Instruction Master.
Вопрос в ветке цитировать не буду, но ответ разработчика процитирую (разговор идет про NIOS II ver 1.0):
What you're seeing is the result of the Nios data master not being 'latency aware' (the instruction master is, and this allows relatively speedy instruction fetch even with a cache miss). Both master ports on the DMA controller are, and that is why Ken sees the performance he does. In a nutshell, Nios II was really designed to be as simple (small/fast) as possible and deliver best performance when things are cached.
PS: Latency aware means that an Avalon master accepts the 'readdatavalid' signal, rather than merely the 'waitrequest' signal as all masters must do.
В версии 5.0 немного подшаманили Data Master и привертели Tightly Coupled Memory.
А производительность махания битом я сейчас проверю на эвалюхе.
Софт проект hello_led
добавлен цикл:
while(1){
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x01);
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x00);
}
Плата 1С20 эвалюха, частота 50МГц
HW 1C20 low_cost (код данные из SDRAM, процессор NIOS II/e): период 1.56 мкс.
Тоже самое но для HW small (память данных и кода на М4К блоках внутри циклона (всего 2К байт), процессор NIOS II/e): период 800нс
При этом для ядра NIOS II/e заявляется 5-7 DMIPS.
По сгенеренному коду мы имеем:
while(1){
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x01);
60: 00900004 movi r2,16384
64: 00c00044 movi r3,1
68: 10c00035 stwio r3,0(r2)
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x00);
6c: 00900004 movi r2,16384
70: 10000035 stwio zero,0(r2)
74: 003ffa06 br 60 <alt_main+0xc>
Disassembly of section .comment:
За один период выполняется 6 команд. Что соответствует заявленым 5-7 мипсам.
Проект компилился в дебаге. Реально только запись в R2 лишняя, что уменьшило бы цикл до 4 команд.
Все "железо" компилилось в квартусе 5.0, настройки проектов не изменялись, все по умолчанию.
EXeGLuMATOR
Nov 28 2005, 20:13
Понятно - в общем так и есть... Как и описал Major... цикл приблизительно так-же выглядит (а как иначе-то?

)
Наличие кэша и пр влияет незначительно. Быстрее... но чуть-чуть.
В общем - тормоз. И зачем он еще нужен - если только лампочками моргать да клавиатуру сканить... На более серьезные задачи - очень тяжело... А жаль - удобно... Попробовать 5.0 поставить... Хотя если даже на асме писать - такая задержка... Неприемлемо...
Нужен, даже в варианте e(economic наверное).
Лампой моргать можно и логику привертеть, так же как и клаву.
Есть рутинные задачи, которые на конечных автоматах запаристо делать, да и понимание их работы со времененм ухудшается (программы медленее "стареют"). Мне обычно мипсы нужны только пиковые, а так все идет неспешно, то что на авре требует 8 мипс на ниосе хватит 2-3 (за счет битности и внешней логики) плюс большое адресное пространство - это для мелких задач. Цена критерием не является. Это моя оценка, сам я использую только варианты s (standart) и f (fast), и при этом весьма доволен.
Ниос мне позволяет делать отложеные решения на этапе проектирования, не заморачиваясь раздачей ног и ресурсов (в локальном смысле). Цена за это своя, но меня она устраивает.
iosifk
Nov 29 2005, 06:12
Цитата(EXeGLuMATOR @ Nov 26 2005, 01:40)

Имеется - надо принять поток данных (16 бит) и сложить его во внешнюю память (8 бит), потом соотв прочитать и выдать во внешнее устройство (4 бита). В связи со спецификой решения - все делается на параллельных портах. Результат - крайне низкая скорость. Странно очень для RISC-процессора - на кристалле EP1C3 - при частоте проца 200МГц - длительность импульса (поставил бит в порт-снял бит с порта) - соотв частоте 1МГц. Запись 1 МБ памяти занимает около 2-х секунд!!!

Это так и должно быть? Quartus 4.2 sp 1 + все стандартное из комплекта. Может чего-то не так настроил?
1. Могу добавить только, что конвейер 5 ступеней и при каждом JMP, CALL, RET происходит сборс конвейера. Следовательно, все критичные куски надо писать "в лоб", без этих команд.
2. Сделайте ДМА, если это позволяет обработка Ваших данных. Если нужно что-то особенное, то есть пользовательские команды. Небольшой автомат, определяющий готовность данных. Получите скорость близкую к тактовой. Если внешнее устройство - порт MII, то это гораздо проще сделать аппаратно, чем выделять тетрады.
Так что либо сидеть со "спецификой", либо как задумано в Niose.
Удачи!
Гвоздик
Dec 2 2005, 14:44
Скажите, пожалуйста, а вы за каждый запрограммированный НИОС за лицензию его ядра по 500 долларов выкладываете? Или крэк существует?
После такой беседы о тормознутости НИОСа что-то берет сомнение о его приобретении за такие деньги...
500 уе стоит годовая подписка.
После окончания срока подписки вам будут не доступны новые версии. все что было до этого будет доступно.
Например в мае у меня кончилась лицензия, и я могу пользовать только 5.0 ивсе что было раньше этой версии.
Чтобы использовать 5.1 надо покупать подписку.
Для того чтобы понять нужен вам ниос или нет достаточно evaluation версии, пока квартус через jtag видит матрицу, все работает.
Без этого время работы ограничено 30 мин. После чего проц перестает функционировать.
Про лекарство - вроде есть, сам не пользовал.
Гвоздик
Dec 2 2005, 15:09
Теперь понятно. Скажите, а как при такой медленной работе Ниоса (1 Мбайт/с записывать) можно на него еще UcLinux ставить? Читал по форуму, что под Линуксом все работает. Это при самом ресурснозатратном варианте Ниоса получается только?
Я линукс не пользую.
На форуме ниоса народ активное его обсуждает со всех сторон.
http://www.niosforum.com/pages/forum.php?cat_id=5Для работы с памятью рекомендую использовать DMA.
Да и ядро ставить не economical.
Гвоздик
Dec 2 2005, 15:26
Скажите, если не секрет, а что за отладочная плата у Вас? Смотрел альтеровскую родную NIOS-EVALKIT-1C12: там кварцевый генератор на 24 МГц (у Вас 50 МГц). Цена какая? Альтеровскую за 320 долларов предлагают...
Цитата(Гвоздик @ Dec 2 2005, 21:26)

Скажите, если не секрет, а что за отладочная плата у Вас? Смотрел альтеровскую родную NIOS-EVALKIT-1C12: там кварцевый генератор на 24 МГц (у Вас 50 МГц). Цена какая? Альтеровскую за 320 долларов предлагают...
У меня вот эта плата:
http://www.altera.com/products/devkits/alt...-nios_1C20.htmlСтоит она 995 уе.
В комплект входит плата + все шнурки+ бластер+ годовая подписка на ниос + годовая лицензия на использование квартуса.
Немножко не в тему, но тоже актуально. Точно с такой же проблемой столкнулся при попытках быстрых пересылок данных на порт ввода-вывода на Xilinx Virtex 2 pro c PowerPC процессором. Никакими ухищрениями (использование разных корок ввода-вывода и тд) мне не удалось поднять частоту генерации меандра выше 2 МГц. Одно только радует, что шина-то 32 битная, то есть 4 байта за раз можно послать. Пришлось отказаться от идеи напрямую процессором слать данные. - нужно было 100 мегабайт в сек. Стыдно, 32-битный проц на частоте 100 МГц способен через ввод-вывод прокачать только 8 мег в сек, а их же еще где-то брать надо, обрабатывать как-то. Вот и плюнул на эти внутренние процессоры, поставил внешний ARM и не парюсь. А данными Спартан-3 занимается, решение куда дешевле Виртекса -Про.
Цитата(Gorby @ Dec 3 2005, 08:03)

Немножко не в тему, но тоже актуально. Точно с такой же проблемой столкнулся при попытках быстрых пересылок данных на порт ввода-вывода на Xilinx Virtex 2 pro c PowerPC процессором. Никакими ухищрениями (использование разных корок ввода-вывода и тд) мне не удалось поднять частоту генерации меандра выше 2 МГц. Одно только радует, что шина-то 32 битная, то есть 4 байта за раз можно послать. Пришлось отказаться от идеи напрямую процессором слать данные. - нужно было 100 мегабайт в сек. Стыдно, 32-битный проц на частоте 100 МГц способен через ввод-вывод прокачать только 8 мег в сек, а их же еще где-то брать надо, обрабатывать как-то. Вот и плюнул на эти внутренние процессоры, поставил внешний ARM и не парюсь. А данными Спартан-3 занимается, решение куда дешевле Виртекса -Про.
А Можно немного подробнее ? вам нужен был только I/O ? или внутрях ФПГА проец тоже данные обрабатывал ? на какую шину "сажали" I/O ? какой режим ввода вывода использовали ? (пробывали ли писать свой блок ввода вывода).
Приношу извинения за такое кол-во вопросов, просто хочу оценить возможности PPC в виртексах2/4
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.