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

Timmy

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

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

  • Посещение

Весь контент Timmy


  1. Мне кажется, что miniByte подходит только для самых простых задач - ну типа светодиодом поморгать, передать в ком порт константную строчку и т.п. Поскольку в нём нет даже сложения двух регистров(сложение возможно только с константой), более сложные операции придётся выполнять, примерно как на машине Тьюринга :).
  2. Прежде, чем передавать данные, SGMII контроллер должен синхронизироваться и обменяться конфигурационной информацией с Ethernet PHY. Поэтому, чтобы увидеть передачу данных, в тестбенч должен быть включён эмулятор PHY, где его брать, не знаю.
  3. Вы думаете - 12/16 - это длина берста в словах? А на самом деле она 2^{12}/2^{16}, разница именно в 16 раз.
  4. Вы правы, в моём примере выходы adr остались неоконстрейнены и не оптимизировались. Однако ничто не мешает задать специально для них max/min_delay. А для input_delay мой способ удобнее, так как задержка до выводов adr учитывается автоматически и не надо больше ничего высчитывать и подгонять. Кстати, я не понимаю, о чём ваш спор с dxp. В каком случае timequest автоматически выдумывает проверять нулевой холд? На стр. 35 индусского манускрипта описан механизм автоматического определения отношений между latch & launch edges, ИМХО, логичный. Под hold/setup на стр.35 обозначаются разности latch-launch time, которые будут использованы при анализе на hold/setup. Или вам не нравится, что в TQ все клоки по умолчанию считаются синхронными, и на межклоковых асинхронных путях по умолчанию получится куча ошибок? Мне это тоже не нравится:).
  5. Сделал упрощённый пример с асинхронной памятью. module async_ram_top(clk, adr, data); parameter w=10; input clk; output reg [w-1:0]adr; input [w-1:0]data; reg [w-1:0]dr; always @(posedge clk) begin dr <= data; adr <= dr; end endmodule Линии adr можно рассматривать, как нерегулярный, сгенерированный на регистрах "adr", клок, тактирующий снаружи входной сигнал data. В соответствии с этим положением и даташитом на SRAM пишутся констрейны, по которым TQ будет проверять все пути между всеми линиями adr и data. Время в пути между регистрами и портами adr автоматически добавится к задержке клока источника. Контроль холдов в данном случае очень желателен, так как для повышения рабочей частоты следует создать дополнительный сдвинутый клок, по которому защёлкивать data(этого в моём примере не сделано), чтобы выровнять слаки по сетапу и холду. Если писать констрейны, как предлагает SM, то тоже надо проверять холды с той же целью. create_clock -name clk -period 10.000 [get_ports {clk}] create_generated_clock -divide_by 1 -name adrs -source [get_ports {clk}] [get_registers {adr[*]~reg0}] for {set i 0} {$i < 10} {incr i} { set_input_delay -clock {adrs} -reference_pin [get_ports adr\[$i\]] -add_delay -max 4 {data[*]} set_input_delay -clock {adrs} -reference_pin [get_ports adr\[$i\]] -add_delay -min 2 {data[*]} }
  6. На асинхронной шине в качестве клоков описываются сигналы управления, и задаются сетапы-холды для сигналов данных относительно сигналов управления. Так что в принципе то же самое, что и для синхронной шины. На ПЛИС из-за особенностей архитектуры действительно приходится загонять дизайн в рамки "регистровщины". Другой вопрос, что иногда требуется задавать максимальную асинхронную задержку распространения сигнала(например, при переходе между клок доменами), и тут с ужасом обнаруживаем, что в TQ такой возможности просто нет.
  7. -master_clock появился потому, что эти констрейны вводились копипастом того, что делает derive_pll_clocks, убирать лишнее лень:). без -add_delay получалось неправильно, хотя действительно странно. Посмотрел, на путь к sdram_clk варнинг есть, в DDR_Timing_Cookbook на такой клоковый порт ставят false_path.
  8. Вот мой пример, как раз констрейны для SDRAM. Причём для правильных времянок потребовалось описать выводимый на SDRAM клок через create_generated_clock и привязывать set_*_delay именно к нему(а не sdram_clk, в моём примере). Только не помню, были ли там варнинги на unconstrained path to sdram_clk. set sdram_outs {sdram_dqml sdram_dqmh sdram_ras_n sdram_we_n sdram_cs_n sdram_cas_n sdram_ba[*] sdram_addr[*] sdram_dq[*]} #************************************************************** # Time Information #************************************************************** set_time_format -unit ns -decimal_places 3 #************************************************************** # Create Clock #************************************************************** create_clock -name {altera_reserved_tck} -period 100.000 -waveform { 0.000 50.000 } [get_ports {altera_reserved_tck}] create_clock -name {clk_ext} -period 20.833 -waveform { 0.000 10.416 } [get_ports {clk_ext}] #************************************************************** # Create Generated Clock #************************************************************** create_generated_clock -name clk -source [get_pins {pll_inst|altpll_component|auto_generated|pll1|inclk[0]}] \ -duty_cycle 50.000 -multiply_by 2 -master_clock {clk_ext} [get_pins {pll_inst|altpll_component|auto_generated|pll1|clk[0]}] create_generated_clock -name sdram_clk -source [get_pins {pll_inst|altpll_component|auto_generated|pll1|inclk[0]}] \ -duty_cycle 50.000 -multiply_by 2 -phase -90.0 -master_clock {clk_ext} [get_pins {pll_inst|altpll_component|auto_generated|pll1|clk[2]}] create_generated_clock -name cpu_clk -source [get_pins {pll_inst|altpll_component|auto_generated|pll1|inclk[0]}] \ -duty_cycle 50.000 -multiply_by 2 -master_clock {clk_ext} [get_pins {pll_inst|altpll_component|auto_generated|pll1|clk[3]}] create_generated_clock -name sdram_oclk -source [get_pins {pll_inst|altpll_component|auto_generated|pll1|clk[2]}] [get_ports {sdram_clk}] #************************************************************** # Set Clock Uncertainty #************************************************************** derive_clock_uncertainty #************************************************************** # Set Input Delay #************************************************************** set_input_delay -clock sdram_oclk -min 3 [get_ports sdram_dq*] set_input_delay -clock sdram_oclk -max -add_delay 6 [get_ports sdram_dq*] #************************************************************** # Set Output Delay #************************************************************** set_output_delay -clock sdram_oclk -min -1 [get_ports $sdram_outs] set_output_delay -clock sdram_oclk -add_delay -max 1.5 [get_ports $sdram_outs] #************************************************************** # Set Clock Groups #************************************************************** set_clock_groups -asynchronous -group [get_clocks {altera_reserved_tck}] #************************************************************** # Set Multicycle Path #************************************************************** set_multicycle_path -from [get_clocks {sdram_oclk}] -to [get_clocks {cpu_clk}] -setup -end 2
  9. Простенький контроллер для SDRAM входит в состав QSYS и SOPB, его при необходимости можно использовать и отдельно, и надо внимательно прочитать документацию - там требуется правильно настроить фазу у дополнительного тактового сигнала.
  10. Абсолютно по-другому, без кэша загрузка каждого байта будет порождать полный цикл доступа к внешней памяти. Кстати, побайтно вычесть два 32-битных слова вроде бы можно так: ((a|0xFF00FF00) - (b&0x00FF00FF)) & 0x00FF00FF | ((a|0x00FF00FF) - (b&0xFF00FF00)) & 0xFF00FF00;
  11. Раз вы используете сигнал VALID, это подразумевает, что в момент активации SPI CS, сигнал VALID может быть неактивен. Таким образом, в клок домене "SPI CS" необходимо по единственному фронту CS синхронизировать VALID, принять решение - передавать данные или нет, и передать это решение обратно в системный клок домен, синхронизировав бит решения с системным клоком. И вы ничего не сказали, как собираетесь это выполнять. А в случае сброса фифо с заменой на новые данные будет ещё интереснее.
  12. Прошу уточнить одну важную деталь: положим, в ФИФО уже лежит пакет данных, полностью готовый к отправке, и тут спонтанно рождается ещё один пакет. А мастер пока молчит, как рыба(CS неактивен). Следует ли отбросить старый пакет и готовиться отправлять сразу новый, или всё-таки отправить сначала старый?
  13. Однажды я попробовал сделать именно так в Квартусе 13.1. Выяснилось, что шина wor нормально работает, только если смешивать сигналы исключительно assign-ами, а если её ещё указывать прямо в port mappings, то не работает. А потом это увидел заказчик, и попросил wor вообще не использовать, так как ему ничего не понятно:).
  14. Это может быть связано и с разной полосой пропускания в интерконнекте, интересно, что в отчёте STA сказано на этот счёт?
  15. Это очень даже вероятно. Думаю, при 400МГц не успевают переключаться линии общего интерконнекта, задержка по которым составляет ориентировочно более 2нс. Линия работает, как НЧ фильтр, и клок до конца не доходит. Теоретически, можно гарантировать прохождение клока через интерконнект, если максимальная задержка, выданная TRACE, составляет менее полупериода. А вот выделенные тактовые линии должны 400МГц пропускать.
  16. Посмотреть можно, например, на Digikey параметрическим поиском. И не забывайте, что ток указан для температуры корпуса 25 градусов, в реальности всё скромнее. И такие транзисторы не стоит использовать в линейном режиме.
  17. Вы хотите подключить моторчики параллельно к двум платам управления?
  18. От ёмкости не могла разница в 2 раза набраться, ведь сигнал к АЦП эта ёмкость тоже сажает. Хотя надо бы уточнить у ТС контрольные точки. Может быть, решающую роль сыграл длинный заземлитель через крокодил.
  19. Да, есть такое дело. Но это не объясняет двукратную просадку напряжения на линии к FPGA по сравнению с линией к ADC. 8 pf щуп имеет емкостное сопротивление 50 Ом на 400МГц, так что пользоваться им нужно с оглядкой. И вообще нет объяснения низкому напряжению на LVDS, разве что АЦП не сконфигурирован и ничего не передаёт. Кстати, это похоже на правду, ведь на осциллограмме LVDS 400МГц, а должно бы быть 200МГц.
  20. Я тоже сталкивался с зацикливанием ActiveHDL при использовании always @(*). Заменил (*) на список чувствительности в явной форме, и зацикливаться перестал. Квартус синтезировал этот код без предупреждений и в том и в другом случае. Похоже на ошибку в ActiveHDL.
  21. Вот эта фраза наводит на подозрение, что вы неправильно терминировали lvpecl, там одним резистором не обойтись. По lvds, внешние терминирующие резисторы надо ставить возле источника, если невозможно их установить в непосредственной близости от приёмника, я обсуждал эту тему при первом появлении на форуме:). Так у меня успешно работает lvds 200МГц на 250мм линии. Кстати, на 180мм линии 200МГц клок на строне передатчика становится почти не виден, так как излучённый сигнал противофазно складывается с отражённым, но на стороне приёмника при этом всё в порядке. В вашем случае можно попробовать использовать для LVDS внутренние терминаторы S6, а внешние отключить. Ну и всё это надо моделировать Hyperlynx-ом, там проблемы видно хорошо, если правильно модель сделать.
  22. Циклический опрос следует применять только в исключительных ситуациях. В вашем случае task2 может непрерывно спать до пробуждения со стороны task1 в момент поступления новых данных. Для пробуждения можно в завимости от OS и ситуации использовать mailbox, semaphore, event и т.п. И, похоже, вы хотите выкидывать часть входных данных, если они поступают слишком быстро(более одного сэмпла в миллисекунду), но не объявили эту цель в явном виде, и не описали условие выкидывания.
  23. axi_ad9361_dev_if.v написан по принципу "на отвяжись", правильно сделать выравнивание клока на его основе невозможно. Хотя можно подогнать эти самые delay, чтобы оно как-то работало на определённом чипе при определённой температуре и напряжении. Или даже не подгонять, скорее всего и так заработает, это стандартная китайская технология:). А по-хорошему - это xapp860.
  24. А какие у вас рассуждения? Пример от AD плохой, в качестве основы лучше взять xapp860. В вашем случае, думаю, придётся мониторить окно только для rx_frame, и по нему синхронно подстраивать задержки всех данных. Кроме того, можно подстраивать задержку и для входного клока, что позволит раширить диапазон подстройки. Это всё, если частота не ниже 150-200МГц DDR, иначе придётся поворачивать фазу на MMCM.
×
×
  • Создать...