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

verali

Свой
  • Постов

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

  • Посещение

Сообщения, опубликованные verali


  1. Всем добрый день! Имеем Cyclone V (обычный, без SOC) + Quartus 14.0 + QuestaSim.

    Собрал проект цифрового понижающего преобразователя (digital down converter) из альтеровских IP ядер (NCO, умножитель, FIR фильтр) и с opencores (CIC фильтр). Система двухканальная. В самом начале идет логика автоматического сброса (далее сброс будет приходить с процессора)

    post-83540-1490183249_thumb.jpg

    Отдельно DDC, собранный из IP ядер.

    post-83540-1490183271_thumb.jpg

    Данные с ПЛИС по последовательному порту идут в DSP. Под выходные данные с ПЛИС идет строб, который я вывожу на контрольные точки.

    post-83540-1490183489_thumb.jpg

    В SDC файл прописываю свой клок, равный 60 МГц.

    post-83540-1490185368_thumb.jpg

     

    В Warning присутствуют следующие предупреждения:

    1)Unconstrained output ports

    post-83540-1490185526_thumb.jpg

    2)4 сигнала строба:

    Missing drive strength and slew rate

    post-83540-1490185610_thumb.jpg

     

    Все остальные выходные информационные сигналы я вывожу на виртуальные пины, чтобы не мешались. В будущем они пойдут в DSP.

    При загрузке в ПЛИС стробы не идут - на контрольных точках висит высокий уровень.

    Буду признателен, если подскажете, как избавиться от варнингов.

     

  2. Добрый день!

    Являюсь новичком в Verilog и SV. До этого только подключал ip блоки к проекту, используя SV и писал простенькие testbench.

    Возникли трудности в банальном описании сброса. Внешний сброс приходит с процессора, доступ к которому сейчас не имею. Хочу проверить работоспособность "железа" путем автоматического сброса - допустим после 100 клоков сигнал reset переходит из 0 в 1 и далее никак не изменяется.

    Первая идея была использовать счетчик, который, досчитывая до 100, ставит сигнал reset в 1. Но, этот счетчик со временем обнулится, и сброс произойдет снова, что мне не подходит.

    Вопрос: возможно ли синтезировать данный сброс или надо искать другой путь?

  3. Этот варнинг говорит о том, что ваш слок не описан должным образом: не указана частота вашего клока и всё, что связано с PLL. Что у вас в sdc?

    Сейчас описал sdc (ранее был не знаком с тем, что надо описывать клоки) - warning пропали. Посмотрите пожалуйста, все ли я описал в sdc.

    Листинг моего sdc:

    #**************************************************************
    # Time Information
    #**************************************************************
    
    set_time_format -unit ns -decimal_places 3
    
    
    
    #**************************************************************
    # Create Clock
    #**************************************************************
    
    create_clock -name {altera_reserved_tck} -period 33.333 -waveform { 0.000 16.666 } [get_ports {altera_reserved_tck}]
    create_clock -name {clk} -period 10.000 -waveform { 0.000 5.000 } [get_ports {clk clk(n)}]
    
    
    #**************************************************************
    # Create Generated Clock
    #**************************************************************
    
    create_generated_clock -name {pll_user|pll_duc_inst|altera_pll_i|general[0].gpll~FRACTIONAL_PLL|vcoph[0]} -source [get_pins {pll_user|pll_duc_inst|altera_pll_i|general[0].gpll~FRACTIONAL_PLL|refclkin}] -duty_cycle 50.000 -multiply_by 6 -divide_by 2 -master_clock {clk} [get_pins {pll_user|pll_duc_inst|altera_pll_i|general[0].gpll~FRACTIONAL_PLL|vcoph[0]}] 
    create_generated_clock -name {pll_user|pll_duc_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk} -source [get_pins {pll_user|pll_duc_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|vco0ph[0]
    }] -duty_cycle 50.000 -multiply_by 1 -divide_by 3 -master_clock {pll_user|pll_duc_inst|altera_pll_i|general[0].gpll~FRACTIONAL_PLL|vcoph[0]} [get_pins {pll_user|pll_duc_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] 
    
    
    #**************************************************************
    # Set Clock Latency
    #**************************************************************
    
    
    
    #**************************************************************
    # Set Clock Uncertainty
    #**************************************************************
    
    set_clock_uncertainty -rise_from [get_clocks {clk}] -rise_to [get_clocks {clk}] -setup 0.050  
    set_clock_uncertainty -rise_from [get_clocks {clk}] -rise_to [get_clocks {clk}] -hold 0.030  
    set_clock_uncertainty -rise_from [get_clocks {clk}] -fall_to [get_clocks {clk}] -setup 0.050  
    set_clock_uncertainty -rise_from [get_clocks {clk}] -fall_to [get_clocks {clk}] -hold 0.030  
    set_clock_uncertainty -fall_from [get_clocks {clk}] -rise_to [get_clocks {clk}] -setup 0.050  
    set_clock_uncertainty -fall_from [get_clocks {clk}] -rise_to [get_clocks {clk}] -hold 0.030  
    set_clock_uncertainty -fall_from [get_clocks {clk}] -fall_to [get_clocks {clk}] -setup 0.050  
    set_clock_uncertainty -fall_from [get_clocks {clk}] -fall_to [get_clocks {clk}] -hold 0.030  
    set_clock_uncertainty -rise_from [get_clocks {altera_reserved_tck}] -rise_to [get_clocks {altera_reserved_tck}] -setup 0.050  
    set_clock_uncertainty -rise_from [get_clocks {altera_reserved_tck}] -fall_to [get_clocks {altera_reserved_tck}] -setup 0.050  
    set_clock_uncertainty -fall_from [get_clocks {altera_reserved_tck}] -rise_to [get_clocks {altera_reserved_tck}] -setup 0.050  
    set_clock_uncertainty -fall_from [get_clocks {altera_reserved_tck}] -fall_to [get_clocks {altera_reserved_tck}] -setup 0.050  
    
    
    #**************************************************************
    # Set Input Delay
    #**************************************************************
    
    
    
    #**************************************************************
    # Set Output Delay
    #**************************************************************
    
    
    
    #**************************************************************
    # Set Clock Groups
    #**************************************************************
    
    set_clock_groups -asynchronous -group [get_clocks {altera_reserved_tck}] 
    
    
    #**************************************************************
    # Set False Path
    #**************************************************************
    
    set_false_path -from [get_keepers {altera_reserved_tdi}] -to [get_keepers {pzdyqx*}]
    
    
    #**************************************************************
    # Set Multicycle Path
    #**************************************************************
    
    
    
    #**************************************************************
    # Set Maximum Delay
    #**************************************************************
    
    
    
    #**************************************************************
    # Set Minimum Delay
    #**************************************************************
    
    
    
    #**************************************************************
    # Set Input Transition
    #**************************************************************
    
    

     

    Если вы используете PLL, то в качестве сброса для всех блоков используйте её выход Locked, а не входной reset_n.

    Спасибо за совет. Как я понимаю locked используется для синхронизации внешнего сброса с выходной частотой pll?

     

    В TimeQuest Timing Analyzer появились три частоты.

    1)altera_reserved_tck

    2)clk

    3)pll_user

    Максимальные частоты 78, 195 и 262 соответственно.Правильно ли я понимаю, что в зависимости от того, чем я буду тактировать внутреннюю логику ПЛИС (без/с pll) меняется максимальная частота работы ПЛИС?

  4. Добрый день! Собрал проект на ПЛИС из IP-блоков:

    post-83540-1473845663_thumb.jpg

    После компиляции TimeQuest показывает, что максимальная скорость около 90 МГц, что для Arria V является очень низкой.

    post-83540-1473845689_thumb.jpg

    В информационных сообщениях появляются Warnings:

    post-83540-1473845718_thumb.jpg

    1) 1 input pin(s) will use non-dedicated clock routing.

    Как я понял, мой клок использует путь(пин) не предназначенный для клока. В Connection Guidelines есть два типа клока - clk и pll.

    post-83540-1473845746_thumb.jpg

    Логично предположить, что только ко второму можно подключить pll.

    Но в pin assignment pll является дополнительной опцией:

    post-83540-1473845775_thumb.jpg

    Следовательно делаю вывод, что в любому clk я могу подключить pll.

    Верны ли мои предположения?

    2) Node: clk was determinated to be a clock but was found without an associated clock assignment.

    Warning требует от меня где-то (может быть в assignment editor?) указать что этот пин используется как клок(так как клок может быть и клоком и обычным I/O)? Не могу найти, где это указать. Буду благодарен за наводку.

    3) PLL cross checking found inconsistent PLL clock settings: was found missing 1 generated clock that corresponds to be a base clock with a period of: 10.000

    Тут warning мне говорит, что я не подключил(потерял) клок, который идет на вход ФАПЧ, хотя из первого вложения видно, что внешний клок идет напрямую на ФАПЧ. Сразу скажу - внешний клок 100 МГц идет на ФАПЧ и выходят все те же 100 МГц. В институте так советовал делать преподаватель, ссылаясь на то, что увеличивается надежность всей системы, из-за того, что внешний клок может быть зашумленным, а выход ФАПЧ является чуть ли не прецизионным.

    4)В TimeQuest есть так называемый altera_reserved_clock. Что это такое и почему его частота 33 МГц? Связан ли он какие-либо образом с SignalTap?

    post-83540-1473846037_thumb.jpg

    post-83540-1473845942_thumb.jpg

  5. В контексте статьи то что, отображено сплошной синей линией - спектральная область полезного сигнала, то что у Вас обведено - побочные гармоники, мусор - то, что не должно попасть в полосу. При прореживании в два раза мы банально "отрываем область" от пи до 2пи и накладываем на область от 0 до пи (то, что было пи теперь в нуле, а то что в 2пи - в пи). Таким образом при тупом прореживании наш мусор тоже остался (наложился - алиасинг), поэтому до прореживания от него нужно избавиться - в данном случае использовать ФНЧ. То, что изобразили Вы мне непонятно. Котельникова опять же приплели зачем то, полезный сигнал расположен на рисунке до пи (Fs/2), также как и мусор, так что с условием все нормально.

    Под алиасингом я всегда понимал искажения, вызванные несоблюдением требования по Котельникову:

    post-83540-1467293831_thumb.jpg

    Получается, что под алиасингом понимается любое нежелательная энергия сигнала на частотах до f.s/2?

    Почему полезный сигнал считается до Fs/2, а не ограничен интересующей нас полосой? Почему нас интересуют спектральные составляющие, лежащие вне полосы сигнала?

    post-83540-1467294537_thumb.jpg

  6. На dsplib мне не понятен рисунок 2а.

    1)Что это за спектральные линии? Как я понимаю синей сплошной показан спектр до дискретизации.

    post-83540-1467211861_thumb.png

    2)В институте учили, что требование по Котельникову заключаются в том, чтобы частота дискретизации была минимум в два раза выше верхней боковой частоты. Соотвественно наложение частот (алиасинг) должно выглядеть следующим образом:

    post-83540-1467212031_thumb.png

  7. Пишите, что читали dsplib, а на самом деле там рассмотрены в отдельности все блоки. Приведены все формулы, АЧХ, ФЧХ. Подробней описать в принципе невозможно. Что именно непонятно отсюда? http://www.dsplib.ru/content/cic/cic.html

    Мне не понятна физика работы. Да, там (и не только там) приведены формулы, АЧХ и ФЧХ, но физически я не могу понять, почему сначала сигнал надо накапливать, потом его вычитать. Почему эти блоки позволяют привести сигнал к требованию по Котельникову (а не просто выкинуть ненужные нам отсчеты без использования гребенки и интерполятора). Физическое понимание мне нужно для самостоятельного описания cic на hdl.

     

  8. Добрый день! Никак не могу понять принцип работы cic фильтра (дециматора и интерполятора), перелапатил кучу литературы (Р. Лайонс, А Сергеенко и т.д) и сайтов (dsplib, altera).

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

    post-83540-1467203822_thumb.png

    Вопросы:

    1) Для чего нужен каждый из блоков? Зачем требуется сначала накапливать, потом вычитать? Хочу понять именно физический смысл этих блоков.

    2) Почему эти блоки (интегратор и гребенки) позволяют нам привести сигнал к требованию по Котельникову после децимации? Не могу понять физический принцип этого.

     

  9. Здравствуйте, коллеги,

     

    В последних версиях Квартуса синтез фильтров перенесен в QSYS. Ok, делаю CIC. Все бы ничего, но не могу найти скрипт генерации коэффициентов компенсационного FIR для MATLAB. Раньше файл аккуратно лежал в фолдере проекта, а теперь он даже не упоминается при синтезе.

     

    Regards!

    NJ

     

    Работаю в Quartus 14.1. Столкнулся с этой же проблемой - в папке проекта скрипт генерации коэффициентов компенсационного фильтра отсутствует.

    В описании сказано, что Матлабовский скрипт будет лежать в папке с проектом:

    post-83540-1460634914_thumb.jpg

    Вы его нашли?

  10. Может быть значение pi приведено к формату fract из 12 бит? Тогда pi/2 буден равно pi/2 * (2^11 - 1) = 3216.

    Скорее всего так и есть.

     

     

    координаты автора есть в статье. почему бы его не спросить ?

    Автору статьи отписал. В случае ответа - отпишу.

     

  11. Добрый день!

    Решил повторить реализацию Cordic алгоритма из kit-e.ru/assets/files/pdf/2011_12_36.pdf на ПЛИС.

    Проект состоит из 5 модулей (структурная схема во вложении):

    1) reset_block.v - аппаратный сброс и установка всех регистров в начальное положение.

    2) step_control.v - модуль. формирующий шаг фазы для вычисления синуса и косинуса, а так же четверть в которой находится выходной сигнал

    3) Cordic.v - модуль, формирующий конвейер из блоков, вычисляющих выходные значения синуса и косинуса.

    4) rotator[0-15].v - модуль, поворачивающий вектор на заданный угол.

    5) select_quarter.v - модуль, подводящий вычисленное значение синуса и косинуса под весь диапазон АЦП.

    post-83540-1460533202_thumb.jpg

    В модуле step_control.v значение фазы Angle задает значение выходной частоты.

    В статье сказано, что значение Angle в 3216 соответствует фазе в 90 градусов, т.е увеличивая каждый такт значение Angle на 1, на выходе мы получим частоту равную f.out=F.clk/3216/4 (на 4 делится, чтобы получить полный период, а не только до 90 градусов).

    Откуда взято, что значение Angle в 3216 соответствует фазе в 90 градусов?

  12. Добрый день!

    Решил повторить реализацию Cordic алгоритма из kit-e.ru/assets/files/pdf/2011_12_36.pdf на ПЛИС.

    Проект состоит из 5 модулей (структурная схема во вложении):

    1) reset_block.v - аппаратный сброс и установка всех регистров в начальное положение.

    2) step_control.v - модуль. формирующий шаг фазы для вычисления синуса и косинуса, а так же четверть в которой находится выходной сигнал

    3) Cordic.v - модуль, формирующий конвейер из блоков, вычисляющих выходные значения синуса и косинуса.

    4) rotator[0-15].v - модуль, поворачивающий вектор на заданный угол.

    5) select_quarter.v - модуль, подводящий вычисленное значение синуса и косинуса под весь диапазон АЦП.

    post-83540-1460533202_thumb.jpg

    В модуле step_control.v значение фазы Angle задает значение выходной частоты.

    В статье сказано, что значение Angle в 3216 соответствует фазе в 90 градусов, т.е увеличивая каждый такт значение Angle на 1, на выходе мы получим частоту равную f.out=F.clk/3216/4 (на 4 делится, чтобы получить полный период, а не только до 90 градусов).

    Откуда взято, что значение Angle в 3216 соответствует фазе в 90 градусов?

  13. Добрый день!

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

    Передо мною стоят задачи:

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

    2)Написать загрузчик. На плате два процессора и одна флешка. Необходимо написать программу для прошивки флешки через процессор (в ee-240 нашел программирования флешки Atmel через BF ).

    За пару недель до этого начал работать с отладочной платой ADSP-BF533. Пока успел только познакомиться с архитектурой и с ассамблером. Поморгал диодиками, задействовал таймер и прерывания. Сейчас уже приходится перемещаться на реальную железку (без отладчика).

     

    1)При написании программы на отладочной плате пользовался готовым проектом и вносил туда изменения. В готовом проекте (в примерах) есть файл startup.h. Этот файл пользователь сам прописывает или же есть какой-нибудь генератор этого файла?

  14. Источник частоты для таймера какой выбрали? Там, вроде, 2 варианта PPI и SCLK. Просто ШИМ режим он же непрерывный. Т.е. счетчик не останавливается, а продолжает считать с 0, а то что сработало прерывание не означает что таймер не успел начать счет заново. А если частота выбрана SCLK, то и большое число будет рандомным, т.к. считает очень быстро

    Все верно, два источника частоты для таймера.Я выбрал SCLK.

    Значит я ошибочно считал, что при каждом "шаге"(F11) в дебагере (использую ADSP bf533 EZ KIT LITE), значение в TIMERx_COUNTER должно увеличиваться на 1.

     

    Не помню точно так или может быть наоборот считает на декремент.

    Числа вы видите рандомные потому что установлен бит EMU_RUN - при эмуляции таймер работает. Это означает что таймер работает даже если вы остановили программу в эмуляторе.

    Внутри прерывания сбрасываете статусный бит?

    Исходя из схемы работы таймера, счетчик таймера идет на инкремент и сравнивает свое значение с регистром TIMERx_COUNTER, пока значение в регистре счетчика не станет равным с TIMERx_COUNTER.

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

    Спасибо за объяснение.

    Сейчас попробую на железе помигать светодиодом, чтобы визуально оценить правильность работы таймера.

  15. Добрый вечер! Разбираюсь с таймером в BF533. Делаю программу мигания светодиодом по прерыванию таймера 0.

    По теории после включения таймера в режиме ШИМ (PWMOUT) в регист TIMERx_COUNTER должен записаться 0 и счетчиком инкрементироваться до значения в регистре TIMERX_PERIOD.

    В моем же случае в регистр TIMERx_COUNTER после включения таймера записывается рандомное число и с каждым новым тактом значение в данном регистре увеличивается на рандомное число (причем с каждым разом это число разное), соответсвенно и прерывание срабатывает почти сразу после начала выполнения программы(программа входит в обработчик прерываний, устанавливается нулевой бит в регистре TIMER_STATUS). В регистре TIMER_CONFIG устанавливаю биты:

    1)PWM_OUT - включение режима ШИМ

    2)OUT_DIS - запрещение сигнала на выходе TMRx

    3)PERIOD_CNT - генерируется ШИМ сигнал

    4)IRQ_EN - разрешение прерывания

    5)EMU_RUN - при эмуляции таймер работает

     

    Может быть кто-нибудь сталкивался с данной проблемой?

  16. Поверх загрузил свое приложение через debug, работает, правда если сделать цикл while(1), то программа куда-то вылетает... не понятно...

    А как вы загрузили приложение поверх прилодера для отладки?

    Делали ли что-нибудь, помимо установки галочки в дебаггере напротив "debug from symbol"?

    post-83540-1441346372_thumb.png

  17. Решил пересобрать проект с нуля для Arrow SoCKit.

    Первое - скомпилировал GHRD, получив:

    - .svd - для отладчика DS-5

    - .Handoff folder - описание аппаратной части для preloader generator

    - .sof - сама прошивка ПЛИС

    Второе - собираю прелоадер с помощью preloader generator и получаю:

    - u-boot-spl.bin - прелоадовский bin файл

    - preloader-mkpimage.bin - образ прелоадера

     

    Вопросы:

    1) как preloader записать записать на SD карту: какие файлы и какие разделы создавать на карте?

    2) После загрузки preloadera на SD планирую сделать отладку в debugger, опять же какие файлы добавлять в проект в eclipse для отладки?

     

     

     

  18. Если не ошибаюсь, помимо путей ПОИСКА библиотек, необходимо еще и сами библиотеки подключить

     

     

    В окне libraries (-l)

    Спасибо, сейчас попробую

     

    Спасибо, сейчас попробую

    Не в этом дело

  19. Пробую собрать проект GPIO, представленный в разделе example baremetal на сайте altera.

    Линковщик не может найти требуемые файлы, хотя принудительно указал путь к библиотекам.

    В чем может быть проблема?

    В первом вложении сама ошибка

    post-83540-1440487735_thumb.jpg

    во втором путь в библиотекам.

    post-83540-1440487742_thumb.jpg

  20. Зачем для такой задачи Linux и SoC?

    Может хватит обычного микроконтроллера?

    Цифровая обработка происходит в fpga, в SoC находится еще и процессор! Думаю отличный повод начать изучать что-то новое.

  21. Получилось потому что Вы прошили готовые образы для платы на SD карту и все.

    Вся работа по сборке была сделана за Вас.

    Спасибо за разъяснение, где то вычитал, что bootrom находится во флеш-памяти процессора, поэтому и ввел самого себя в заблуждение.

     

    вот тут почитайте, вполне доступно расписано:

    http://habrahabr.ru/company/metrotek/blog/235707/

    Сразу наткнулся на эту статью, но так как процесс заливки отличался от того, что представлено на rocketbard, решил повременить с разбором этой статьи.

     

     

     

    Ну это всего 8 Мбит/с. Посылать 4 байта через Eth нецелесообразно, если есть возможность, то лучше копить несколько слов, хотя бы байт до 32-64, а потом уже слать их. Eth не предназначен для частой посылки сверхмалых пакетов. Гораздо выгоднее слать сразу пачку. У вас точка-точка или устройство должно будет работать в сети со сложной топологией? Зачем вам tcp/ip? Может лучше взять обычный udp, который прост как валинок? Если у вас данные супер отвественные, то можно сгородить собственную систему подтверждения доставки и запроса на пересылку в случае ошибки. Если всё так, то вам можно не связываться с EMAC в составе HPS, линухом, dma и прочим. Вы можете взять свой/чужой простенький Eth контроллер с интерфейсом Avalon/AXI4, он на ура подключается к AMR через FPGA2HPS bridge. На него пишется простенький драйвер с поддержкой UDP/ARP/ICMP, больше вам ничего не понадобится.

    У меня точка-точка. tcp/ip - потому что на форуме посоветовали.

    Был вариант разбираться с bare-metal, но информации оказалось очень мало.

    Вариант с линуксом я выбрал, так как опыта написания дров у меня нет, вещи то может быть это и простые, но представления у меня о них очень слабые.

     

  22. Тут описан процесс загрузки линукса.

    http://rocketboards.org/foswiki/view/Docum...1#HPS_Boot_Flow

     

    Вкратце - вам надо собрать Preloader, U-boot и найти образ ядра под свою плату. Или собрать свое ядро, если плата уникальная.

    В первом сообщении я дал ссылку на мануал, в котором описывался процесс загрузки линукса без preloader и bootloader. Сделал все по этому мануалу и получилось через терминал (putty) поморгать диодиками на плате. Поэтому у меня возник вопрос - а почему так получилось? Так как я не собирал ни прилодер, ни бутлодер!

     

    Какая скорость? Какой протокол?

    Данные - это 32 разрядное слово идет с частотой 500 кГц.

    Как мне посоветовали надо делать tcp/ip

  23. У вас все в кучу свалено.

     

    Рассматирвайте SoC как два отдельных устрйоства.

    Процессор с ARM Cortex-A9 и FGPA.

    Сейчас я рассматриваю SoC именно как два разных устройства.

    Сообщения выше относятся к ARM Cortex-A9, так как именно на него я буду ставить linux.

    Как раз таки я хочу разгрести эту кучу и расставить все по полочкам.

     

×
×
  • Создать...