Перейти к содержанию
    

dsip

Участник
  • Постов

    18
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о dsip

  • Звание
    Участник
    Участник
  • День рождения 13.01.1982

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array
  1. В некоторых случаях использование JTAG UART printf() в обработчиках прерываний встроенного контроллера прерываний (IIC) NIOS II приводит к зависанию процессора. В интернете готового решения не нашёл, пришлось раскуривать мануалы, в которых всё изложенно, но очень глубоко... Делюсь опытом. У драйвера JTAG UART есть две вариации, нужный вариант указывается в BSP: 1) Маленькая (Small), которая опрашивает готовность JTAG UART перед отправкой каждого символа. У неё есть досадная особенность - если связи с хостом нет - то, при попытке отправить чегониб, она останавливает процессор и возвращает его к жизни только когда появится связь с хостом. Поэтому для устройства у которого нет постоянной связи с хостом этот вариант не подходит. 2) Быстрая (Fast), которая использует прерывания. И у неё то же досадная особенность, т.к. IIC не умеет прерывать уже исполняемое прерывание, то, при вызове printf() из обработчика прерывания, она так же зависает после заполнения буфера JTAG UART. И об этом сказанно в "Nios II Gen2 Software Developer's Handbook" в главе "Writing an ISR" пункт "Running in a Restricted Environment": In particular, do not call printf() from within an ISR unless you are certain that stdout is mapped to a non-interrupt-based device driver. Otherwise, printf() can deadlock the system, waiting for a hardware interrupt that never occurs because interrupts are disabled. Однако есть возможность обучить IIC прерывать обработчик прерывания запросом с большим приоритетом. Для этого нужно "окружить" код код обработчика, который можно прерывать, функциями alt_irq_interruptible() и alt_irq_non_interruptible(). Об этом написанно в "Nios II Gen2 Software Developer's Handbook" в главе "Improving Nios II ISR Performance" пункт "Nested Hardware Interrupts with the Internal Interrupt Controller": To implement nested hardware interrupts with the IIC, use the alt_irq_interruptible() and alt_irq_non_interruptible() legacy functions to bracket code in a processor-intensive ISR. В первую функию передаём номер прерывания и она возвращает маску, которую нужно потом восстановить с помощью второй функции. Правда там далее сказанно что нужно закоментировать #define ALT_ENHANCED_INTERRUPT_API_PRESENT в system.h, иначе компилятор не увидит эти функции. И это придётся делать каждый раз после синтеза HDL кода в QSys. Очень неудобно. Да и всю остальную рутину работы с прерываниями придётся перевести в "leacy".... Эксперимент показал, что можно не переходить к "legacy", нужно подключить "priv/alt_legacy_irq.h" (в котором описанны функциями alt_irq_interruptible() и alt_irq_non_interruptible()), тогда вся рутина работы с прерываниями останется в виде "enhanced", компилятору станут доступны указанные функции и printf() будет работать без ограничений. Надеюсь комунибудь будет полезно и съэкономит время.
  2. Опять на тему "нужна тактовая а её нет", и внутренний тактовый генератор ПЛИС недоступен. https://electronix.ru/forum/index.php?s=&am...t&p=1476805 Или если нужно создать импульс из фронта при отсутствии тактовой. (И это, наверно, даже более актуально). Есть такой способ генерации тактового сигнала в ПЛИС - построить кольцевой генератор из кучи LUTов. Вместо кучи LUTов можно применить встроенную в IOB задержку, получим простой тактовый генератор. Пример для Altera: alt_iobuf clk_iobuf ( .i (~clk ), .oe(1'b1 ), .o (clk ), .io(clk_pin) ); И в qsf файле указываем задержку: // Use IOB delay set_instance_assignment -name PAD_TO_CORE_DELAY 6 -to clk_pin Разумеется, для указания задержки, нужно сначала прочитать даташит на конкретную ПЛИС, выяснить какие задержки встроены в IOB, и какие параметры им можно передавать. Эту задержку можно применить для генерации одиночного импульса из фронта при отсутствии тактового сигнала, например - сгенерировать сигнал сброса. alt_iobuf delay_iobuf ( .i (delay_i ), .oe(1'b1 ), .o (delay_o ), .io(delay_pin) ); assign pulse = delay_i & ~delay_o; Не забываем прочитать как, подумать какую и указать задержку в qsf файле: // Use IOB delay set_instance_assignment -name PAD_TO_CORE_DELAY 6 -to delay_pin Понятно, что в этом случае теряем один вывод ПЛИС, жертвы... FPGA clock pulse generation IOB delay - это для поисковых машин
  3. Применил на Cyclone IV E, по даташиту частота 20-40МГц, 22нс поставил по результам компиляции, что бы TimeQuest не ругался на нарушение времени предустановки для "int_osc~OBSERVABLEOSCENAREG", сначала пробовал подсунуть 10нс. Altera Internal Oscillator Cyclone Internal Oscillator Это для поисковых машин, а то сам долго не мог найти как этот генератор подключить.
  4. В Cyclone III/IV можно получить доступ к внутреннему тактовому генератору (который используется при конфигурировании), очень удобно когда надо тактовую а её нет: // Internal oscillator //cycloneiii_oscillator cycloneive_oscillator int_osc ( .clkout(int_clk ), .oscena(int_clk_en) ); Или: Installed IP -> Library -> Configuration and Programming -> Internal Oscillator TimeQuest не смог сам получить для него частоту, поэтому нужно в sdc указать частоту на пин или на цепь: create_clock -period 22 -name int_clk [get_pins {int_osc|clkout}] Вход oscena вроде как с регистром, т.к. если задать маленький период, то TimeQuest ругается на нарушение времени предустановки для "int_osc~OBSERVABLEOSCENAREG".
  5. Судя по разрешениям требуется разложить картинку на 6 частей (вся картинка будет составлена из 6 мониторов 3х2)? Или всё же нужно аппаратное масштабирование (на каждом выходе то же что и на входе, но с меньшим разрешением)?
  6. И вправду - обновление извело 8ГБ где-то в середине процесса, при этом никаких предупреждений не было, и обновление продолжалось при нуле доступного места.
  7. Следующая проблема: Устанавливаю сверху обновление до 11.5. Получаю Bus error при старте ISE. EDK то же не стартует... /opt/Xilinx/11.1/EDK/bin/lin/edk размер равен 0 ...
  8. АААААААААААААААААААААААА!!!!!!!!!!!!!!!!!!! СУПЕР!!!!!!!!!!!!!!!!!!!!!!!! Взял от Федоры в которой 10.1 работал и всё взлетело!!!!!!!!!!!!!!!!!!! СПАСИБО!!!!
  9. То же происходит когда изменяю настройки каталога IP. После нажатия Ok приложение закрывается. Все остальные настройки работают нормально.
  10. Поставил инструментарий Xilinx версии 11.1 в полном составе на Mandriva Linux 2010. ISE запускается и открывает проект нормально. EDK запускается, но завершается, без сообщений, при попытке открыть проект (ну или при завершении создания нового). dmesg даёт такие сообщения: xpsgui[4634]: segfault at 5 ip b61a2465 sp bfec85d0 error 4 in libxml2.so.2.7.6[b6130000+13a000] ранще ещё было: npviewer.bin[30440]: segfault at ff99cd48 ip ff99cd48 sp bfdf9bdc error 4 Кто нибудь сталкивался с подобной проблемой? Есть у когониб готовые пути решения? Или может хотя бы направление как это исправить?
  11. Циферки выводятся так: Xuint32 data; ... data = ...; ... print(" Data 0x"); putnum( data ); print("\r\n"); Прерывания пользуются так (пример для кнопок с ML402); void InterruptHandler() { // PB interrapt processing if( XIntc_mGetIntrStatus( XPAR_INTC_0_BASEADDR ) & XPAR_PUSH_BUTTONS_POSITION_IP2INTC_IRPT_MASK ) { // Detect button switch( XGpio_mGetDataReg(XPAR_PUSH_BUTTONS_POSITION_BASEADDR, 1) ) { case GPIO_PB_N_MASK : // move block_cur_y_pos -= 10; break; case GPIO_PB_S_MASK : // move block_cur_y_pos += 10; break; case GPIO_PB_E_MASK : // move block_cur_x_pos += 10; break; case GPIO_PB_W_MASK : // move block_cur_x_pos -= 10; break; } // Clear GPIO interrupt status XGpio_mWriteReg( XPAR_PUSH_BUTTONS_POSITION_BASEADDR, XGPIO_ISR_OFFSET, XGPIO_IR_CH1_MASK ); // Clear IntC interrupt status XIntc_mAckIntr( XPAR_INTC_0_BASEADDR, XPAR_PUSH_BUTTONS_POSITION_IP2INTC_IRPT_MASK ); } } Драйвера у Xilinx двух уровней, я пользую нижний <ip core driver>_l.h, здесь всегда приходится подставлять базовый адрес ядра. Все функции называются X<ip core>_m<function>. Путь к драйверам (пример) C:\Xilinx\10.1\EDK\sw\XilinxProcessorIPLib\drivers\gpio_v2_12_a\src. Все функции хорошо прокомментированы. Все параметры - базовые адреса, номера прерываний, всяческие маски находятся в файле xparameters.h. Набор заголовочных файлов примерно такой: // Всякая батва от проца #include "xparameters.h" #include "xbasic_types.h" #include "mb_interface.h" // Низкоуровневые драйверы #include "xintc_l.h" #include "xgpio_l.h" // Классика #include "stdio.h"
  12. Вот же, блин, досада... :( А ручками через з..., можно конкретней?
  13. И не помешает внимательно прочитать C:\Xilinx\doc\usenglish\books\docs\cgd\cgd.pdf Это Constraints Guide в котором подробно написано как присоединить, задать стандарт ввода вывода, ток и времянки для выводов. И все остальные констраинты UCF (и не только) файла и принципы их использования.
  14. Сделал: Generate Post-Synthesis Simulation Model Выпали: ...\netgen\synthesis\DFE_synthesis.nlf ...\netgen\synthesis\DFE_synthesis.v Сделал: Generate Post-Place & Route Simulation Model Выпали: ...\netgen\par\DFE_timesim.nlf ...\netgen\par\DFE_timesim.sdf ...\netgen\par\DFE_timesim.v Попробовал применить V файлы в Aldec, появились предупреждения в стиле: # Undefined module: X_BUF was used. Port connection rules will not be checked at such instantiations. В заголовке V файла написано что это "verilog netlist" и он использует "simulation primitives" я так понимаю конкретного семейства, кроме того, в заголовке прописано название целевого кристала, то есть это тоже объект не универсальный. (???) Но всё же: Что я могу извлечь из этого комплекта файлов? Как и какую библиотеку нужно подключать в Aldec, чтобы требуемые примитивы были найдены?
  15. Есть ещё пакет RIDE IDE (компании Raisonance), по содержанию похож на Keil - тоже в стиле "всё в одном".
×
×
  • Создать...