|
nios2 на ките Cyclone II для чайников, простейший проект |
|
|
|
Feb 6 2008, 12:36
|
Участник

Группа: Свой
Сообщений: 60
Регистрация: 1-03-05
Из: Калуга, СССР
Пользователь №: 2 957

|
есть альтервский "Cyclone II FPGA Starter Development Kit", установлен квартус 7.0 с двд от кита (с правленой лицензией, полный, не веб) и все что ставится по умолчанию. есть примеры с цд от кита. cii_starter_nios.v скачал...
уважаемые гуру, может кто поделится простейшим проектом - типа вывести в rs232 "хелло ворд" и помигать светодиодиком?
пока не могу сообразить, как "С" исходник к проекту прицепить... прошу прошения за возможную нечеткость формулировок.
|
|
|
|
|
 |
Ответов
(1 - 48)
|
Feb 6 2008, 13:52
|
Участник

Группа: Свой
Сообщений: 60
Регистрация: 1-03-05
Из: Калуга, СССР
Пользователь №: 2 957

|
Цитата(RHnd @ Feb 6 2008, 16:22)  Нужно установить Nios IDE и создать в нем проект. я слегка криво сформулировал... чтоя делаю: из примеров беру "cii_starter_nios" (брал и то что было изначально, и пересобирал сам), это, как я понял, "железная" часть системы - проц с переферией и памятью. заливаю получившийся .sof в кит - начинают моргать 7-ми сегментные индикаторы. далее я я запускаю niosIIide, создаю проект на базе шаблона с "хелло ворд", указывая system_0.ptf из cii_starter_nios директории - этим, судя по всему, я говорю компилятору о своем железе. смотрю make-файл - все так и есть. делаю билд-алл, все проходит нормально. потом пытаюсь запустить на плате кита: run - run as - nios II hardware, происходит загрузка через USB-бластер с остановкой процессора, но при верификации выдается ошибка по памяти в 400000-40F0DB как я понял, это несовпадение железа (то что в квартусе сделано) с пониманием этого железа у компилятора-линкера... подскажите именно по этой DK-CYCII-2C20N плате, с чего начать, чтоб получилось взаимопонимание у компилятора и квартуса?
|
|
|
|
|
Feb 6 2008, 14:41
|
Участник

Группа: Свой
Сообщений: 60
Регистрация: 1-03-05
Из: Калуга, СССР
Пользователь №: 2 957

|
Цитата(RHnd @ Feb 6 2008, 17:25)  У меня все почти работало из проблем. Что приходит в голову: 1) Проверить свойства библиотеки - где долен размещаться код программы, данные, стек, куча и т.п.. 2) В СОПС проверить, какой переферии соответствуют указанные адреса. Возможно, пересобрать. 3) В system.h проверить соответствие переферия-адреса тому, что указано в сопсе. вопросы такие: работали именно с DK-CYCII-2C20N платой? создавали свой проект с ниосом, или использовали готовый "cii_starter_nios"? а документация на пример из кита "cii_starter_nios" существует, или и так должно быть все понятно?
|
|
|
|
|
Feb 6 2008, 14:56
|
Знающий
   
Группа: Свой
Сообщений: 518
Регистрация: 12-04-07
Из: Санкт-Петербург
Пользователь №: 26 997

|
Цитата(Vasily_A @ Feb 6 2008, 17:41)  вопросы такие: работали именно с DK-CYCII-2C20N платой? создавали свой проект с ниосом, или использовали готовый "cii_starter_nios"? а документация на пример из кита "cii_starter_nios" существует, или и так должно быть все понятно? Да, именно эта плата. Она у меня как основной отладочный стенд.  В основном - свой проект с ниосом. Когда пришла плата, еще не было выложенно на сайте альтеры недостающего файла. Так что пришлось по по образцу сопса создавать свой ниос. Потом, когда файл выложили, вроде запускал и их фирменный пример. Я же тогда, как и сейчас, учился только. Повсюду тыкался, так что уже и не помню, что сразу пошло, а где экспериментировал. Документации, афаир, нету. Это же не ниос-плата. Вот еще подумал - проверьте в проекте unused pins. Попробуйте as input tristated.
|
|
|
|
|
Feb 6 2008, 16:16
|
Участник

Группа: Свой
Сообщений: 60
Регистрация: 1-03-05
Из: Калуга, СССР
Пользователь №: 2 957

|
Цитата(RHnd @ Feb 6 2008, 17:56)  Да, именно эта плата. Она у меня как основной отладочный стенд.  В основном - свой проект с ниосом. Когда пришла плата, еще не было выложенно на сайте альтеры недостающего файла. Так что пришлось по по образцу сопса создавать свой ниос. Потом, когда файл выложили, вроде запускал и их фирменный пример. Я же тогда, как и сейчас, учился только. Повсюду тыкался, так что уже и не помню, что сразу пошло, а где экспериментировал. Документации, афаир, нету. Это же не ниос-плата. Вот еще подумал - проверьте в проекте unused pins. Попробуйте as input tristated. Какие версии софта? у меня квартус 7.0 из кита. может поделишся минимально рабочим проектом с ниосом? ОПА! заработало! прошил в плату тайм-лимитед версию .sof (ту что сам собрал), и пример написал мне "хелло от ниоса2" в окне j-тага. осталось понять как собрать полноценный (не тайм-лимитед) вариант...
|
|
|
|
|
Feb 6 2008, 16:43
|
Участник

Группа: Свой
Сообщений: 60
Регистрация: 1-03-05
Из: Калуга, СССР
Пользователь №: 2 957

|
Цитата(RHnd @ Feb 6 2008, 19:18)  Хм. Вообще, тайм-лимитид зависит от лицензии на ниос и не зависит от сборки. В комплекте к этой плате лицензии на ниос нет, только демонстрационная тайм-лимитид версия. лицензия у меня леченая, но может недолеченная... кто может пояснить, где посмотреть тип лицензии, и что делать, чтоб плата могла работать автономно? задачка у меня такая - брать с кодека сигнал (примерно звукового диапазона), анализировать его, и выдавать результат на ком-порт. естественно, рядом стоящего компа с запущенным квартусом не планируется  изначальная проблема, судя по всему, в кривом примере в ките от альтеры - если самособраный ограниченый .sof стартует с ноликами на индикаторах, то готовый от альтеры рисует там дергающийся мусор.
|
|
|
|
|
Feb 6 2008, 17:16
|
Частый гость
 
Группа: Свой
Сообщений: 139
Регистрация: 12-10-07
Пользователь №: 31 308

|
Цитата есть альтервский "Cyclone II FPGA Starter Development Kit", установлен квартус 7.0 с двд от кита (с правленой лицензией, полный, не веб) и все что ставится по умолчанию. есть примеры с цд от кита. У меня вот этот пример. Kits\CycloneII_Starter_Kit-v1.0.0\Examples\CII_Starter_demonstrations\CII_Starter_NIOS При заливке проца в плату, семисегментные индикаторы не выставлялись в нули. И некотороые красные и зеленые светодиоды загорались. Скачал с терастика их демонстрашку, они одинаковы но не знаю почему то с терастиком у меня не было проблем. \Kits\DE1_CD_v06\DE1_demonstrations\DE1_NIOS - без проблем процессор залился в плату, на семисегментном индикаторе все нули, ни один из светодиодов не горит. Так понял это начальная установка. Или у кого то по другому? После загружаю программу, сначала посмотри hello led что из примеров nios2ide, поставив там свои базовые адреса. Потом написал программу и помигал светодиодами, вот код на си 4. Включение любых переключателей от SW0 до SW7 включает светодиоды от LEDG0 до LEDG7. #include <stdio.h> #include "system.h" #include "altera_avalon_pio_regs.h" #include "alt_types.h" char ch; int main() { while (1) { ch =IORD_ALTERA_AVALON_PIO_DATA(0x00481050); IOWR_ALTERA_AVALON_PIO_DATA(0x00481020, ch); } return 0; } вместо этого 0x00481050 поставь свой адрес переключателя а вместо вот этого 0x00481020 - адрес светодиода Адреса брал из первой страницы SOPC Buildera, там где схема соединений нарисована. Если не хочешь цифры писать зайди в system.h и посмотри как обозначаются переключатели и светодиоды. И их впиши вместо цифр. Просто когда писал программу не знал этого, а когда заработало все не захотел в этой программе ничего менять и оставил так.  Вот нашел где я вместо цифрового адреса вставил его обозначение LED_PIO_BASE 5.пересчет светодиодов не виден, быстро выставляются все светодиоды в единицу. #include <stdio.h> #include "system.h" #include "altera_avalon_pio_regs.h" int main () { int i; printf("Hello from Nios II!\n"); for(i=0;i<256;i++) { IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,i); } return 0; } ############################################################# 6.способ создания задержки void delay(void) { volatile int i; i=0; while (i<400000) i++; } ############################################################### 7.пересчет светодиодов уже виден. #include <stdio.h> #include "system.h" #include "altera_avalon_pio_regs.h" int main() {int i; printf("Hello from Nios II!\n"); for(i=0;i<256;i++) { volatile int j; j=0; while (j<400000) j++; IOWR_ALTERA_AVALON_PIO_DATA(0x00481020,i); } return 0; } почему то в седьмом примере обратно поставил цифровой адрес , не помню почему вроде и так и так работает, в блокноте у меня записаны те программы которые заработали.
|
|
|
|
|
Feb 6 2008, 20:19
|
Участник

Группа: Свой
Сообщений: 60
Регистрация: 1-03-05
Из: Калуга, СССР
Пользователь №: 2 957

|
Спасибо! скачал DE1_CD_v06.zip посмотрю что там интересного...
|
|
|
|
|
Feb 7 2008, 13:27
|
Участник

Группа: Свой
Сообщений: 60
Регистрация: 1-03-05
Из: Калуга, СССР
Пользователь №: 2 957

|
некий промежуточный результат:
system_0.ptf и DE1_NIOS.sof из DE1_CD_v06.zip оказались работоспособными, а отличие от альтеровских.
написал простенький пример (ориентируясь на prog_sun):
#include <stdio.h> #include "system.h" #include "altera_avalon_pio_regs.h" #include "alt_types.h" void delay(void); //------------------------------------------------------- int main() { int i; int n=0; printf("Hello from Nios II!\r\n"); while(1) { for(i=0;i<256;i++) { IOWR_ALTERA_AVALON_PIO_DATA(LEDG_BASE,i); delay(); printf("n=%d\r\n",n); n++; } } return 0; } //------------------------------------------------------- void delay(void) { volatile int i; i=0; while (i<500000) i++; } //-------------------------------------------------------
откомпилировал, залил - результат порадовал: в ком-порт на скорости 115200 выдается все что ожидается, светодиодики моргают.
закрыл ниос-иде, запитал плату от лабораторного блока, вытащил ЮСБ из платы - работает! ест по 7.5в от блока 420ма.
планы на ближайшее будущее: 1. собрать проц с таймерами, интерфейсом к кодеку, умножителями и, возможно, вга. 2. научиться запускать это все с пзу. 3. написать обработку сигнала - сначала на базе БПФ точек на 32, а далее по результатам на железе.
если у кого есть опыт по пунктам 1 и 2, подскажите более простой путь (если бы не конфа, я с альтеровским китовым софтом так и завяз бы...)
Сообщение отредактировал Vasily_A - Feb 7 2008, 13:31
|
|
|
|
|
Feb 7 2008, 16:09
|
Участник

Группа: Свой
Сообщений: 60
Регистрация: 1-03-05
Из: Калуга, СССР
Пользователь №: 2 957

|
Цитата(RHnd @ Feb 7 2008, 18:36)  1-2) Читайте доки, пробуйте. 3) Расчеты на Ниосе? Нееее.... Лучше сразу пишите для железа и оформляйте как периферийный модуль для ниоса. доки вещь хорошая... в идеале надо получить такой вариант: прошитый в конфигурационное пзу ниос, и задачку для ниоса, по старту системы копируюшуюся из флеша в SRAM или SDRAM и оттуда стартующюю. а чем плох ниос для рассчетов? аппаратные умножители ипользовать он может? если загнать все - код и данные в SRAM, и сконфигурировать проц на "быстрый" вариант - неужели слабая числомолотилка получится? считать в целочисленном варианте, 32 разряда должны позволять. подобная задачка при работе под виндой, написаная на дельфи (но с плавучкой), с визуализацией и по 8-ми каналам сразу давала на П4-2ГГц 8% загрузки... для железа DSP-обработку я наверное пока морально не готов делать, да и оперативно менять сложней. задачка такая - стальная струна, около нее датчик (типа магнитофонной головки), и надо определять, находится струна внутри или снаружи азрозольного факела. соответственно система нужна обучаемая...
|
|
|
|
|
Feb 7 2008, 17:45
|
Знающий
   
Группа: Свой
Сообщений: 518
Регистрация: 12-04-07
Из: Санкт-Петербург
Пользователь №: 26 997

|
Цитата(Vasily_A @ Feb 7 2008, 19:09)  доки вещь хорошая... в идеале надо получить такой вариант: прошитый в конфигурационное пзу ниос, и задачку для ниоса, по старту системы копируюшуюся из флеша в SRAM или SDRAM и оттуда стартующюю. Тут даже думать особо не придется. Там автоматически встраивается загрузчик, копирующий при запуске код из флеш/конф. пзу/где еще он лежит в sram/sdram/где еще он там будет во время исполнения. Все это достаточно просто настраивается в свойствах системной библиотеки. Цитата(Vasily_A @ Feb 7 2008, 19:09)  а чем плох ниос для рассчетов? аппаратные умножители ипользовать он может? если загнать все - код и данные в SRAM, и сконфигурировать проц на "быстрый" вариант - неужели слабая числомолотилка получится? считать в целочисленном варианте, 32 разряда должны позволять.
подобная задачка при работе под виндой, написаная на дельфи (но с плавучкой), с визуализацией и по 8-ми каналам сразу давала на П4-2ГГц 8% загрузки... Да не то чтоб плох. Просто не предназначен. И умножители использовать будет, и загнать все в срам можно, и кеш кода/кеш данных сделать - все равно не то. Если собираетесь писать на C, то лучше сразу брать DSP контроллер. А если хотите быстро/сильно/веселей и взяли FPGA, то и использовать нужно именно ее ресурсы, а не встраиваемого контроллера. Хотя, попробуйте - может, под конкретное требуемое быстродействие и влезет. Где-то на форуме обсуждалась применимость ниоса. И, в целом, пришли к выводу, что его основная задача - координировать между собой самописную переферию. Плюс, ее тестировать. Плюс, реализоывать некоторые вещи, которые в виде FSM слишком тяжко делать. Например, Ethernet. Следует отметить, что это все - сугубо мое дилетантское мнение. Сейчас придут гуру и все расскажут.  Цитата(Vasily_A @ Feb 7 2008, 19:09)  для железа DSP-обработку я наверное пока морально не готов делать, да и оперативно менять сложней. задачка такая - стальная струна, около нее датчик (типа магнитофонной головки), и надо определять, находится струна внутри или снаружи азрозольного факела. соответственно система нужна обучаемая... Да там не сильно сложно, главное начать. По поводу оперативной замены и задачи - я понятия не имею, что есть азрозольный факел, но, похоже, Вы хотите получить некоторый адаптивный алгоритм идентификации и даже, возможно, управления (струну будете дергать?). Правильное решение таких проектов, на сколько я знаю, начинается либо с моделирования в том же MatLab, либо с написания работающего алгоритма для компа (С++, дельфи). На сколько я понял, алгоритм на дельфи уже реализован, все отлажено? Тогда что Вы собираетесь оперативно менять по ходу аппаратной реализации?
|
|
|
|
|
Feb 7 2008, 18:30
|
Участник

Группа: Свой
Сообщений: 60
Регистрация: 1-03-05
Из: Калуга, СССР
Пользователь №: 2 957

|
пытаюсь собрать свой процессор, пока не получается...
почему такой чуть странный выбор - dsp-задачка на fpga-ките: не смог найти ни одного дсп-кита с аудиокодеком за вменяемую цену и быстро покупаемого.
аэрозольный факел - примерно как на автомойке струя распыленной воды летит, только послабей. обучаемость алгоритма примерна такая: смотрим спектр сигнала в заведомо "пустой" области (там всякие шумы и собственные резонансы, причем непостоянные - механика стенда неидеальная) и по изменению спектра принимаем решене о том, что по струне начала бить струя микрокапелек.
еще один момент - уже не обязательный, но желательный - на этом ките вга выход есть, можно визуализацию спектра сделать в реальном времени для отладки, и вспомогательную индикацию на рабом экземпляре.
изделий всего порядка десятка ожидается, вот киты в них и поставлю, как покупное изделие... насколько меньше бумажек оформлять!!!
|
|
|
|
|
Feb 9 2008, 07:56
|
Частый гость
 
Группа: Свой
Сообщений: 139
Регистрация: 12-10-07
Пользователь №: 31 308

|
Цитата #include <stdio.h> #include "system.h" #include "altera_avalon_pio_regs.h" #include "alt_types.h" .... { IOWR_ALTERA_AVALON_PIO_DATA(LEDG_BASE,i); delay(); printf("n=%d\r\n",n); n++; } ...... откомпилировал, залил - результат порадовал: в ком-порт на скорости 115200 выдается все что ожидается, светодиодики моргают. И где в твоем коде обращение к ком порту? К примеру, мне нужно было из платы передавать данные в компьютер по компорту. Сделал простенькую программу, там фактически нужна одна строчка IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, данные);, и данные можно передать в компьютер. #include <stdio.h> #include "altera_avalon_uart_regs.h" #include "alt_types.h" #include"system.h" #include <io.h> char sh; int main() { while (1) { IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, 0x3); sh=IORD_ALTERA_AVALON_UART_TXDATA(UART_0_BASE); printf("sh=%d",sh); } return 0; } Число 0x3 передается из платы в компьютер. На экране Hyper Terminala видим знак в виде сердечки. А printf("sh=%d",sh); печатает это же число в окне nios2ide. Теперь надо прикрутить этот процессор к той программе, что в квартусе написано, и выводить числа по компорту в компьютер. Пока руки еще не дошли, времени не было. Но думаю, проблем не должно возникнуть, главное канал передачи данных есть. Вообще для работы с компортом можно еще использовать апноту 459 (an459.pdf и плюс пример кода an459_bit_bang_uart.rar), изложено все подробно. Остается только читать. Цитата аэрозольный факел - примерно как на автомойке струя распыленной воды летит, только послабей. обучаемость алгоритма примерна такая: смотрим спектр сигнала в заведомо "пустой" области (там всякие шумы и собственные резонансы, причем непостоянные - механика стенда неидеальная) и по изменению спектра принимаем решене о том, что по струне начала бить струя микрокапелек. Интересная задача. А есть ссылки на какие нибудь статьи по данной тематике?
|
|
|
|
|
Feb 9 2008, 10:12
|
Участник

Группа: Свой
Сообщений: 60
Регистрация: 1-03-05
Из: Калуга, СССР
Пользователь №: 2 957

|
Цитата(prog_sun @ Feb 9 2008, 10:56)  И где в твоем коде обращение к ком порту? А printf("sh=%d",sh); печатает это же число в окне nios2ide. просто надо переназначить stdin\stdout на uart вместо джитага (в свойствах проекта), и все работает именно по шнурку rs232 в терминал. Цитата(prog_sun @ Feb 9 2008, 10:56)  Вообще для работы с компортом можно еще использовать апноту 459 (an459.pdf и плюс пример кода an459_bit_bang_uart.rar), изложено все подробно. Остается только читать. Интересная задача. А есть ссылки на какие нибудь статьи по данной тематике? вопрос у меня теперь такой (собирать свой проц уже получается, в файле лицензий проблема была): какой синтаксис у обработчика прерывания? самый простой вариант, например таймер. может кто делал чтение с аудиокодека в память по дма?
|
|
|
|
|
Feb 9 2008, 11:50
|
Участник

Группа: Свой
Сообщений: 60
Регистрация: 1-03-05
Из: Калуга, СССР
Пользователь №: 2 957

|
Цитата(RHnd @ Feb 9 2008, 13:50)  Вам же уже сказали - читайте мануал и смотрите примеры. Среди стандартных примеров есть обработка прерывания таймера. <<Вам надо читать главу 5 Quartus HandBook - встроенная переферия. И смотреть примеры.>> в 5-й главе quartusii_handbook.pdf практически нет описания по части синтаксиса этой конкретной реализации "С", а как писать\читать\останавливать\запускать таймер мне и так понятно. какие именно примеры имеются в ввиду? читал. смотрел. как работать с таймером - понятно, там ничего нового по сравнению с микроконтороллерами нет. примеры перерыл все (те что с китом идут) - там с прерываниями есть работа в примере по определению летентности прерываний, но несколько неочевидным образом. у меня проблема именно в синтаксисе... может где есть именно описание платформо-зависимых расширений языка? о чем я говорю: например от версии к версии в avr-gcc менялись макросы по чтению программной памяти, и не имея примера или докуметации по этим изменениям, можно было убить много времени. там это все документировано, а в случае ниоса - даже описаний китовых примеров почти нет... неужели сложно написать 2-3 строчки? далее я по ним найду все... конкретный вопрос - есть timer_0 с 4-м irq, нужны сторочка: тип_функции имя_функции(параметры) { мой_код; возможный_код_завершения_прерывания; };
|
|
|
|
|
Feb 9 2008, 12:26
|
Участник

Группа: Свой
Сообщений: 60
Регистрация: 1-03-05
Из: Калуга, СССР
Пользователь №: 2 957

|
Цитата(vetal @ Feb 9 2008, 15:00)  Без разницы какое прерывание обрабатывать, от таймера или о уарта. Скачайте с сайта altera документик Nios II Software Developer's Handbook или архив со всей документацией. В разделе Exception Handling найдете примеры работы с прерываниями. уже нашел... минут 20 как уже. сразу после написания предыдущего письма, читаю... а примеры\аппноты кроме китовых для ниоса существуют? в принципе можно по библиотечным функциям пытаться разобраться, но хочется легкого пути.
|
|
|
|
|
Feb 9 2008, 17:01
|
Частый гость
 
Группа: Свой
Сообщений: 139
Регистрация: 12-10-07
Пользователь №: 31 308

|
Цитата а примеры\аппноты кроме китовых для ниоса существуют? в принципе можно по библиотечным функциям пытаться разобраться, но хочется легкого пути. Поищи здесь http://www.altera.com/literature/lit-an.jsp может что найдешь. Некоторые апноты с design example идут.
|
|
|
|
|
Feb 10 2008, 18:35
|
Участник

Группа: Свой
Сообщений: 60
Регистрация: 1-03-05
Из: Калуга, СССР
Пользователь №: 2 957

|
Мой работающий код - все совсем просто оказалось... может кому пригодится.
#include <stdio.h> #include "system.h" #include "altera_avalon_pio_regs.h" #include "alt_types.h" #include "basic_io.h"
#include "sys/alt_irq.h" #include "altera_avalon_timer.h" #include "altera_avalon_timer_regs.h"
void timerinit_int( void );
volatile int i_cnt;
//------------------------------------------------------- void ISR_timer_0( void * context, alt_u32 irqnum ) { i_cnt++; IOWR_ALTERA_AVALON_TIMER_STATUS (TIMER_0_BASE, 0); } //------------------------------------------------------- //------------------------------------------------------- int main() { int i; int n=0; i_cnt=0;
printf("Hello from Nios II!\r\n"); printf("init timer_0\r\n"); timerinit_int(); printf("Go!\r\n");
while(1) { for(i=0;i<256;i++) { IOWR_ALTERA_AVALON_PIO_DATA(LEDG_BASE,i); printf("n=%d i_cnt=%d\r\n",n,i_cnt); IOWR(SEG7_BASE,0,n); n++; usleep(100000); } } return 0; } //------------------------------------------------------- void timerinit_int( void ) { // Stop the Timer IOWR_ALTERA_AVALON_TIMER_CONTROL (TIMER_0_BASE, ALTERA_AVALON_TIMER_CONTROL_STOP_MSK); // Register ISR alt_irq_register (TIMER_0_IRQ, (void*)TIMER_0_BASE, ISR_timer_0); // Start timer IOWR_ALTERA_AVALON_TIMER_CONTROL (TIMER_0_BASE, ALTERA_AVALON_TIMER_CONTROL_ITO_MSK | ALTERA_AVALON_TIMER_CONTROL_CONT_MSK | ALTERA_AVALON_TIMER_CONTROL_START_MSK); } //-------------------------------------------------------
|
|
|
|
|
Feb 17 2008, 09:20
|
Частый гость
 
Группа: Свой
Сообщений: 139
Регистрация: 12-10-07
Пользователь №: 31 308

|
Цитата #include <stdio.h> #include "system.h" #include "altera_avalon_pio_regs.h" #include "alt_types.h" void delay(void); //------------------------------------------------------- int main() { int i; int n=0; printf("Hello from Nios II!\r\n"); while(1) { for(i=0;i<256;i++) { IOWR_ALTERA_AVALON_PIO_DATA(LEDG_BASE,i); delay(); printf("n=%d\r\n",n); n++; } } return 0; } //------------------------------------------------------- void delay(void) { volatile int i; i=0; while (i<500000) i++; } //-------------------------------------------------------
откомпилировал, залил - результат порадовал: в ком-порт на скорости 115200 выдается все что ожидается, светодиодики моргают. Цитата (prog_sun @ Feb 9 2008, 10:56)
И где в твоем коде обращение к ком порту? А printf("sh=%d",sh); печатает это же число в окне nios2ide.
просто надо переназначить stdin\stdout на uart вместо джитага (в свойствах проекта), и все работает именно по шнурку rs232 в терминал. Для обращения к Uartу достаточно написать IOХХ_ALTERA_AVALON_UART_XXDATA(address,data); а в вашем коде нет вообще обращения к UARTy. В коде как понял идет пересчет светодиодов на pio. Цитата просто надо переназначить stdin\stdout на uart вместо джитага (в свойствах проекта) причем тут джитаг? Вы передаете данные по Jtag-Uart ? Вообще ничего не понял. И как конфигурируется stdout device.
|
|
|
|
|
Feb 17 2008, 10:11
|
Участник

Группа: Свой
Сообщений: 60
Регистрация: 1-03-05
Из: Калуга, СССР
Пользователь №: 2 957

|
Цитата(prog_sun @ Feb 17 2008, 12:20)  Для обращения к Uartу достаточно написать IOХХ_ALTERA_AVALON_UART_XXDATA(address,data); а в вашем коде нет вообще обращения к UARTy. В коде как понял идет пересчет светодиодов на pio. причем тут джитаг? Вы передаете данные по Jtag-Uart ? Вообще ничего не понял. И как конфигурируется stdout device. чесное пионерское  , работает именно по rs232 шнурку, могу принт-скрин с терминала прислать в свойствах проекта, на закладке с системной библиотекой выбирается через что работает stdin, stdout и stderror. по умолчанию там стоит джитаг-варт, надо поставить просто варт (если он в системе есть, в демо-примере есть). по сути, это задает реализацию putchar (как и описано в стандарте "С"). можете сделать свой putchar, и у вас printf хоть морзянкой черех аудиокодек заработает. IOХХ_ALTERA_AVALON_UART_XXDATA(address,data) просто передаст data на порт, но не отследит завершение и не преобразует в нужный формат. на мелких процах (avr, x51, pic и подобное) имеет смысл реализовать свою библиотеку ввода-вывода в ком - получается быстрее и короче, но на "жирных" (арм, ниос) стоит этим заниматься, если совсем сильно прижмет (например отладочный вывод в прерываниях, чтоб с реентабельностью не сражаться) вот на VGA stdout сделать - это я пока не смог... но пытаюсь - причем в графике.
|
|
|
|
|
Feb 17 2008, 11:24
|
Частый гость
 
Группа: Свой
Сообщений: 139
Регистрация: 12-10-07
Пользователь №: 31 308

|
Цитата(Vasily_A @ Feb 17 2008, 13:11)  чесное пионерское  , работает именно по rs232 шнурку, могу принт-скрин с терминала прислать в свойствах проекта, на закладке с системной библиотекой выбирается через что работает stdin, stdout и stderror. по умолчанию там стоит джитаг-варт, надо поставить просто варт (если он в системе есть, в демо-примере есть). по сути, это задает реализацию putchar (как и описано в стандарте "С"). можете сделать свой putchar, и у вас printf хоть морзянкой черех аудиокодек заработает. Да, нашел в апноте459, (в прикрепленном файле показано, что у меня jtag-uart установлено в stdout stdin). Кстати у меня таймер не установлен там, а во вкладке нет вообще никакого таймера, только none. Цитата IOХХ_ALTERA_AVALON_UART_XXDATA(address,data) просто передаст data на порт, но не отследит завершение Почему? сижу сейчас разбираюсь с этим читаю про статус регистр и там бит TRDY. Написано, что когда txdata регистр пуст и готов для передачи данных TRDY=1. Когда txdata регистр заполнен TRDY=0. У меня такая проблема к примеру надо передать число b71b00(hex), так вот он передает только b7. Еще много других битов есть, сижу читаю их.
Эскизы прикрепленных изображений
|
|
|
|
|
Feb 17 2008, 11:49
|
Участник

Группа: Свой
Сообщений: 60
Регистрация: 1-03-05
Из: Калуга, СССР
Пользователь №: 2 957

|
Цитата(prog_sun @ Feb 17 2008, 14:24)  Да, нашел в апноте459, (в прикрепленном файле показано, что у меня jtag-uart установлено в stdout stdin). Кстати у меня таймер не установлен там, а во вкладке нет вообще никакого таймера, только none. Почему? сижу сейчас разбираюсь с этим читаю про статус регистр и там бит TRDY. Написано, что когда txdata регистр пуст и готов для передачи данных TRDY=1. Когда txdata регистр заполнен TRDY=0. У меня такая проблема к примеру надо передать число b71b00(hex), так вот он передает только b7. Еще много других битов есть, сижу читаю их. открываешь в квартусе проект из китовой папки с ниосом (копию на всякий случай сделай), в сопс-билдере добавляешь таймер (ну и что еще по вкусу), генеришь. потом делаешь билд-олл для всего проекта. естественно, нужен правильный файл лицензии и правленные длл. на основе собранного проекта делаешь проект в ниос2, выбирая для системной библиотеки собранный в квартусе проект, и все появится. Цитата(prog_sun @ Feb 17 2008, 14:24)  IOХХ_ALTERA_AVALON_UART_XXDATA(address,data) просто передаст data на порт, но не отследит завершение
Почему? сижу сейчас разбираюсь с этим читаю про статус регистр и там бит TRDY. Написано, что когда txdata регистр пуст и готов для передачи данных TRDY=1. Когда txdata регистр заполнен TRDY=0. У меня такая проблема к примеру надо передать число b71b00(hex), так вот он передает только b7. Еще много других битов есть, сижу читаю их. все, что ты сделаешь, разобравшись с регистрами ком-порта, уже реализовано в putchar. простейший вариант (без прерываний) - до записи в порт дожидаться завершения передачи, проверяя в цикле бит завершения передачи.
|
|
|
|
|
Feb 17 2008, 15:06
|
Участник

Группа: Свой
Сообщений: 60
Регистрация: 1-03-05
Из: Калуга, СССР
Пользователь №: 2 957

|
Цитата(vetal @ Feb 17 2008, 17:25)  переписывать не надо - там есть быстрые аналоги этой функции(alt_printf и пр). Стандартный printf на всех платформах медленный, т.к. там заложен заведомо большой функционал  Вся основа для программирования в sdk nios уже сделана - надо только подобрать из всего что имеется то, что вам нужно. если не использовать буфер на передачу (программный или аппаратный), то вопрос быстродействия почти не стоит - все равно почти все время на ожидание завершения передачи предыдущего символа тратится. написание своего минимального по объему кода для кома может сильно пригодиться, если пытаться запихнуть его в накристальную память, без внешнешней памяти.
|
|
|
|
|
Feb 17 2008, 15:52
|
Частый гость
 
Группа: Свой
Сообщений: 139
Регистрация: 12-10-07
Пользователь №: 31 308

|
Цитата переписывать не надо - там есть быстрые аналоги этой функции(alt_printf и пр). Стандартный printf на всех платформах медленный, т.к. там заложен заведомо большой функционал Изначально начал делать программу на основе small версии программы без этих всех принтов. В прошлых программах записав IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, 0x06); все передавалось без проблем и тут подумал что так будет. Но записав IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, 0xb74003); получил на выходе число 03. Так как пока еще не умею общаться с отладчиком, то решил использовать alt_putstr, printf не помогло. Это все проделывал со своим процессором. С подачи Vasily_A обратно перешел на демо процессор, все равно болячки остались. И вывод с использованием putchar тоже не помог. Тут torik подсказал поменять тип данных с int перешел на float. У Кернигана написано, что float - 32битное число, десять (плюс минус) 38 степени. Тоже не вышло. Даже, если использовать printf для вывода состояния status регистра, всегда получаю число 96. Это 1100000, т.е биты trdy и tmt установлены в 1. Это значит, что txdata регистр пуст и готов для передачи нового знака, так же сдвиговой регистр все что нужно передал, а не находится в процесе передачи. Т.е исходное состояние установлено. Ну и в чем дело у меня? Нашел на форуме альтеры сообщение "Need help for my RS232 in NIOS II" Hey, This is a function thats send one byte to the UART void UART1_T(unsigned char ch) { while((IORD_ALTERA_AVALON_UART_STATUS(UART1_BASE) & 0x040) != 0x040){ ;} IOWR_ALTERA_AVALON_UART_TXDATA(UART1_BASE,ch); } You only have to change UART1_BASE address to your UART address that you can find back in your system.h file Good luck Regards Karel Он честно написал, что это код для передачи одного байта. И этот код у меня работает и передает 0x03 вместо 0xb74003, т.е так же как и мой код. ""если пытаться запихнуть его в накристальную память, без внешнешней памяти. С alt_putchar, alt_printf и rediced device drivers это легко реализуется.И ничего писать не надо Как я уже и говорил - все уже есть, надо только найти и использовать!"" Так прога изначально использует on-chip memory, без внешней памяти. Все запихивается туда куда нужно :-) Передача хромает только.
Сообщение отредактировал prog_sun - Feb 17 2008, 16:09
|
|
|
|
|
Feb 17 2008, 16:16
|
Участник

Группа: Свой
Сообщений: 60
Регистрация: 1-03-05
Из: Калуга, СССР
Пользователь №: 2 957

|
ком-порт работает с 8-ми битными посылками, и передать 32 бита сам не может.
просто для иллюстрации (вариант не оптимальный)
int i; //my var 32bit IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, (i & 0x000000FF)); IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, ((i>>8) & 0x000000FF)); IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, ((i>>16) & 0x000000FF)); IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, ((i>>24) & 0x000000FF));
передаст 32 бита побайтно...
|
|
|
|
|
Feb 17 2008, 16:33
|
Частый гость
 
Группа: Свой
Сообщений: 139
Регистрация: 12-10-07
Пользователь №: 31 308

|
Цитата Попробуйте найти 2 отличия между char и int, тогда поймете почему у вас передается 0x03. Уважаемый Vetal ставил и char в самом начале :-) передается 03. char 8 битная, а int -16 битная. Цитата(Vasily_A @ Feb 17 2008, 19:16)  ком-порт работает с 8-ми битными посылками, и передать 32 бита сам не может.
просто для иллюстрации (вариант не оптимальный)
int i; //my var 32bit IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, (i & 0x000000FF)); IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, ((i>>8) & 0x000000FF)); IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, ((i>>16) & 0x000000FF)); IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, ((i>>24) & 0x000000FF));
передаст 32 бита побайтно... Это ясно что com порт работает с 8 битами достаточно посмотреть на регистр txdata что в Uart core.pdf Весь вопрос в том как передать число. А код не понял, поймет ли ниос что i -длина разрядности числа?
|
|
|
|
|
Feb 17 2008, 17:00
|
Участник

Группа: Свой
Сообщений: 60
Регистрация: 1-03-05
Из: Калуга, СССР
Пользователь №: 2 957

|
Цитата(prog_sun @ Feb 17 2008, 19:33)  Уважаемый Vetal ставил и char в самом начале :-) передается 03. char 8 битная, а int -16 битная. Это ясно что com порт работает с 8 битами достаточно посмотреть на регистр txdata что в Uart core.pdf Весь вопрос в том как передать число. А код не понял, поймет ли ниос что i -длина разрядности числа? int - в общем случае, не 16бит. конкретно для ниос2 в нашей реализации - 32бит. i это просто перменная типа "int" мы о азыке "С" говорим? разве возможны разночтения для строки int i; //my var 32bit в "С"? единственно, что "//" это символ комментария, но я посчитал это очевидным что можно не понять? берем, например 0х12345678, сдвигаем (например) на 16 бит - получаем 0х00001234, отгрызаем 8бит (& 0x000000FF) получаем 0х34
|
|
|
|
|
Feb 17 2008, 17:03
|

Гуру
     
Группа: Модераторы
Сообщений: 2 095
Регистрация: 27-08-04
Из: Россия, СПб
Пользователь №: 553

|
Цитата Уважаемый Vetal ставил и char в самом начале :-) передается 03. char 8 битная, а int -16 битная. int 32 Бита для nios2. Cейчас практически везде принято брать int равным 4м байтам, хотя иногда встречается что int равен разрядности процессора. из файла nios2.h : Код /********************** * Layout of Source Language Data Types **********************/ #define INT_TYPE_SIZE 32 #define SHORT_TYPE_SIZE 16 #define LONG_TYPE_SIZE 32 #define LONG_LONG_TYPE_SIZE 64 #define FLOAT_TYPE_SIZE 32 #define DOUBLE_TYPE_SIZE 64 #define LONG_DOUBLE_TYPE_SIZE DOUBLE_TYPE_SIZE Цитата А код не понял, поймет ли ниос что i -длина разрядности числа nios сделает ровно то, что вы ему скажете. в примере последовательно передаются 4 байта 32разрядного числа. В какой последовательности их передавать - решает программист.
|
|
|
|
|
Feb 17 2008, 17:17
|
Частый гость
 
Группа: Свой
Сообщений: 139
Регистрация: 12-10-07
Пользователь №: 31 308

|
error: parse error before "__builtin_stwio" выдает такую ошибку на IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, (i & 0x000000FF)); Each Load and Store instruction has a version intended for accessing locations in I/O device interfaces. These instructions are: • ldwio (LoadWord I/O) • ldbio (Load Byte I/O) • ldbuio (Load Byte Unsigned I/O) • ldhio (Load Halfword I/O) • ldhuio (Load Halfword Unsigned I/O) • stwio (StoreWord I/O)• stbio (Store Byte I/O) • sthio (Store Halfword I/O) "например, тип INT соответствует 16-битовому числу со знаком, т.е. числу, лежащему между -32768 и +32767. Число типа FLOAT — это 32-битовое число, имеющее около семи значащих цифр и лежащее в диапазоне от 10е-38 до 10е+38. В главе 2 приводится список размеров для других машин." - это цитата из Кернигана Цитата #define INT_TYPE_SIZE 32 спасибо, но то что int 32 разрядный не решает моей проблемы, поверьте и int и все что угодно ставил :-)
|
|
|
|
|
Feb 17 2008, 19:00
|
Участник

Группа: Свой
Сообщений: 60
Регистрация: 1-03-05
Из: Калуга, СССР
Пользователь №: 2 957

|
вот это выводит в джитаг-варт "Hello from Nios II! (jtag UART)", а в rs232 4-ре символа "4321" (их хекс-коды 0х34 0х33 0х32 0х31) проверил только что  ================================================================= #include <stdio.h> #include "system.h" #include "altera_avalon_uart_regs.h" void UART0_TX(unsigned char ch) { while((IORD_ALTERA_AVALON_UART_STATUS(UART_0_BASE) & 0x40) != 0x40); IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE,ch); } int main() { printf("Hello from Nios II! (jtag UART) \n"); int i=0x31323334; UART0_TX(i & 0xFF); UART0_TX((i>>8) & 0xFF); UART0_TX((i>>16) & 0xFF); UART0_TX((i>>24) & 0xFF); return 0; } ================================================================= P.S. задолбал меня квартус и ниос сложностью копирования\модификации проектов...
|
|
|
|
|
Feb 18 2008, 06:25
|

МедвеД Инженер I
   
Группа: Свой
Сообщений: 816
Регистрация: 21-10-04
Пользователь №: 951

|
Цитата(Vasily_A @ Feb 18 2008, 04:00)  .....
P.S. задолбал меня квартус и ниос сложностью копирования\модификации проектов... Да нет никаких сложностей как раз сложность только в 3-х вещах Лень читать доку, лень искать в доке ключевые слова и фразы, лень просто гуглить тут на форуме такое часто бывает...болезнь...имхо
--------------------
Cogito ergo sum
|
|
|
|
|
May 29 2008, 05:50
|

Местный
  
Группа: Свой
Сообщений: 322
Регистрация: 13-12-05
Пользователь №: 12 147

|
Здрасте. Вот решил прикрутить VGA для DE1. Это те которые идут для кита. После заливки на кит, есть мусор на экране. Значить работает. Теперь ослталось написать программу. Использую графический режим. #include "altera_up_avalon_vga.h" в основной программе.
надо сперва открыть, alt_up_vga_dev* alt_up_vga_open_dev(const char *name), вот какое имя набивать? потом int alt_up_vga_draw_pixel(alt_up_vga_dev *vga, alt_u32 pixel, alt_u32 x, alt_u32 y) пиксели довать. Только что надо вбить вместо *vga, просто в дебагере структура как глобальная переменная есть, vga_0, а если вбить то ругается. Короче надо самому структуру набирать? Ваще есть примеры с работой с этим модулем?
|
|
|
|
|
Jul 15 2008, 15:57
|

Участник

Группа: Новичок
Сообщений: 33
Регистрация: 28-08-06
Пользователь №: 19 889

|
Цитата(Vasily_A @ Feb 6 2008, 17:52)  я слегка криво сформулировал...
далее я я запускаю niosIIide, создаю проект на базе шаблона с "хелло ворд", указывая system_0.ptf из cii_starter_nios директории - этим, судя по всему, я говорю компилятору о своем железе.
смотрю make-файл - все так и есть. А что вы смотрите в make-файле? И как понимаете, что все так и есть?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|