Jump to content

    

Петр Юркевич

Участник
  • Content Count

    17
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Петр Юркевич

  • Rank
    Участник

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Здравствуйте! Скорее всего спрашивающему уже не актуально, но для тех, кто ещё столкнётся с данной проблемой напишу решение, которое мне чаще всего помогает. Эта ошибка часто выскакивает, если сначала сохранить IntLib, а потом сразу попытаться её скомпилировать. Мне в этом случае помогает ещё раз сохранить библиотеки, содержащиеся внутри IntLib (хотя бы одну). После этого библиотека спокойно компилируется.
  2. Да, мне тоже такая идея в голову пришла, только не знал, как реализовать. Спасибо, попробую!
  3. Здравствуйте! Возникла проблема с прошивкой Cyclone V (платы DE0-Nano-SoC и DE1-SoC), включающей Nios II. Заливка на пустую ПЛИС производится спокойно, но если на ней уже работает Nios II (с залитой прошивкой), то программатор в Квартусе выдаёт ошибку. В итоге всё решается только отключением и включением питания. Причём, даже зажатая кнопка reset (для Nios) не помогает. Причём, если Nios есть, но не залита его прошивка, то ПЛИС нормально перепрошивается. Подскажите, пожалуйста, в чём может быть проблема?
  4. Здравствуйте! Делаю частотомер на ПЛИС (Cyclone V на DE0-Nano-SoC) с выводом на дисплей значения частоты. Рассчитанное значение частоты выдаётся (обновляется) каждую секунду, вместе с ним поднимается сигнал переполнения счётчика (на один такт). Поскольку вывод осуществляется через Nios, использую прерывание по уровню (ядро PIO) для регистрации сигнала переполнения и в обработчике вывожу значение частоты на экран. Код инициализации прерывания: static void init_freq_en_IRQ() { alt_putstr("irq_init start\n"); void* edge_capture_ptr = (void*) &edge_capture; IOWR_ALTERA_AVALON_PIO_IRQ_MASK(FREQ_EN_BASE, 0xf); alt_ic_isr_register(FREQ_EN_IRQ_INTERRUPT_CONTROLLER_ID, FREQ_EN_IRQ, handler_freq_en, edge_capture_ptr, 0x0); alt_putstr("irq_init finish\n"); } Код обработчика: static void handler_freq_en (void * context) { IOWR_ALTERA_AVALON_PIO_IRQ_MASK(FREQ_EN_BASE, 0x0); IOWR_ALTERA_AVALON_PIO_IRQ_MASK(FREQ_EN_BASE, 0xf); freq_to_lcd(); alt_putstr("handler\n"); } Но почему-то при запуске прерывания генерируются, но процессор в них не уходит. Скрин SignalTap'a. Верхний сигнал - это счётчик, отмеряющий секунду, средний - сигнал переполнения, нижний - вроде как генерируемый сигнал IRQ из контроллера PIO (по крайней мере он исчезает, когда я отключаю инициализацию прерывания) При этом в один момент он зависает и прекращает выполнение основной программы (Это выяснилось после того, как я сделал отправку на дисплей в бесконечном цикле в функции main). Есть подозрение, что он уходит в прерывание, но не доходит до обработчика (он не выполняется), или же это какое-то другое исключение, из которого он не возвращается. Что это может быть? Может, я неправильно настраиваю прерывания (с прерываниями по фронту всё работало, но там была другая проблема)? Или, если проблема в другом исключении, как это отследить? Ссылка на гитхаб (в папке DE0_Nano_SoC_project) UPD: Посмотрел на сигнал IRQ при прерывании по фронту. Там он находится в положении 1 до момента сброса прерывания. Здесь же почему-то всего один такт
  5. Спасибо за ответ! В принципе, уже разобрался. Была проблема в неправильном напряжении питания банка выводов (для LVDS требовалось 2.5, а стояло 3.3). Пришлось искусственно в Квартусе менять. А буферы даже не пригодились, оказалось, что можно просто подключаться к положительному выводу, назначенному как LVDS. При этом Квартус сам разбирается и формирует входной и выходной буферы (с резистором он видимо сам как-то порешал).
  6. Спасибо! Попробую Да, я понял, скорее всего сделаю кодирование значений. Спасибо за советы!
  7. Нашёл post-fitting схему. Там Квартус сделал что-то странное. Шины freq_base и time_del почему-то объединены, но со сдвигом на 1. При этом они целиком идут в SignalTap, а в частотомер уходят только бит 0 из каждой... Видимо он действительно решил упростить себе работу. Можно его как-то заставить сделать правильно? Может, существуют настройки разводки? P.S. Я подумаю над перекодированием, сейчас мне просто интересно, можно ли сделать так, как я изначально задумал
  8. Здравствуйте! Делаю частотомер на ПЛИС (DE0-Nano-SoC, Cyclone V). Мне необходимо выводить значение измеренной частоты на внешний дисплей, поэтому было удобно подключить Nios, чтобы он этим занимался. Т.к. частотомер измеряет отрезок времени по некоторой опорной частоте, ему необходимо значение этой частоты, которое передаётся в модуль частотомера извне. Была идея реализовать поддержку изменения опорной частоты и интервала, на котором производится измерение, а также впоследствии возможность простого ввода этих значений (пока ввод реализован посредством переключения свитчей). Решил сделать это через Nios. Если с делителем интервала (деление посредством сдвига, поэтому по-умолчанию ставится 0) проблем не возникло, то с передачей значения опорной частоты (точно такого же формата, что и делитель) из Nios в частотомер возникла непонятная мне проблема: Выход Nios соединяется с соответствующим входом частотомера прямым проводом, который (судя по схеме Квартуса) ничем не делится. Но когда я всё запускаю и прошиваю Nios, он выставляет на выходе значение 200_000_000 (Гц). Но если посмотреть по SignalTap'у, то оказывается, что на выходе Nios правильное число (3я строка), а на входе частотомера 0 (1я строка), причём делитель передаётся нормально (здесь не видно, но если изменить на другое число, то на 2й и 4й строчках числа будут одинаковыми). В чём здесь может быть проблема? Проект находится на ГитХабе: https://github.com/FlexlabCompany/frequency_meter_Nios_display Проект ещё содержит часть для DE1-SoC, но здесь он используется только как сторонний генератор измеряемой частоты.
  9. Подскажите, пожалуйста, где это в Квартусе сделать? И ещё вопрос по поводу организации передачи и приёма. Это делается при помощи буфера, преобразующего сигнал из моно в дифференциальный? Или Квартус должен сам с этим разобраться и создать соответствующую логику, а мне надо только задать стандарт в PinPlanner?
  10. Здравствуйте! Расскажите, пожалуйста, как через Квартус настроить LVDS (Чип Cyclone V). Я пробовал несколько разных вариантов, но на все он выдаёт разные ошибки. Насколько я понял из вашего ответа, легально настроить никак не получится, если банк запитан от 3.3V?
  11. Здравствуйте! Стоит задача генерировать внутри ПЛИС Altera Cyclone V (кит Terasic DE1-SoC) при помощи PLL некоторую частоту, передавать её на выход LVDS и принимать на другой вход этой же ПЛИС (необходимо для отладки частотомера). По поводу LVDS долго пытался вчитываться в Cyclone V Handbook, но понял только то, что надо использовать функции Квартуса для приёма и передачи сигнала LVDS. Насколько я понял, при назначении в Pin Planner стандарта LVDS Квартус сам назначает пару выбранному пину. Информацию по поводу пар дифференциальных пинов нигде не смог найти. Я выбрал GPIO[12] и GPIO[14] (парные 15 и 13). Дальше создал входной и выходной буферы (ALTIOBUF), которые должны преобразовывать сигнал из моно в дифференциальный и обратно. LVDS_BUF_IN lvds_in ( .datain(GPIO[15]), .datain_b(GPIO[12]), .dataout(clk_in) ); LVDS_BUF_OUT lvds_out ( .datain(clk_0_2), .dataout_b(GPIO[13]), .dataout(GPIO[14]) ); По поводу выходной пары у Квартуса вопросов не возникло, а на входные пины вылезла ошибка: Error (169008): Can't turn on open-drain option for differential I/O pin GPIO[12]. И аналогичная на 15-й пин. Если не создавать буфер, на выходную пару вылезает такая же ошибка, я читал, что Квартус не пропускает неправильно настроенные пины LVDS. Я знаю, что в LVDS должен быть на входе резистор между линиями. Может быть, ошибка из-за его отсутствия в программе? И его как-то настроить надо в самой ПЛИС?
  12. Спасибо! Попробую сделать Можете поподробнее объяснить, пожалуйста. Мне хотя бы чб вывести, уже неплохо
  13. Т.е. мне надо проводом подключить зелёный канал VGA к видео разъёму телевизора и сгенерировать на нём сигнал по соответствующему стандарту? Вы назвали 2 стандарта, как узнать, по какому из них надо работать?
  14. Поясните, пожалуйста, какой 1 В Вы имели ввиду, для чего он там требуется? Сигнал VGA я создать могу, вопрос в том, как его передать?