Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: nios2 на ките Cyclone II для чайников
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
Vasily_A
есть альтервский "Cyclone II FPGA Starter Development Kit", установлен квартус 7.0 с двд от кита (с правленой лицензией, полный, не веб) и все что ставится по умолчанию. есть примеры с цд от кита.
cii_starter_nios.v скачал...

уважаемые гуру, может кто поделится простейшим проектом - типа вывести в rs232 "хелло ворд" и помигать светодиодиком?

пока не могу сообразить, как "С" исходник к проекту прицепить...
прошу прошения за возможную нечеткость формулировок.
RHnd
Цитата(Vasily_A @ Feb 6 2008, 15:36) *
есть альтервский "Cyclone II FPGA Starter Development Kit", установлен квартус 7.0 с двд от кита (с правленой лицензией, полный, не веб) и все что ставится по умолчанию. есть примеры с цд от кита.
cii_starter_nios.v скачал...

уважаемые гуру, может кто поделится простейшим проектом - типа вывести в rs232 "хелло ворд" и помигать светодиодиком?

пока не могу сообразить, как "С" исходник к проекту прицепить...
прошу прошения за возможную нечеткость формулировок.

Нужно установить Nios IDE и создать в нем проект.
Vasily_A
Цитата(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 плате, с чего начать, чтоб получилось взаимопонимание у компилятора и квартуса?
RHnd
У меня все почти работало из проблем. Что приходит в голову:
1) Проверить свойства библиотеки - где долен размещаться код программы, данные, стек, куча и т.п..
2) В СОПС проверить, какой переферии соответствуют указанные адреса. Возможно, пересобрать.
3) В system.h проверить соответствие переферия-адреса тому, что указано в сопсе.
Vasily_A
Цитата(RHnd @ Feb 6 2008, 17:25) *
У меня все почти работало из проблем. Что приходит в голову:
1) Проверить свойства библиотеки - где долен размещаться код программы, данные, стек, куча и т.п..
2) В СОПС проверить, какой переферии соответствуют указанные адреса. Возможно, пересобрать.
3) В system.h проверить соответствие переферия-адреса тому, что указано в сопсе.


вопросы такие:
работали именно с DK-CYCII-2C20N платой?
создавали свой проект с ниосом, или использовали готовый "cii_starter_nios"?
а документация на пример из кита "cii_starter_nios" существует, или и так должно быть все понятно?
RHnd
Цитата(Vasily_A @ Feb 6 2008, 17:41) *
вопросы такие:
работали именно с DK-CYCII-2C20N платой?
создавали свой проект с ниосом, или использовали готовый "cii_starter_nios"?
а документация на пример из кита "cii_starter_nios" существует, или и так должно быть все понятно?

Да, именно эта плата. Она у меня как основной отладочный стенд. smile.gif
В основном - свой проект с ниосом. Когда пришла плата, еще не было выложенно на сайте альтеры недостающего файла. Так что пришлось по по образцу сопса создавать свой ниос. Потом, когда файл выложили, вроде запускал и их фирменный пример. Я же тогда, как и сейчас, учился только. Повсюду тыкался, так что уже и не помню, что сразу пошло, а где экспериментировал.
Документации, афаир, нету. Это же не ниос-плата.

Вот еще подумал - проверьте в проекте unused pins. Попробуйте as input tristated.
Vasily_A
Цитата(RHnd @ Feb 6 2008, 17:56) *
Да, именно эта плата. Она у меня как основной отладочный стенд. smile.gif
В основном - свой проект с ниосом. Когда пришла плата, еще не было выложенно на сайте альтеры недостающего файла. Так что пришлось по по образцу сопса создавать свой ниос. Потом, когда файл выложили, вроде запускал и их фирменный пример. Я же тогда, как и сейчас, учился только. Повсюду тыкался, так что уже и не помню, что сразу пошло, а где экспериментировал.
Документации, афаир, нету. Это же не ниос-плата.

Вот еще подумал - проверьте в проекте unused pins. Попробуйте as input tristated.


Какие версии софта? у меня квартус 7.0 из кита.
может поделишся минимально рабочим проектом с ниосом?

ОПА! заработало! прошил в плату тайм-лимитед версию .sof (ту что сам собрал), и пример написал мне "хелло от ниоса2" в окне j-тага.

осталось понять как собрать полноценный (не тайм-лимитед) вариант...
RHnd
Хм. Вообще, тайм-лимитид зависит от лицензии на ниос и не зависит от сборки. В комплекте к этой плате лицензии на ниос нет, только демонстрационная тайм-лимитид версия.
Vasily_A
Цитата(RHnd @ Feb 6 2008, 19:18) *
Хм. Вообще, тайм-лимитид зависит от лицензии на ниос и не зависит от сборки. В комплекте к этой плате лицензии на ниос нет, только демонстрационная тайм-лимитид версия.


лицензия у меня леченая, но может недолеченная...

кто может пояснить, где посмотреть тип лицензии, и что делать, чтоб плата могла работать автономно?

задачка у меня такая - брать с кодека сигнал (примерно звукового диапазона), анализировать его, и выдавать результат на ком-порт. естественно, рядом стоящего компа с запущенным квартусом не планируется sad.gif

изначальная проблема, судя по всему, в кривом примере в ките от альтеры - если самособраный ограниченый .sof стартует с ноликами на индикаторах, то готовый от альтеры рисует там дергающийся мусор.
prog_sun
Цитата
есть альтервский "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 и посмотри как обозначаются переключатели и светодиоды. И их впиши вместо цифр. Просто когда писал программу не знал этого, а когда заработало все не захотел в этой программе ничего менять и оставил так. smile.gif

Вот нашел где я вместо цифрового адреса вставил его обозначение 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;
}

почему то в седьмом примере обратно поставил цифровой адрес , не помню почему вроде и так и так работает, в блокноте у меня записаны те программы которые заработали.
Vasily_A
Спасибо!
скачал DE1_CD_v06.zip посмотрю что там интересного...
Vasily_A
некий промежуточный результат:

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, подскажите более простой путь (если бы не конфа, я с альтеровским китовым софтом так и завяз бы...)
RHnd
1-2) Читайте доки, пробуйте.
3) Расчеты на Ниосе? Нееее.... Лучше сразу пишите для железа и оформляйте как периферийный модуль для ниоса.
Vasily_A
Цитата(RHnd @ Feb 7 2008, 18:36) *
1-2) Читайте доки, пробуйте.
3) Расчеты на Ниосе? Нееее.... Лучше сразу пишите для железа и оформляйте как периферийный модуль для ниоса.


доки вещь хорошая...
в идеале надо получить такой вариант: прошитый в конфигурационное пзу ниос, и задачку для ниоса, по старту системы копируюшуюся из флеша в SRAM или SDRAM и оттуда стартующюю.

а чем плох ниос для рассчетов? аппаратные умножители ипользовать он может?
если загнать все - код и данные в SRAM, и сконфигурировать проц на "быстрый" вариант - неужели слабая числомолотилка получится? считать в целочисленном варианте, 32 разряда должны позволять.

подобная задачка при работе под виндой, написаная на дельфи (но с плавучкой), с визуализацией и по 8-ми каналам сразу давала на П4-2ГГц 8% загрузки...

для железа DSP-обработку я наверное пока морально не готов делать, да и оперативно менять сложней. задачка такая - стальная струна, около нее датчик (типа магнитофонной головки), и надо определять, находится струна внутри или снаружи азрозольного факела. соответственно система нужна обучаемая...
RHnd
Цитата(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.

Следует отметить, что это все - сугубо мое дилетантское мнение. Сейчас придут гуру и все расскажут. smile.gif

Цитата(Vasily_A @ Feb 7 2008, 19:09) *
для железа DSP-обработку я наверное пока морально не готов делать, да и оперативно менять сложней. задачка такая - стальная струна, около нее датчик (типа магнитофонной головки), и надо определять, находится струна внутри или снаружи азрозольного факела. соответственно система нужна обучаемая...

Да там не сильно сложно, главное начать. По поводу оперативной замены и задачи - я понятия не имею, что есть азрозольный факел, но, похоже, Вы хотите получить некоторый адаптивный алгоритм идентификации и даже, возможно, управления (струну будете дергать?). Правильное решение таких проектов, на сколько я знаю, начинается либо с моделирования в том же MatLab, либо с написания работающего алгоритма для компа (С++, дельфи). На сколько я понял, алгоритм на дельфи уже реализован, все отлажено? Тогда что Вы собираетесь оперативно менять по ходу аппаратной реализации?
Vasily_A
пытаюсь собрать свой процессор, пока не получается...

почему такой чуть странный выбор - dsp-задачка на fpga-ките: не смог найти ни одного дсп-кита с аудиокодеком за вменяемую цену и быстро покупаемого.

аэрозольный факел - примерно как на автомойке струя распыленной воды летит, только послабей.
обучаемость алгоритма примерна такая: смотрим спектр сигнала в заведомо "пустой" области (там всякие шумы и собственные резонансы, причем непостоянные - механика стенда неидеальная) и по изменению спектра принимаем решене о том, что по струне начала бить струя микрокапелек.

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

изделий всего порядка десятка ожидается, вот киты в них и поставлю, как покупное изделие... насколько меньше бумажек оформлять!!!
prog_sun
Цитата
#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), изложено все подробно. Остается только читать.

Цитата
аэрозольный факел - примерно как на автомойке струя распыленной воды летит, только послабей.
обучаемость алгоритма примерна такая: смотрим спектр сигнала в заведомо "пустой" области (там всякие шумы и собственные резонансы, причем непостоянные - механика стенда неидеальная) и по изменению спектра принимаем решене о том, что по струне начала бить струя микрокапелек.

Интересная задача. А есть ссылки на какие нибудь статьи по данной тематике?
Vasily_A
Цитата(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), изложено все подробно. Остается только читать.
Интересная задача. А есть ссылки на какие нибудь статьи по данной тематике?


вопрос у меня теперь такой (собирать свой проц уже получается, в файле лицензий проблема была):

какой синтаксис у обработчика прерывания? самый простой вариант, например таймер.

может кто делал чтение с аудиокодека в память по дма?
RHnd
Цитата(Vasily_A @ Feb 9 2008, 13:12) *
какой синтаксис у обработчика прерывания? самый простой вариант, например таймер.

Вам же уже сказали - читайте мануал и смотрите примеры. Среди стандартных примеров есть обработка прерывания таймера.
Vasily_A
Цитата(RHnd @ Feb 9 2008, 13:50) *
Вам же уже сказали - читайте мануал и смотрите примеры. Среди стандартных примеров есть обработка прерывания таймера.


<<Вам надо читать главу 5 Quartus HandBook - встроенная переферия. И смотреть примеры.>>

в 5-й главе quartusii_handbook.pdf практически нет описания по части синтаксиса этой конкретной реализации "С", а как писать\читать\останавливать\запускать таймер мне и так понятно. какие именно примеры имеются в ввиду?

читал. смотрел. как работать с таймером - понятно, там ничего нового по сравнению с микроконтороллерами нет. примеры перерыл все (те что с китом идут) - там с прерываниями есть работа в примере по определению летентности прерываний, но несколько неочевидным образом.
у меня проблема именно в синтаксисе...

может где есть именно описание платформо-зависимых расширений языка?
о чем я говорю: например от версии к версии в avr-gcc менялись макросы по чтению программной памяти, и не имея примера или докуметации по этим изменениям, можно было убить много времени. там это все документировано, а в случае ниоса - даже описаний китовых примеров почти нет...

неужели сложно написать 2-3 строчки? далее я по ним найду все...

конкретный вопрос - есть timer_0 с 4-м irq, нужны сторочка:

тип_функции имя_функции(параметры) { мой_код; возможный_код_завершения_прерывания; };
vetal
Без разницы какое прерывание обрабатывать, от таймера или о уарта.
Скачайте с сайта altera документик Nios II Software Developer's Handbook или архив со всей документацией. В разделе Exception Handling найдете примеры работы с прерываниями.
Vasily_A
Цитата(vetal @ Feb 9 2008, 15:00) *
Без разницы какое прерывание обрабатывать, от таймера или о уарта.
Скачайте с сайта altera документик Nios II Software Developer's Handbook или архив со всей документацией. В разделе Exception Handling найдете примеры работы с прерываниями.


уже нашел... минут 20 как уже. сразу после написания предыдущего письма, читаю...

а примеры\аппноты кроме китовых для ниоса существуют? в принципе можно по библиотечным функциям пытаться разобраться, но хочется легкого пути.
vetal
Цитата
а примеры\аппноты кроме китовых для ниоса существуют?

Примеры использования в хэндбуке есть.
prog_sun
Цитата
а примеры\аппноты кроме китовых для ниоса существуют? в принципе можно по библиотечным функциям пытаться разобраться, но хочется легкого пути.



Поищи здесь http://www.altera.com/literature/lit-an.jsp может что найдешь. Некоторые апноты с design example идут.
Vasily_A
Мой работающий код - все совсем просто оказалось...
может кому пригодится.

#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);
}
//-------------------------------------------------------
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 выдается все что ожидается, светодиодики моргают.

Цитата
(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.
Vasily_A
Цитата(prog_sun @ Feb 17 2008, 12:20) *
Для обращения к Uartу достаточно написать IOХХ_ALTERA_AVALON_UART_XXDATA(address,data); а в вашем коде нет вообще обращения к UARTy. В коде как понял идет пересчет светодиодов на pio.
причем тут джитаг? Вы передаете данные по Jtag-Uart ? Вообще ничего не понял. И как конфигурируется stdout device.


чесное пионерское smile.gif , работает именно по rs232 шнурку, могу принт-скрин с терминала прислать smile.gif

в свойствах проекта, на закладке с системной библиотекой выбирается через что работает stdin, stdout и stderror. по умолчанию там стоит джитаг-варт, надо поставить просто варт (если он в системе есть, в демо-примере есть).
по сути, это задает реализацию putchar (как и описано в стандарте "С"). можете сделать свой putchar, и у вас printf хоть морзянкой черех аудиокодек заработает.

IOХХ_ALTERA_AVALON_UART_XXDATA(address,data) просто передаст data на порт, но не отследит завершение и не преобразует в нужный формат. на мелких процах (avr, x51, pic и подобное) имеет смысл реализовать свою библиотеку ввода-вывода в ком - получается быстрее и короче, но на "жирных" (арм, ниос) стоит этим заниматься, если совсем сильно прижмет (например отладочный вывод в прерываниях, чтоб с реентабельностью не сражаться)

вот на VGA stdout сделать - это я пока не смог... но пытаюсь - причем в графике.
prog_sun
Цитата(Vasily_A @ Feb 17 2008, 13:11) *
чесное пионерское smile.gif , работает именно по rs232 шнурку, могу принт-скрин с терминала прислать smile.gif

в свойствах проекта, на закладке с системной библиотекой выбирается через что работает 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. Еще много других битов есть, сижу читаю их.
torik
может проблема с типом переменых?
Vasily_A
Цитата(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.
простейший вариант (без прерываний) - до записи в порт дожидаться завершения передачи, проверяя в цикле бит завершения передачи.
RHnd
Если не путаю, то вроде кто-то из опытных писал на форуме, что приходится переписывать putchar и ряд других функций, так как имеющийся printf - сильно медленный.
vetal
Цитата
Если не путаю, то вроде кто-то из опытных писал на форуме, что приходится переписывать putchar и ряд других функций, так как имеющийся printf - сильно медленный.

переписывать не надо - там есть быстрые аналоги этой функции(alt_printf и пр). Стандартный printf на всех платформах медленный, т.к. там заложен заведомо большой функционал smile.gif
Вся основа для программирования в sdk nios уже сделана - надо только подобрать из всего что имеется то, что вам нужно.
Vasily_A
Цитата(vetal @ Feb 17 2008, 17:25) *
переписывать не надо - там есть быстрые аналоги этой функции(alt_printf и пр). Стандартный printf на всех платформах медленный, т.к. там заложен заведомо большой функционал smile.gif
Вся основа для программирования в sdk nios уже сделана - надо только подобрать из всего что имеется то, что вам нужно.


если не использовать буфер на передачу (программный или аппаратный), то вопрос быстродействия почти не стоит - все равно почти все время на ожидание завершения передачи предыдущего символа тратится.

написание своего минимального по объему кода для кома может сильно пригодиться, если пытаться запихнуть его в накристальную память, без внешнешней памяти.
vetal
Цитата
если пытаться запихнуть его в накристальную память, без внешнешней памяти.

С alt_putchar, alt_printf и rediced device drivers это легко реализуется.И ничего писать не надо smile.gif
Как я уже и говорил - все уже есть, надо только найти и использовать!
prog_sun
Цитата
переписывать не надо - там есть быстрые аналоги этой функции(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, без внешней памяти. Все запихивается туда куда нужно :-) Передача хромает только.
vetal
Цитата
IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, 0xb74003)

Попробуйте найти 2 отличия между char и int, тогда поймете почему у вас передается 0x03.
Vasily_A
ком-порт работает с 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 бита побайтно...
prog_sun
Цитата
Попробуйте найти 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 -длина разрядности числа?
Vasily_A
Цитата(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
vetal
Цитата
Уважаемый 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разрядного числа. В какой последовательности их передавать - решает программист.
prog_sun
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 и все что угодно ставил :-)
vetal
Цитата
error: parse error before "__builtin_stwio" выдает такую ошибку на

Ошибка до указанной строки, видимо точку с запятой забыли где-то.
Vasily_A
вот это выводит в джитаг-варт "Hello from Nios II! (jtag UART)", а в rs232 4-ре символа "4321" (их хекс-коды 0х34 0х33 0х32 0х31)

проверил только что smile.gif
=================================================================
#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. задолбал меня квартус и ниос сложностью копирования\модификации проектов...
Postoroniy_V
Цитата(Vasily_A @ Feb 18 2008, 04:00) *
.....

P.S. задолбал меня квартус и ниос сложностью копирования\модификации проектов...

Да нет никаких сложностей как раз smile.gif
сложность только в 3-х вещах Лень читать доку, лень искать в доке ключевые слова и фразы, лень просто гуглить biggrin.gif
тут на форуме такое часто бывает...болезнь...имхо
prog_sun
Vasily_A,
Спасибо за код, все работает.
prog_sun
В handbooke нашел два примера работы с com портом.
Example 6–4. Writing Characters to a UART
#include <stdio.h>
#include <string.h>
int main (void)
{
char* msg = "hello world";
FILE* fp;
fp = fopen ("/dev/uart1", "w");
if (fp!=NULL)
{
fprintf(fp, "%s",msg);
fclose (fp);
}
return 0;
}

поменял uart1 на свое обозначение uart_0 и сообщение hello world передал в терминал.

Второй пример, о нем говорил Vasily_A
#include <stdio.h>

int main()
{
printf("Hello from Nios II!\n");

return 0;
}

В system library вместо jtag_uart_0 в строчках stdout, stderr, stdin записал uart_0 и на экране терминала получил собщение Hello from Nios II.
zorromen
Здрасте. Вот решил прикрутить 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, а если вбить то ругается.
Короче надо самому структуру набирать? Ваще есть примеры с работой с этим модулем?
torik
Цитата
Здрасте. Вот решил прикрутить VGA для DE1. Это те которые идут для кита. После заливки на кит, есть мусор на экране. Значить работает. Теперь ослталось написать программу. Использую графический режим.


Что за VGA - из SOPC Builder, или самодельный? Графический режим - это вы о чем?
Rifenshtal
Цитата(Vasily_A @ Feb 6 2008, 17:52) *
я слегка криво сформулировал...

далее я я запускаю niosIIide, создаю проект на базе шаблона с "хелло ворд", указывая system_0.ptf из cii_starter_nios директории - этим, судя по всему, я говорю компилятору о своем железе.

смотрю make-файл - все так и есть.



А что вы смотрите в make-файле? И как понимаете, что все так и есть?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.