|
|
  |
nios2 на ките Cyclone II для чайников, простейший проект |
|
|
|
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. простейший вариант (без прерываний) - до записи в порт дожидаться завершения передачи, проверяя в цикле бит завершения передачи.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|