Jump to content

    

slaveeen

Участник
  • Content Count

    10
  • Joined

  • Last visited

Community Reputation

0 Обычный
  1. У меня возникла следующая проблема. Мне необходимо произвести расчет FFT c N=512 с учетом того, что выход будет организован в Natural Order, в вход Digit Reverse Order (режим работы корки выбран как Varible Streaming c Floating Point). В обратном порядке, когда выход Digit Reverse Order, а вход Natural Order все работает . Я получаю данные с корки, записываю их в 2-х портовое ОЗУ, а затем производя digit reverse с адресом для чтения данных с ОЗУ, получаю массив переложенный в Natural Order (реверс адресов выглядит следующим образом, например: 1(00000 0001)=128(01000 0000), 5(00000 0101)=160(01010 0000) и т.д. Но , как я писал в начале мне необходим вариант вход: Digit Reverse Order, выход: Natural Order. Я так понимаю, что в этом случае реверс адресов должен выглядеть так: 1 (00000 0001)=256(10000 0000), 5(00000 0101)=384(11000 0000) и т.д. ). Но в данном случае на выходе FFT я вижу разваленный сигнал, смещенный по частоте. Подскажите пожалуйста, все ли я делаю правильно.
  2. У меня возникла следующая проблема. Мне необходимо произвести расчет FFT c N=512 с учетом того, что выход будет организован в Natural Order, в вход Digit Reverse Order (режим работы корки выбран как Varible Streaming c Floating Point). В обратном порядке, когда выход Digit Reverse Order, а вход Natural Order все работает . Я получаю данные с корки, записываю их в 2-х портовое ОЗУ, а затем производя digit reverse с адресом для чтения данных с ОЗУ, получаю массив переложенный в Natural Order (реверс адресов выглядит следующим образом, например: 1(00000 0001)=128(01000 0000), 5(00000 0101)=160(01010 0000) и т.д. Но , как я писал в начале мне необходим вариант вход: Digit Reverse Order, выход: Natural Order. Я так понимаю, что в этом случае реверс адресов должен выглядеть так: 1 (00000 0001)=256(10000 0000), 5(00000 0101)=384(11000 0000) и т.д. ). Но в данном случае на выходе FFT я вижу разваленный сигнал, смещенный по частоте. Подскажите пожалуйста, все ли я делаю правильно.
  3. ucos+nios+isr

    Тогда я Вас понял, такой вариант тоже возможен, но только меня интересует именно синтаксис описания прерывания штатными средствами OC, может кто-нибудь поделится опытом?
  4. ucos+nios+isr

    Правильно ли я Вас понял, Вы предлагаете не использовать обработчик прерываний, а просто считывать состояние порта PIO?
  5. ucos+nios+isr

    Доброго времени суток. Создаю в eclipse проект на основе примера hello usoc. В нем есть две задачи, которые попеременно выводят в консоль сообщения, все вроде бы просто и понятно. В моей процессорной системе (Nios) есть порт (input) PIO. Он настроен на генерацию прерываний по нажатию на кнопку на моем борде. Если говорить о "чистом " C коде, то как зарегистрировать прерывания и описать их обработчик мне известно (через ф-ию alt_irq_register() и т.д.). В примере hello usoc я так и сделал, вот пример кода: #include <stdio.h> #include "includes.h" #include "system.h" #include "altera_avalon_pio_regs.h" //#include "altera_avalon_pio_regs.h" /* Definition of Task Stacks */ #define TASK_STACKSIZE 2048 OS_STK task1_stk[TASK_STACKSIZE]; OS_STK task2_stk[TASK_STACKSIZE]; /* Definition of Task Priorities */ #define TASK1_PRIORITY 1 #define TASK2_PRIORITY 8 volatile int buttons=0; int led=0; static void button_isr( void * base, alt_u32 id ) { buttons = IORD_ALTERA_AVALON_PIO_EDGE_CAP(base); IOWR_ALTERA_AVALON_PIO_EDGE_CAP(base,0x3); } void task1(void* pdata) { while (1) { if (buttons != 0) { switch (buttons) { case 1: alt_printf("Нажата кнопка pb_left\n "); if (led == 0x80||led==0x00 ) led = 0x01; else led = led << 1; buttons = 0; break; case 2: alt_printf("Нажата кнопка pb_right\n "); if (led == 0x01 ||led==0x00 ) led = 0x80; else led = led >> 1; buttons = 0; break; default: buttons = 0; break; } IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,led); } printf("Hello from task1\n"); //OSTimeDlyHMSM(0, 0, 1, 0); } } void task2(void* pdata) { while (1) { alt_irq_register(BUTTONS_IRQ, (void*)BUTTONS_BASE, button_isr); printf("Hello from task2\n"); //OSTimeDlyHMSM(0, 0, 1, 0); } } /* The main function creates two task and starts multi-tasking */ int main(void) { IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0x00); IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTONS_BASE, 0x3); IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTONS_BASE, 0x3); alt_irq_register(BUTTONS_IRQ, (void*)BUTTONS_BASE, button_isr); OSTaskCreateExt(task1, NULL, (void *)&task1_stk[TASK_STACKSIZE-1], TASK1_PRIORITY, TASK1_PRIORITY, task1_stk, TASK_STACKSIZE, NULL, 0); OSTaskCreateExt(task2, NULL, (void *)&task2_stk[TASK_STACKSIZE-1], TASK2_PRIORITY, TASK2_PRIORITY, task2_stk, TASK_STACKSIZE, NULL, 0); OSStart(); return 0; } Но я чувствую, что в ucos такая работа с прерываниями некорректна. Подскажите пожалуйста, какова идеология работы с прерываниями под ucos, и как должен выглядеть обработчик прерываний в моем случае, то есть описанный штатными средствами операционной системы? Если есть возможность поделитесь простым примером, от которого можно оттолкнутся.
  6. Прошу помочь мне с реализацией следующей задачи: Имеется FPGA Cyclone V (E серия) и процессор Tiger Shark TS201S. На ПЛИС производится вычисление БПФ (FFT), в результате чего мы имеем два потока данных, каждый из которых представят 32-х разрядные слова (кол-во от 512 до 4098, в зависимости от режима работы) выдаваемые "наружу" блока БПФ (FFT) с частотой 100МГц. Необходимо передавать результаты расчета БПФ (FFT) на процессор. Для связи с FPGA процессор имеет (в нашем случае) Link Port. Данный интерфейс содержит порт приемника и порт передатчика. Передатчик организован, как 4-х разрядная шина данных, тактовый сигнал, выходной служебный сигнал (индикатор завершения передачи данных) и входной служебный сигнал (сигнал от приемника, о готовности приема данных). Приемник имеет все те же сигналы что и передатчик. Данный интерфейс поддерживает стандарт LVDS ANSI/TIA/EIA-644 (где опорный уровень порядка 1,25V, дифференциальное напряжение 350mV). Одно из главных требований: передача данных с Плис на процессор должна быть не меньше чем 2Gbps. Возникает вопрос, как организовать передачу данных, ведь у меня получается следующая ситуация: если не осуществлять в Плис предварительно хранения данных, а поддерживать потоковую передачу данных (что естественно легче реализовать), то поделив 32-х разрядные данные на 8, получим как раз необходимые для нас 4-ре разряда для Link Port, но и скорость увеличится в восемь раз (800 МГц) и даже представляя работу по двум фронтам (400 Мгц), получаем нереальную скорость для FPGA Cyclone V. От Cyclone V отказаться скорее всего не получиться, получается есть (как мне кажется) несколько путей решения: 1. Использовать внешнюю микросхему, которая имеет с одной стороны большую разрядность чем Link Port (будет легче передавать данные с ПЛИС), а с другой как раз тот самый Link Port (подразумевается универсальный интерфейс, который получится настроить на Link Port процессора). 2. Поставить на плату еще одну, более скоростную ПЛИС, естественно более дешевую чем Cyclone V (E серия) на 301 тысячу логических элементов (стоимость такого Cyclone V порядка 350$) 3. Использовать Cyclone V серии GX, которая имеет аппаратные высокоскоростные приемопередатчики. По возможности прошу помочь в данном вопросе и прокомментировать каждое из возможных решений. Возможно ли подобрать такой "сириализатор" в виде отдельной микросхемы, как описано в первом пункте? Возможно ли на Cyclone V серии GX организовать Link Port (по большому счету свой собственный интерфейс)? Или проще использовать еще одну ПЛИС?
  7. Спасибо большое vzelenuk. PDF с сайта алтеры помог. Как выяснилось, проблема была именно в неправильном подключении библиотек для мегафункций на verilog.
  8. Цитата(iosifk @ Feb 17 2014, 22:19) скомпилировать библиотеки и прописать нуть к simprim и unisim Поясните пожалуйста, как это сделать: "скомпилировать библиотеки и прописать путь к simprim и unisim"
  9. У меня возникла слудующая ситуация: 1. Создаю в Quartus простейший проект. Добавляем в него через Mega-Wizzard счетчик (lpm_counter) и генерируем его на VHDL. Также генерирую на VHDL файл верхнего уровня. Создаю в ModelSim-Altera проект, компилирую два вышеуказанных файла и все отлично работает, то есть проект успешно симулируется (для данного проекта test beanch не создавал) 2. Проделываю все вышеперечисленные действия в другом проекте, только генерирую счетчик и файл верхнего уровня на Verilog и тут начинаются проблумы, ModelSim выдает следующую ошибку ** Error: (vsim-3033) D:/altera_13_sp1/WORK/WORK/modelsim_3/xxx.v(66): Instantiation of 'lpm_counter' failed. The design unit was not found. # # Region: /modelsim_3/b2v_inst # Searched libraries: # D:/altera_13_sp1/WORK/WORK/modelsim_3/work Пытаюсь указать путь к библиотеке D:/altera_13_sp1/modelsim_ase/altera/verilog/220model/lpm_counter и ModelSim выдает следующую ошибку ** Error: (vsim-19) Failed to access library 'D:/altera_13_sp1/modelsim_ase/altera/verilog/220model/lpm_counter' at "D:/altera_13_sp1/modelsim_ase/altera/verilog/220model/lpm_counter". # # No such file or directory. (errno = ENOENT) # ** Error: (vsim-3033) D:/altera_13_sp1/WORK/WORK/modelsim_3/xxx.v(66): Instantiation of 'lpm_counter' failed. The design unit was not found. # # Region: /modelsim_3/b2v_inst # Searched libraries: Причем самописные файлы на VHDL или Verilog симулируются в ModelSim замечательно. Я так полагаю, что это связано исключительно с мегафункциями созданными на Verilog Что делать в данном случае?
  10. У меня возникла следующая ситуация: 1. Создаю в Quartus простейший проект. Добавляем в него через Mega-Wizzard счетчик (lpm_counter) и генерируем его на VHDL. Также генерирую на VHDL файл верхнего уровня. Создаю в ModelSim-Altera проект, компилирую два вышеуказанных файла и все отлично работает, то есть проект успешно симулируется (для данного проекта test beanch не создавал) 2. Проделываю все вышеперечисленные действия в другом проекте, только генерирую счетчик и файл верхнего уровня на Verilog и тут начинаются проблумы, ModelSim выдает следующую ошибку ** Error: (vsim-3033) D:/altera_13_sp1/WORK/WORK/modelsim_3/xxx.v(66): Instantiation of 'lpm_counter' failed. The design unit was not found. # # Region: /modelsim_3/b2v_inst # Searched libraries: # D:/altera_13_sp1/WORK/WORK/modelsim_3/work Пытаюсь указать путь к библиотеке D:/altera_13_sp1/modelsim_ase/altera/verilog/220model/lpm_counter и ModelSim выдает следующую ошибку ** Error: (vsim-19) Failed to access library 'D:/altera_13_sp1/modelsim_ase/altera/verilog/220model/lpm_counter' at "D:/altera_13_sp1/modelsim_ase/altera/verilog/220model/lpm_counter". # # No such file or directory. (errno = ENOENT) # ** Error: (vsim-3033) D:/altera_13_sp1/WORK/WORK/modelsim_3/xxx.v(66): Instantiation of 'lpm_counter' failed. The design unit was not found. # # Region: /modelsim_3/b2v_inst # Searched libraries: Что делать в данном случае? Причем самописные файлы на VHDL или Verilog симулируются в ModelSim замечательно. Я так полагаю, что это связано исключительно с мегафункциями созданными на Verilog