Timmy
Участник-
Постов
852 -
Зарегистрирован
-
Посещение
Весь контент Timmy
-
Мне кажется, что miniByte подходит только для самых простых задач - ну типа светодиодом поморгать, передать в ком порт константную строчку и т.п. Поскольку в нём нет даже сложения двух регистров(сложение возможно только с константой), более сложные операции придётся выполнять, примерно как на машине Тьюринга :).
-
Не работает PCS/PMA Core
Timmy ответил Mityan тема в Среды разработки - обсуждаем САПРы
Прежде, чем передавать данные, SGMII контроллер должен синхронизироваться и обменяться конфигурационной информацией с Ethernet PHY. Поэтому, чтобы увидеть передачу данных, в тестбенч должен быть включён эмулятор PHY, где его брать, не знаю. -
Почему вы решили, что в битах? 2^16 - это тоже в словах.
-
Вы думаете - 12/16 - это длина берста в словах? А на самом деле она 2^{12}/2^{16}, разница именно в 16 раз.
-
Вы правы, в моём примере выходы adr остались неоконстрейнены и не оптимизировались. Однако ничто не мешает задать специально для них max/min_delay. А для input_delay мой способ удобнее, так как задержка до выводов adr учитывается автоматически и не надо больше ничего высчитывать и подгонять. Кстати, я не понимаю, о чём ваш спор с dxp. В каком случае timequest автоматически выдумывает проверять нулевой холд? На стр. 35 индусского манускрипта описан механизм автоматического определения отношений между latch & launch edges, ИМХО, логичный. Под hold/setup на стр.35 обозначаются разности latch-launch time, которые будут использованы при анализе на hold/setup. Или вам не нравится, что в TQ все клоки по умолчанию считаются синхронными, и на межклоковых асинхронных путях по умолчанию получится куча ошибок? Мне это тоже не нравится:).
-
Сделал упрощённый пример с асинхронной памятью. 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[*]} }
-
На асинхронной шине в качестве клоков описываются сигналы управления, и задаются сетапы-холды для сигналов данных относительно сигналов управления. Так что в принципе то же самое, что и для синхронной шины. На ПЛИС из-за особенностей архитектуры действительно приходится загонять дизайн в рамки "регистровщины". Другой вопрос, что иногда требуется задавать максимальную асинхронную задержку распространения сигнала(например, при переходе между клок доменами), и тут с ужасом обнаруживаем, что в TQ такой возможности просто нет.
-
-master_clock появился потому, что эти констрейны вводились копипастом того, что делает derive_pll_clocks, убирать лишнее лень:). без -add_delay получалось неправильно, хотя действительно странно. Посмотрел, на путь к sdram_clk варнинг есть, в DDR_Timing_Cookbook на такой клоковый порт ставят false_path.
-
Вот мой пример, как раз констрейны для 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
-
Простенький контроллер для SDRAM входит в состав QSYS и SOPB, его при необходимости можно использовать и отдельно, и надо внимательно прочитать документацию - там требуется правильно настроить фазу у дополнительного тактового сигнала.
-
Абсолютно по-другому, без кэша загрузка каждого байта будет порождать полный цикл доступа к внешней памяти. Кстати, побайтно вычесть два 32-битных слова вроде бы можно так: ((a|0xFF00FF00) - (b&0x00FF00FF)) & 0x00FF00FF | ((a|0x00FF00FF) - (b&0xFF00FF00)) & 0xFF00FF00;
-
Раз вы используете сигнал VALID, это подразумевает, что в момент активации SPI CS, сигнал VALID может быть неактивен. Таким образом, в клок домене "SPI CS" необходимо по единственному фронту CS синхронизировать VALID, принять решение - передавать данные или нет, и передать это решение обратно в системный клок домен, синхронизировав бит решения с системным клоком. И вы ничего не сказали, как собираетесь это выполнять. А в случае сброса фифо с заменой на новые данные будет ещё интереснее.
-
Прошу уточнить одну важную деталь: положим, в ФИФО уже лежит пакет данных, полностью готовый к отправке, и тут спонтанно рождается ещё один пакет. А мастер пока молчит, как рыба(CS неактивен). Следует ли отбросить старый пакет и готовиться отправлять сразу новый, или всё-таки отправить сначала старый?
-
Однажды я попробовал сделать именно так в Квартусе 13.1. Выяснилось, что шина wor нормально работает, только если смешивать сигналы исключительно assign-ами, а если её ещё указывать прямо в port mappings, то не работает. А потом это увидел заказчик, и попросил wor вообще не использовать, так как ему ничего не понятно:).
-
Это может быть связано и с разной полосой пропускания в интерконнекте, интересно, что в отчёте STA сказано на этот счёт?
-
Это очень даже вероятно. Думаю, при 400МГц не успевают переключаться линии общего интерконнекта, задержка по которым составляет ориентировочно более 2нс. Линия работает, как НЧ фильтр, и клок до конца не доходит. Теоретически, можно гарантировать прохождение клока через интерконнект, если максимальная задержка, выданная TRACE, составляет менее полупериода. А вот выделенные тактовые линии должны 400МГц пропускать.
-
Помогите подобрать MOSFET
Timmy ответил TOG тема в Схемотехника
Посмотреть можно, например, на Digikey параметрическим поиском. И не забывайте, что ток указан для температуры корпуса 25 градусов, в реальности всё скромнее. И такие транзисторы не стоит использовать в линейном режиме. -
нужно радио реле
Timmy ответил ЕстьДело тема в Предлагаю работу
Вы хотите подключить моторчики параллельно к двум платам управления? -
От ёмкости не могла разница в 2 раза набраться, ведь сигнал к АЦП эта ёмкость тоже сажает. Хотя надо бы уточнить у ТС контрольные точки. Может быть, решающую роль сыграл длинный заземлитель через крокодил.
-
Да, есть такое дело. Но это не объясняет двукратную просадку напряжения на линии к FPGA по сравнению с линией к ADC. 8 pf щуп имеет емкостное сопротивление 50 Ом на 400МГц, так что пользоваться им нужно с оглядкой. И вообще нет объяснения низкому напряжению на LVDS, разве что АЦП не сконфигурирован и ничего не передаёт. Кстати, это похоже на правду, ведь на осциллограмме LVDS 400МГц, а должно бы быть 200МГц.
-
Я тоже сталкивался с зацикливанием ActiveHDL при использовании always @(*). Заменил (*) на список чувствительности в явной форме, и зацикливаться перестал. Квартус синтезировал этот код без предупреждений и в том и в другом случае. Похоже на ошибку в ActiveHDL.
-
Вот эта фраза наводит на подозрение, что вы неправильно терминировали lvpecl, там одним резистором не обойтись. По lvds, внешние терминирующие резисторы надо ставить возле источника, если невозможно их установить в непосредственной близости от приёмника, я обсуждал эту тему при первом появлении на форуме:). Так у меня успешно работает lvds 200МГц на 250мм линии. Кстати, на 180мм линии 200МГц клок на строне передатчика становится почти не виден, так как излучённый сигнал противофазно складывается с отражённым, но на стороне приёмника при этом всё в порядке. В вашем случае можно попробовать использовать для LVDS внутренние терминаторы S6, а внешние отключить. Ну и всё это надо моделировать Hyperlynx-ом, там проблемы видно хорошо, если правильно модель сделать.
-
Обмен данными между задачами RTOS
Timmy ответил Rev0.0 тема в Операционные системы
Циклический опрос следует применять только в исключительных ситуациях. В вашем случае task2 может непрерывно спать до пробуждения со стороны task1 в момент поступления новых данных. Для пробуждения можно в завимости от OS и ситуации использовать mailbox, semaphore, event и т.п. И, похоже, вы хотите выкидывать часть входных данных, если они поступают слишком быстро(более одного сэмпла в миллисекунду), но не объявили эту цель в явном виде, и не описали условие выкидывания. -
axi_ad9361_dev_if.v написан по принципу "на отвяжись", правильно сделать выравнивание клока на его основе невозможно. Хотя можно подогнать эти самые delay, чтобы оно как-то работало на определённом чипе при определённой температуре и напряжении. Или даже не подгонять, скорее всего и так заработает, это стандартная китайская технология:). А по-хорошему - это xapp860.
-
А какие у вас рассуждения? Пример от AD плохой, в качестве основы лучше взять xapp860. В вашем случае, думаю, придётся мониторить окно только для rx_frame, и по нему синхронно подстраивать задержки всех данных. Кроме того, можно подстраивать задержку и для входного клока, что позволит раширить диапазон подстройки. Это всё, если частота не ниже 150-200МГц DDR, иначе придётся поворачивать фазу на MMCM.