Jump to content

    

Digi

Свой
  • Content Count

    206
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Digi

  • Rank
    Местный
  • Birthday 07/10/1978

Контакты

  • Сайт
    Array
  • ICQ
    Array

Recent Profile Visitors

3117 profile views
  1. Продолжаю причёсывать проект и разбираться с TimeQuest. Чтобы не плодить темы, продолжу здесь. Сейчас описываю входной порт DDR Link порта. Кусок кода входного блока выглядит так: reg [11:0] datain_pos; reg [11:0] datain_neg; always @(posedge P1_CLKO or negedge rst_n) if (~rst_n) datain_pos <= 12'b0; else datain_pos <= {P1_DO, datain_pos[11:4]}; always @(negedge P1_CLKO or negedge rst_n) if (~rst_n) datain_neg <= 12'b0; else datain_neg <= {P1_DO, datain_neg[11:4]}; Входной clock описал так: create_clock -name {P1_CLKO} -period 5.0 -waveform { 0.000 2.5 } [ get_ports P1_CLKO] Задержка P1_CLKO 7.2ns report_path -from P1_CLKO -npaths 32 -panel_name {Report Path} Report Path: Found 32 paths. Longest delay is 7.211 -from [get_keepers {P1_CLKO}] -panel_name "Report Path" Задержка P1_DO[0] 3.8 ns report_path -from P1_DO[0] -npaths 32 -panel_name {Report Path} Теперь если в *.sdc прописать , то задержка P1_DO[*] становится примерно 10.4 ns # CLKO - 7.18 DO - 10.44 set_input_delay -max -clock [get_clocks {P1_CLKO}] 0.65 [get_ports {P1_DO[*]}] set_input_delay -min -clock [get_clocks {P1_CLKO}] 0.55 [get_ports {P1_DO[*]}] set_input_delay -add_delay -max -clock_fall -clock [get_clocks {P1_CLKO}] 0.65 [get_ports {P1_DO[*]}] set_input_delay -add_delay -min -clock_fall -clock [get_clocks {P1_CLKO}] 0.55 [get_ports {P1_DO[*]}] Если прописать , то задержка P1_DO[*] становится примерно 7,4 ns. Всё начинает работать как положено, но вылезают слаки по P1_CLKO на -2,3 нс # CLKO - 7.18 DO - 7.4 Warning CLKO set_input_delay -max -clock [get_clocks {P1_CLKO}] 2.65 [get_ports {P1_DO[*]}] set_input_delay -min -clock [get_clocks {P1_CLKO}] 2.55 [get_ports {P1_DO[*]}] set_input_delay -add_delay -max -clock_fall -clock [get_clocks {P1_CLKO}] 2.65 [get_ports {P1_DO[*]}] set_input_delay -add_delay -min -clock_fall -clock [get_clocks {P1_CLKO}] 2.55 [get_ports {P1_DO[*]}] Как для моего случая правильно прописать констрейны ? И почему возникает большая задержка в 10 нс при уменьшении параметра ?
  2. 10 мс ждал )))) Ещё поковыряю, 100% что то не так накодил ) Само собой. Да и код написан так, что доступ к драйверу разграничивается семафорами.
  3. Я пробовал выводить все флаги до передачи и потом через некоторое время после передачи и везде считывал нули. Считывал так же как и в примере. Хотя очень вероятно, что где то что то не учёл... Хотел привести, но похоже я где то запутался. ))) Распутаюсь, думаю вопрос снимется ))
  4. Передачу (DMA_RD) запустил, спасибо огромное за помощь. Думаю и DMA_WR тоже заработает. Но не пойму, почему не выставляются флаги завершения операции. А почему во всех примерах заполняют сразу 128 дескрипторов одним и тем же значением, за исключением номера ? По идее необходимо заполнить только следующий дескриптор, от текущего ?
  5. Продолжаю ковырять DMA. Возникли непонятки с описанием регистров Имею в наличии AN829 (который кстати, если его прошить, не запустился не даёт загрузиться Linux загрузчику. Причём Windows стартует нормально.), и несколько описаний Нашел на интеловском форуме пример описания адресов, которое по смыслу вроде правильное. Система В исходниках AN829 написано совершенно не так как советуют на форуме, (да ещё и с опечаткой в исходниках вместо RD_CTRL_BUF_BASE_HI написали WR_CTRL_BUF_BASE_HI ) Но суть не в этом, а в том что адреса в QSys прописаны как 0x8000_0000 для RD и 0x8000_2000 для WR, а в define драйвера прописаны значения, которые указывают на верхний и нижний граничный адрес. В описании от Intel тоже я не сильно понял, написано что сначала нужно прописать адрес по смещению 0x000c, то есть после записи самого себя. И а регистр 0x0008 после того как он же будет прописан. Ну ещё как вариант я сильно туплю и не дружу с английским. Причём в примере AN829 пишется сначала LOW, затем HIGH. . Сам я пробовал делать по разному, но DMA обмен не стартует. Флаги завершения передачи не выставляются. Первый раз читался как 0xff , после - то что записал. Программировал только один канал, на запись из host в avalon. Соответственно для DMA контроллера использовал регистры RD. К контроллеру и шине подключена однопортовая on-chip память одновременно к BAR2, к dma_wr_master и dma_rd_master. Так собственно вопрос к прошедшим это, какие должны быть адреса ? И кто первым должен записаться ?
  6. Есть ли в TimeQuest возможность посмотреть графически, как я описал входные сигналы ? Например в моём пером описании я задал virtual_clock, по которому выставляются данные ADC*_D[*]. ADC*_CLK - фактический сигнал CLOCK и ADC*_FRM - FRAME. Можно ли увидеть, как эти сигналы будут приходить на входы элементов ? Если да, то как ? PS: Удалось прописать требуемые задержки для входных сигналов. В результате АЦП работает в QDR режиме, в диапазоне частот от 170 до 215 МГц. Требуемая 200 МГц. Такой узкий диапазон связан с тем, что сигнал FRM имеет задержку около 6 нс и защелкивает данные со смещением на такт. С чем это связано, пока не разобрался.
  7. Да. Это такты от второго канала микросхемы. Они точно такие же как и от первого. И при подключении на DDIO второго канала, тактов от первого канала, картина становится лучше. Что собственно и подтверждают времянки.
  8. Если я всё правильно понял, то Report Path показывает путь сигнала от вывода м/с до регистра. В данном случае я смотрю путь от вывода данных до первого регистра, работающего на CLK (400 МГц). Задержка составила 1,515 нс. На всех каналах порядок примерно такой же. CLK приходят на выделенные ноги и данные на выводы DQ/DQS. На второй картинке я смотрю Report Path от CLK. Но не пойму, почему он составляет 4.4 нс. Я правильно понимаю, что путь сигнала ADC1_CLK от вывода до входа регистра ddio.clk составляет 4.4 нс ? На последнем скрине показаны задержки сигнала от ADC*_CLK до одного из входных регистров. Так как время получается разное, то это и объясняет, почему эта конструкция не работает как ожидалось. Посмотрел путь сигнала FRAME - он у для всех равен и составляет около 7.5 нс. Это опять же при условии, что я смотрю именно то что нужно и правильно интерпретировал результаты. PS: А так это и есть Альтера. По поводу частотки должно быть всё нормально, так как часть каналов работает стабильно и на 250 МГц. Так же если для всех использовать только CLK и FRAME от первого канала, то ситуация значительно лучше.
  9. Если это делать по правильному, то нужно 8 CLK. У PLL нет такого количества выходов. К тому же всё равно придётся описывать времянки FRAME. Поэтому хотелось бы разобраться с правильным описанием времянок.
  10. Снимаю шляпу за проделанную работу и хорошее описание. Думаю для моих задач это круто будет. К тому же повторяемость есть. Нужно только подвинуть некоторые каналы. И PLL не хотелось бы использовать.
  11. Сейчас пытаюсь всё-же разобраться, как влияют set_input_delay и set_max_delay на времянки. Пока не понял. У меня на плате тоже 4 АЦП. Дорожки выровнены по длине с точностью 0,5мм. Ради интереса попробовал завести только один таккт и фрейм с первого канала на все приёмники. Работает нормально, кроме одной микросхемы. Но это не дело. Кстати пробовал тайминги прописать из примера этой корки и FAST_RESGISTERS тоже включил. Не помогло. Еще меня наводит на мысль то, что включив FAST_REGISTERS , timequest игнорирует задание каких либо задежек по входным линиям данных. Так ли это ?
  12. Попробовал описать по другому. Не пойму, что не устраивает его по времянкам и по какой причине возникают задержки. Собственно то, что по моему мнению я хотел указать в sdc файле Задаём частоту CLK и FRAME. Так как CLK фактически смещён на 90 градусов, а данные приходятся на его середину, я не стал указывать сдвиг CLK Считаю что фронт я укажу в set_input_delay -max который равен (половине периода CLK - tSetup). min set_clock_groups я указал связные клоки. Т.е. CLK и FRAME с каждого из АЦП. Направьте на путь истинный. Куда копать, куда смотреть и как достичь того, чтобы Данные приходили на регистры за требуемое время ? set adc_data_period 5.000 set adc_frame_preiod [expr $adc_data_period * 2] set max_data_delay 2.19 set min_data_delay 0.29 #set adc_tsu 0.31 #set adc_th 0.29 create_clock -name {ADC1_CLK} -period $adc_data_period [get_ports {ADC1_CLK}] create_clock -name {ADC1_FRM} -period $adc_frame_preiod [get_ports {ADC1_FRM}] # Front edge of adc data set_input_delay -clock ADC1_CLK -max $max_data_delay [get_ports {ADC1_D[*]}] set_input_delay -clock ADC1_CLK -min $min_data_delay [get_ports {ADC1_D[*]}] -add_delay # Back edge of adc data set_input_delay -clock ADC1_CLK -max $max_data_delay [get_ports {ADC1_D[*]}] -add_delay -clock_fall set_input_delay -clock ADC1_CLK -min $min_data_delay [get_ports {ADC1_D[*]}] -add_delay -clock_fall set_clock_groups -exclusive -group [get_clocks {ADC1_CLK ADC1_FRM} ] # Пример был такой #create_clock –period $_period –name CLK1x [get_ports clkin] #set_input_delay -clock CLK1X -max [expr $_period / 2 – 0.4] din #set_input_delay -clock CLK1X -min 0.2 din -add_delay #set_input_delay -clock CLK1X -max [expr $_period / 2 – 0.4] din -add_delay -clock_fall #set_input_delay -clock CLK1X -min 0.2 din -add_delay -clock_fall
  13. Пытаюсь вникнуть в TimeQuest. Есть АЦП ads42lb69 8 каналов, работающие на частоте 200 Мгц с выходом в режиме QDR. ПЛИС Cyclone 10 GX. У АЦП есть выходы ADC_CLK (DxCLK) (400МГц) ADC_FRM (DxFRAMEM) (200МГц) ADC_D[n]. Эти сигналы поключены к корке altera_gpio работающей в режиме HalfRate, DDIO, 4 bit. Тут я пытался описать допустимую задержку прихода данных относительно ADC_FRM, это в принципе не правильно, так как задержку необходимо описывать относительно ADC_CLK, с ней я вообще не добился никаких положительных результатов. Но при таком описании проект заработал за исключением одного канала. Тем не менее я так и не понял, как правильно описать констрейны для случая с QDR когда данные выставляются по сдвинутому на 90град клоку, приходит клок и Frame? Констрейны описал вот так (таковая CLK200 МГц FRM-100 МГц): #------------------- ADC timing definition ------------------------- set adc_data_period 5.000 set adc_frame_preiod [expr $adc_data_period * 2] set frm_min_delay 0.3 set max_data_delay 0.31 set min_data_delay 0.29 #set adc_tsu 0.31 #set adc_th 0.29 create_clock -name virtual_clock_adc -period $adc_data_period -waveform { 1.250 3.750 } create_clock -name {ADC1_CLK} -period $adc_data_period [get_ports {ADC1_CLK}] create_clock -name {ADC1_FRM} -period $adc_frame_preiod [get_ports {ADC1_FRM}] set_input_delay -clock virtual_clock_adc -max $max_data_delay [get_ports {ADC1_D[*]}] -add_delay set_input_delay -clock virtual_clock_adc -min $min_data_delay [get_ports {ADC1_D[*]}] -add_delay set_input_delay -clock {ADC1_CLK} $frm_min_delay [get_ports {ADC1_FRM}] -add_delay set_input_delay -clock {ADC1_CLK} $frm_min_delay [get_ports {ADC1_FRM}] -add_delay -clock_fall set_false_path -fall_from virtual_clock_adc -rise_to ADC*_CLK set_false_path -rise_from virtual_clock_adc -fall_to ADC*_CLK
  14. Я имел ввиду, что корка, собранная под Pcie Gen2 x4 успешно определилась на интерфейсе Gen1 x1. Т.е. если необходимо запустить DMA на Gen1 то можно собрать корку под Gen2 и в теории всё должно заработать
  15. Добрался я до реализации DMA. Нашёл, почему Gen2 не работал. Оказалось, что просаживалось питание ПЛИС. Теперь работает Gen2 x4. Кстати, корка, сгенерированная как Gen2 x4 определяется и работает и на на Gen1 x1. Так что есть вероятность того, что это всё будет работать и с DMA тоже. Теперь вопрос к знатокам. Есть ли готовый блочный драйвер c DMA для работы со штатным режимом DMA PCIe корки ? Мне нужно прочитать/записать данные из памяти на шине Avalon в память компа. То что я нашёл, оказался весьма загонным и похоже он работает с Avalon ST а мне, как я понимаю, нужен AvalonMM.