Jump to content

    

Digi

Свой
  • Content Count

    202
  • Joined

  • Last visited

Everything posted by Digi


  1. Продолжаю ковырять 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. Так собственно вопрос к прошедшим это, какие должны быть адреса ? И кто первым должен записаться ?
  2. Есть ли в TimeQuest возможность посмотреть графически, как я описал входные сигналы ? Например в моём пером описании я задал virtual_clock, по которому выставляются данные ADC*_D[*]. ADC*_CLK - фактический сигнал CLOCK и ADC*_FRM - FRAME. Можно ли увидеть, как эти сигналы будут приходить на входы элементов ? Если да, то как ? PS: Удалось прописать требуемые задержки для входных сигналов. В результате АЦП работает в QDR режиме, в диапазоне частот от 170 до 215 МГц. Требуемая 200 МГц. Такой узкий диапазон связан с тем, что сигнал FRM имеет задержку около 6 нс и защелкивает данные со смещением на такт. С чем это связано, пока не разобрался.
  3. Да. Это такты от второго канала микросхемы. Они точно такие же как и от первого. И при подключении на DDIO второго канала, тактов от первого канала, картина становится лучше. Что собственно и подтверждают времянки.
  4. Если я всё правильно понял, то 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 от первого канала, то ситуация значительно лучше.
  5. Если это делать по правильному, то нужно 8 CLK. У PLL нет такого количества выходов. К тому же всё равно придётся описывать времянки FRAME. Поэтому хотелось бы разобраться с правильным описанием времянок.
  6. Снимаю шляпу за проделанную работу и хорошее описание. Думаю для моих задач это круто будет. К тому же повторяемость есть. Нужно только подвинуть некоторые каналы. И PLL не хотелось бы использовать.
  7. Сейчас пытаюсь всё-же разобраться, как влияют set_input_delay и set_max_delay на времянки. Пока не понял. У меня на плате тоже 4 АЦП. Дорожки выровнены по длине с точностью 0,5мм. Ради интереса попробовал завести только один таккт и фрейм с первого канала на все приёмники. Работает нормально, кроме одной микросхемы. Но это не дело. Кстати пробовал тайминги прописать из примера этой корки и FAST_RESGISTERS тоже включил. Не помогло. Еще меня наводит на мысль то, что включив FAST_REGISTERS , timequest игнорирует задание каких либо задежек по входным линиям данных. Так ли это ?
  8. Попробовал описать по другому. Не пойму, что не устраивает его по времянкам и по какой причине возникают задержки. Собственно то, что по моему мнению я хотел указать в 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
  9. Пытаюсь вникнуть в 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
  10. Я имел ввиду, что корка, собранная под Pcie Gen2 x4 успешно определилась на интерфейсе Gen1 x1. Т.е. если необходимо запустить DMA на Gen1 то можно собрать корку под Gen2 и в теории всё должно заработать
  11. Добрался я до реализации DMA. Нашёл, почему Gen2 не работал. Оказалось, что просаживалось питание ПЛИС. Теперь работает Gen2 x4. Кстати, корка, сгенерированная как Gen2 x4 определяется и работает и на на Gen1 x1. Так что есть вероятность того, что это всё будет работать и с DMA тоже. Теперь вопрос к знатокам. Есть ли готовый блочный драйвер c DMA для работы со штатным режимом DMA PCIe корки ? Мне нужно прочитать/записать данные из памяти на шине Avalon в память компа. То что я нашёл, оказался весьма загонным и похоже он работает с Avalon ST а мне, как я понимаю, нужен AvalonMM.
  12. Посоветуйте трансформатор с приёмкой ВП. Напряжение 220 В - > 24 В, мощность около 400 Вт. Желательно тороидальный.
  13. Пока на inclock_en приходил сигнал с логики, то всё работало (до этого я не анализировал время прихода данных). Я подключил жёстко на inclock_en 1'b1 и после этого данные стали приходить не равномерно. Спасло прописать это: set_input_delay -clock {P1_CLKO} -min 2.7 [get_ports {P1_DO[*]}] set_input_delay -clock {P1_CLKO} -max 3.2 [get_ports {P1_DO[*]}] P1_CLKO и P1_DO это имена сигналов в самом верхнем уровне, соответствующие inclock и datain. Насколько корректно я это сделал, не могу понять. Получается что я указал задержку распостранения сигнала по внешним цепям, а по правильному нужно указывать допустимую задержку от пина до входа триггера. Но set_max(min)_delay у меня не сработали. Тем не менее вопрос для меня актуален, для общего развития (приходится переделывать старые проекты, а там часто встречались такие конструкции). PS: а в целом эта часть проекта заработала... но впереди много ещё чего предстоит )
  14. Сейчас столкнулся с тем, что не могу понять как прописать констрейны в проеке. Например первая сложность в том как прописать запираемое тактирование: (Сдвиговый регистр для приёма данных от 4х битного DDR для линк порта ADSP TS-201) wire inclock_gated = inclock & inclock_en; reg [11:0] datain_pos; reg [11:0] datain_neg; always @(posedge inclock_gated or negedge rst_n) if (~rst_n) datain_pos <= 12'b0; else datain_pos <= {datain, datain_pos[11:4]}; always @(negedge inclock_gated or negedge rst_n) if (~rst_n) datain_neg <= 12'b0; else datain_neg <= {datain, datain_neg[11:4]}; reg [4:0] pos_edges; reg [4:0] neg_edges; reg [15:0] pos_data; reg [15:0] neg_data; always @(posedge inclock_gated) if (freeze_pos) pos_data <= {datain, datain_pos}; always @(negedge inclock_gated) if (freeze_neg) neg_data <= {datain, datain_neg}; wire [31:0] shift_reg; assign shift_reg = {neg_data[15:12], pos_data[15:12], neg_data[11:8], pos_data[11:8], neg_data[7:4], pos_data[7:4], neg_data[3:0], pos_data[3:0]}; Ведь нужно учесть задержку inclock_gated относительно inclock. А потом уже относительно inclock_gated прописать допустимую задержку входных сигналов datain... Как бы вы порекомендовали ? Ещё выяснил, что от внешних пинов, до регистра datain_pos сигналы приходят с разной задержкой. Как их выровнять ?
  15. Я же писал, что этот блок работает с PCIe Gen2 x4, А у меня х1. С таким интерфейсом он не работает
  16. Оно примерно так и есть, это блок памяти подключен к контроллеру PCIe а с другой стороны подключен мой контроллер. Этот блок памяти является буфером обмена между компом и и моей железкой.
  17. Ага. Потом буду голову ломать, как к этому внешний DMA контроллер прикрутить и надыбать драйвер ))) Так как разрядность шины 64бит, а Avalon MM DMA работает только с шиной 128 бит. А так как 128 бит возможно только на Gen2 4х а у меня только 1х Gen1 то Avalon MM DMA не доступен. Поэтому только внешний контроллер....
  18. Не знаю, чем мне поможет Instance контроллера в QSys ведь к нему всё равно от памяти будет идти интерфейс Avalon. Мне то нужно вытащить(экспортировать) сигналы порта памяти. Чтобы получилась Instance в Qsys Двухпортовой памяти, к которой к одному порту подключена шина Avalon а другой порт экспортировался наружу в виде сигналов. К тому же у меня нет опыта в создании своего Instance для QSys. Временно решил проблему так, так как пока что только только чтение контроллером из памяти, я экспортировал Avalon второго порта и подключил соответствующие сигналы к контроллеру. Диаграмма работы шины вроде совпадает с диаграммой голой памяти.
  19. Так как раз и хотел получить прямые сигналы второго порта памяти вывести на контроллер. Так как контроллер уже отлажен с ними. Сейчас вытащил Avalon шину второго порта памяти, пытаюсь её прилепить к контроллеру.
  20. Получается что переходник или с Авалон Master на стандартный интерфейс памяти и память ставить вне Platform Designer или с Avalon Slave . На этой шине уже висят устройства с некоторым диапазоном адресов. Я хотел другой диапазон адресов этой же шины отдавать наружу в виде адрес/данные. Для дальнейшей работой с ними. Это будет доступ к банку регистров контроллера.
  21. С IO и памятью немного разобрался, заработало. Теперь задача стоит сопрячь 2х портовую память с Avalon-MM и самописным , внешним, контроллером. То есть я с одной стороны в Platform builder подключил 2х портовую память к Avalon а вот как получить обычные сигналы второго порта , не Avalon , чтобы прикрутить их к моему контроллеру ? И другой вопрос, что использовать для того чтобы вывести от Avalon MM Master наружу сигналы адрес, данные, чтение, запись , для того чтобы их использовать в своём контроллере ?
  22. Пока проблему решил путём аппаратной доработки железки. Кинул внешние проводники, высверлив старые.
  23. У меня как раз десятка, и там такого не нашел. И этого в логах тоже не нашёл... По идее этот параметр должен был быть применён. Ещё поковыряюсь, как чего наковыряю - сообщу. :)
  24. В каком описании это нашли ? Мне как раз и надо чтобы было NO_DC_GAIN, а Transciever Toolkit показывает значение по умолчанию 4.