|
|
|
NIOS для начинающих |
|
|
|
Dec 21 2009, 08:48
|
Знающий
Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831
|
Переделал тест. Теперь он пишет сперва 5 ячеек подряд, затем 5 через 1, 5 через 2 и так далее до промежутка между ячейками равного 10 (получается две посылки подряд будут обращаться к одному банку в DDR но в разные блоки burst, она у меня 16 битная с burstlength=4, на один burst ложатся два int). Промежуточные ячейки, как фон, предварительно тоже заполняю. Проверял и с возрастающими адресами и с понижающимися, как в коде: CODE void FirstFill(unsigned char fl) { unsigned int i,j; unsigned int addr=0; for(i=0;i<300;i++)IOWR_32DIRECT(CPU2EXTMEM_BASE+0x10000, i*4, (fl?0xa5a55a5a:0x5a5aa5a5)); // for(j=1;j<11;j++) // { // for(i=1;i<=5;i++) for(j=10;j>0;j--) { for(i=5;i>0;i--) { addr=((j-1)*j)/2*5+j*i; IOWR_32DIRECT(CPU2EXTMEM_BASE+0x10000,addr*4, (fl?addr:(50000000-addr))); } } //********* void SecondTune(void) { unsigned int i,tmp; for(i=0;i<300;i++) { tmp=IORD_32DIRECT(CPU2EXTMEM_BASE+0x10000, i*4); tmp^=0xffffffff; IOWR_32DIRECT(CPU2EXTMEM_BASE+0x10000, i*4, tmp); } } //*********** unsigned char CheckMem(unsigned char fl) { unsigned int i=1,j=1,res=0,tmp; unsigned int k; for(k=0;k<300;k++) { tmp=IORD_32DIRECT(CPU2EXTMEM_BASE+0x10000, k*4); if((((j-1)*j)/2*5+j*i)==k && j<11) { if(tmp!=((fl?k:(50000000-k))^0xffffffff)) res=1; if(i==5){i=1;j++;} else i++; } else { if(tmp!=((fl?0xa5a55a5a:0x5a5aa5a5)^0xffffffff))res=1; } } return res; } В task блок проверки тот же. Работает, собака, как часы. Что еще можно придумать? Не может же Nios сам как-то подругому обращаться? Просто с родной (как советовал vadimuzzz) алтеровскй тестер небольшой головняк прикрутить для проверки. СтОит ли? Может это ClockCrossBridge как-то у меня не правильно настроен, в описании мутная формула дана для минимальной длины slave-to-master, у меня он 64, а master-to-slave = 8. Можно, конечно, забить. Такой вариант системы, как сейчас работает. Но как начну дальше писать уже нормальную прогу с несколькими task да как опять вылезет. Страшно.
Причина редактирования: Оформление кода
|
|
|
|
|
Dec 21 2009, 09:28
|
Знающий
Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831
|
Kuzmi4
По поводу сигналтаба идея хорошая, но боюсь что будет: " - Петька, приборы? -40 -Что 40?.....". Всмысле как я буду отлавливать неудачные записи, не представляю. Нужно подумать. По второму. По поводу гейт-левел понял. Но не понял причем здесь влезет или не влезет во внутреннюю память. Не могли бы разъяснить для тех кто в прочном корпусе . Кстати по поводу такой симуляции. Я под конец написания своего контроллера пробовал такую симуляцию. Она почему-то не пошла. Т.е. вообще все молчало. Забил. Если все-таки к ней вернуться, где почитать, как проводить симуляцию вместе с ниосом. Что-бы уже наверняка. При этом мне как раз и нужно, чтобы симулировалось с внешней памятью. С внутренней и так работает. А кто-нибудь пробовал подобную систему, но что-бы все сегменты распологались строго в DDR? Может это все-таки сомо ядро ниоса тупит при большой и изменяющейся латентностью чтения/записи данных. (всегда есть надежда что не сам виноват ).
Причина редактирования: Избыточное цитирование
|
|
|
|
|
Dec 21 2009, 10:12
|
Гуру
Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329
|
Разъясняю - пишем прогу для ниоса2, компилим, располагаем её в on-chip памяти, далее собираем всё системку на Modelsim-е, инициализируя вашу on-chip тем что выдал IDE (там только по-моему нужно будет ELF в HEX перегнать вроде), цепляем модельки ДДР2(ищем на сайте производителя - точно должны дыть) и LCD (если есть, тут думаю всё сложней чем поиск на сайте производителя будет), выводим интересующие вайры, делаем нужные стробы и смотрим что к чему.. Но это как то долго и интересно, когда железо в разработке или заказчику нужна функциональная модель того, что есть в железе. Да и судя по-всему для вас это всё будет проблемно по началу и займёт много времемни. Думаю что всё же проще вам прицепить сигнал-таб и просто, для начала, посмотреть транзакции - как они у вас вообсче проходят в зависимости от ваших экспериментов с программой и ниосом2, ну а потом уже и стробы понапридумывать для тригирования событий. Ну вот как то так..
|
|
|
|
|
Dec 22 2009, 03:58
|
Знающий
Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831
|
Цитата(vadimuzzz @ Dec 21 2009, 20:40) кстати, как-то упустили из виду. а какого рода сбой? повисает прога? и акселератор имеет прямой доступ к памяти? Убрал data cache. Проверил - сбои непредсказуемые. Поясняю. В моей main перед уходом в sheduler имеются несколько строк кода. В зависимости от того, куда я ставлю breakpoint, а затем после остановки пускаю дальше прога вылетает в разные места. Иногда летит в обработку exception. причем подлавливал в регистре exception 0x14,0x0c и 0x1c (Illegal Instruction, Trap Instruction и Misaligned Destination Address). В другом месте поставлю брейкпоинт или делаю пошагово может дойти до цикла for(;;); и висеть, при этом ipending и ienable висят в 0х01 (то есть должно идти в прерывание, но не идет). Была ситуация, что крутится в цикле проверки пришедшего прерывания (ipending при этом равен 0x01, а переменная active - запомненное значение ipending в файле alt_irq_handler.c). Получается, что все-таки глюк с памятью скорее всего . Одно радует - если повторяю одни и теже действия с breakpoint вроде есть повторяемость. Значит можно будет сигналтаб (как советует Kuzmi4) на это как-нибудь настроить. Сейчас буду читать про связку сигналтаб+ниос, где-то видел апликуху или раздел. 2 vadimuzzz .Акселератор имеет прямой доступ. У меня контроллер MemoryWraper включает себя акселератор, контроллер вывода на LCD и контроллер доступа nios к памяти. Соответственно внутри реализован арбитр, который разруливает между ними. При этом половину полосы пропускания отводится для вывода на экран (подготовку fifo строки), оставшаяся половина делится между акселератором, чтением и записью в память поровну. Просто для чтения и записи один интерфейс с nios, для акселератора отдельный. PS. Если вообще не ставить breakpoint, то залетаю до for(;;); и весит, при этом ipending и ienable равны 0х01, status=0, exception=0. Делаю перестановки строк, опять запускаю без брейкпоинтов - зависает на бесконечном цикле определения прерывания (active=0;)Очень странно. А можно ли будет одновременно работать и в дебугере niosa и в signaltab?
|
|
|
|
|
Jan 24 2010, 07:28
|
Знающий
Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831
|
Не знаю точно, сюда нужно постить, или в раздел gcc микроконтроллеров. Поиском похожие темы не нашел. Есть такие структуры, описывающие подпись для кнопок меню (пока только текст, без иконок) Код typedef struct {unsigned char length;char * arr;}lable_line_st; typedef struct {unsigned char lines;const lable_line_st* strinrs;}lable_text_st; typedef struct {lable_text_st text;}lable_st; Т.е. при выводе на экран сразу могу определить сколько строк в подписи и сколько в каждой строке символов для выравнивания по центру. Необходимо каким-то образом красиво создавать подписи на этапе компиляции. Ничего не смог придумать лучше, чем: Код //в заголовочном файле: #define STRINGLINE(x) {(sizeof(x)-1),x} // в тексте const lable_line_st Button1_text[]={STRINGLINE("line 0,"),STRINGLINE("line 2"),STRINGLINE("and line 3")}; const lable_st Button1={{3, &Button1_text[0] }}; хотелось бы, чтобы подпись можно было бы создавать как нибудь наглядней , что-то типа Код const lable_st Button1{{CREATETEXT("line0,","line1","and line 3" )}} Реально ли это как-нибудь сделать? Пробовал делать структуру с переменной длиной массива typedef struct {unsigned char lines;const lable_line_st strinrs[];}lable_text_st; Но компилятор ругается, т.к. эта структура является вложенной в другую структуру. PS. Работаю в nios IDE, соответственно компилятор gcc, в свойствах библиотеки не стоит флажок "support C++" ,
|
|
|
|
|
Feb 10 2010, 10:07
|
Частый гость
Группа: Свой
Сообщений: 183
Регистрация: 10-10-06
Из: Смоленск
Пользователь №: 21 167
|
Здравствуйте. Начинаю разбираться с ниосом, при этом возникло множество вопросов, кита к сожалению нет. Документации очень много, где конкретно искать непонятно плюс ко всему все рассмотренные мной описания сделаны под предыдущие версии, а в 9.1 много чего по другому. Ответьте пожалуйста на следующие вопросы: Я сделал проект на циклоне3 в квартусе состоящий из одного NIOS и PIO порта вывода (+JTAG UART). В NIOS IDE создал проект "Hello World small" на основе квартусовского. 1) В main вбил строчку IOWR(0x00000000, 0, 0xffffffff); - запись в порт "1" с учетом того, что в SOPC Builder pio занимает адресное пространство с 0х00000000 верно или нет? Скомпилилось успешно, elf создался. 2) Как зашить данный проект и откуда (квартус или NIOS IDE)? Компилирую в квартусе - в симуляторе выход не меняется. В NIOS IDE запуск через "NIOS hardware" ничего не дает. Подцеплял плату подключенную через USB-Blaster, но не к JTAG (в плате используется AS загрузка), сброс видно что работает, но в списках соединений ничего не появляется. Будет ли работать при подключении к JTAG или надо еще что-нибудь сделать? 3) В каком именно документе находится описание использования периферии NIOS? 4) JTAG при конфигурировании NIOSа добавлять нужно для программирования? Или он по дефолту есть? "JTAG UART" это замена штатному или основной?
|
|
|
|
|
Feb 11 2010, 05:43
|
Знающий
Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831
|
Цитата(Serg_Sm @ Feb 10 2010, 21:07) Документации очень много, где конкретно искать непонятно плюс ко всему все рассмотренные мной описания сделаны под предыдущие версии, Основное по NIOS - на "родине" http://www.altera.com/literature/lit-nio2.jsp (Processor Reference Handbook, Software Developer's Handbook, ну и остальные по мере надобности), по самому Quartus - естественно первым делом его handbook ( http://www.altera.com/literature/hb/qts/qu...i_handbook.pdf). Книги эти большие, но там много воды, нужно научиться их читать, пропуская введения и т.п. перед каждым разделом. 1) Да. 2) Не понял как у Вас разведена на плате схема программирования. Возможны варианты с разведенными отдельно разъемами и JTAG и AS как на Figure 10–28. в книге "Cyclone III Device Handbook, Volume 1", на самом деле достаточно развести как "Figure 10–29. Programming Serial Configuration Devices In-System Using the JTAG Interface". У Вас вообще jtag выведен? 3) http://www.altera.com/literature/hb/nios2/n2cpu_nii5v3.pdf4) Нет, добавлять ничего не обязательно. JTAG UART это отдельная фича (сам не пользовался ), с помощью которой Вы можете обмениваться с консолью NIOS в процессе отладки, как если бы Вы вставили в SOPC модуль UART, развели его на плате, подключили к COM-порту и работали, например, в Гипертерминале. Плюс у этой фичи, что на плате разводить ничего не надо, минус - что работать с таким UART можно только (на сколько я знаю) из консоли NIOS IDE.
|
|
|
|
|
Feb 22 2010, 20:45
|
Группа: Участник
Сообщений: 3
Регистрация: 26-11-09
Пользователь №: 53 890
|
Доброго времени суток. Я начал работать в SOPC Builder (Q8.1) и столкнулся с проблемой: мне необходимо создать свой условно говоря интерфейсик, для этого я хочу создать в SOPC свой компонент который будет состоять только из сигналов входов и выходов, но, создав такой компонент он не размещается в системе, а точнее он не попадает в адресное пространство. Кто-то может подсказать что-то? Как правильно создать компонент в сопк баилдер состоящий из портов входов и выходов?
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|