Vascom 0 22 февраля, 2017 Опубликовано 22 февраля, 2017 · Жалоба Не могу понять, как правильно законстрейнить DDR вход от АЦП в Xilinx Vivado. Вроде бы всё делаю как надо: create_clock -name ADC_DCO_P -period 4.166 [get_ports ADC_DCO_P] set_input_delay -clock ADC_DCO_P -rise -max 1.880 [get_ports {ADC_OUT*}] set_input_delay -clock ADC_DCO_P -rise -min 0.200 [get_ports {ADC_OUT*}] set_input_delay -clock ADC_DCO_P -clock_fall -max -add_delay 1.880 [get_ports {ADC_OUT*}] set_input_delay -clock ADC_DCO_P -clock_fall -min -add_delay 0.200 [get_ports {ADC_OUT*}] set_false_path -rise_from [get_clocks ADC_DCO_P] -through [get_pins .*IDDR.*D -regexp -hierarchical] -fall_to [get_clocks ADC_DCO_P] set_false_path -fall_from [get_clocks ADC_DCO_P] -through [get_pins .*IDDR.*D -regexp -hierarchical] -rise_to [get_clocks ADC_DCO_P] LVDS данные со входа поступают на IBUFDS IBUFDS #( .DIFF_TERM("TRUE"), // Differential Termination .IBUF_LOW_PWR("FALSE"), // Low power="TRUE", Highest performance="FALSE" .IOSTANDARD("LVDS") // Specify the input I/O standard ) IBUFDS_adc_A ( .O (adc_A_pre), // Buffer output .I (ADC_OUT_1A_P), // Diff_p buffer input (connect directly to top-level port) .IB (ADC_OUT_1A_N) // Diff_n buffer input (connect directly to top-level port) ); И разделяются на два бита в IDDR: IDDR #( .DDR_CLK_EDGE("SAME_EDGE_PIPELINED"), // "OPPOSITE_EDGE", "SAME_EDGE" // or "SAME_EDGE_PIPELINED" .INIT_Q1(1'b0), // Initial value of Q1: 1'b0 or 1'b1 .INIT_Q2(1'b0), // Initial value of Q2: 1'b0 or 1'b1 .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC" ) IDDR_adc_A ( .Q1 (adc_A_out[0]), // 1-bit output for positive edge of clock .Q2 (adc_A_out[1]), // 1-bit output for negative edge of clock .C (clk_adc_dco), // 1-bit clock input .CE (1'b1), // 1-bit clock enable input .D (adc_A_pre), // 1-bit DDR data input .R (1'b0), // 1-bit reset .S (1'b0) // 1-bit set ); clk_adc_dco - клок, приходящий от ADC_DCO_P через BUFG. При этом вылезает дикое несоответствие по холдам: Подскажите как быть? Ведь наверняка кто-то делал такое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dr.Alex 0 22 февраля, 2017 Опубликовано 22 февраля, 2017 · Жалоба Щас меня опять запинают приверженцы set_input_delay которого я терпеть не могу, но я делаю проще: set_max_delay 3.1 -from [get_ports rd[*]] -to [get_cells rf_pos_reg[*]] -rise set_min_delay 0.0 -from [get_ports rd[*]] -to [get_cells rf_pos_reg[*]] -rise set_max_delay 3.1 -from [get_ports rd[*]] -to [get_cells rf_neg_reg[*]] -fall set_min_delay 0.0 -from [get_ports rd[*]] -to [get_cells rf_neg_reg[*]] -fall Только: 1) Это не лвдс 2) ддр-регистр написан текстом на вхдл, а не через инстансы как у вас Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vascom 0 22 февраля, 2017 Опубликовано 22 февраля, 2017 · Жалоба Мне казалось разницы между set_input_delay и set_max_delay/set_min_delay нет. Про написание DDR-регистра вручную думал, но вроде этот IDDR должен быть быстрее, оптимизирован, рядом с IOB. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dr.Alex 0 22 февраля, 2017 Опубликовано 22 февраля, 2017 · Жалоба Мне казалось разницы между set_input_delay и set_max_delay/set_min_delay нет. Скажем так вроде бы не должно быть (за исключением того что значение set_input_delay это период минус собсно внутр. задержка, надеюсь не забыли). Про написание DDR-регистра вручную думал, но вроде этот IDDR должен быть быстрее, оптимизирован, рядом с IOB. Ну в реальности-то система тот же самый IDDR туда и отрядила. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 23 февраля, 2017 Опубликовано 23 февраля, 2017 · Жалоба В вашем случае неконтролируемая задержка клока по цепям BUFG составила 3.8ns, она более, чем в два раза длиннее окна валидных данных, тут никакие констрейны не помогут(ну разве что неправильные:) ), надо использовать более быстрое тактовое дерево(BUFIO и т.п.) и/или компенсацию задержки с помощью IDELAY/DCM/PLL, вопрос обсасывали здесь уже раз десять. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vascom 0 27 февраля, 2017 Опубликовано 27 февраля, 2017 · Жалоба С PLL тоже не срабатывает. Там же констрейны по другому задаются. Где тут это десять раз обсасывали, чтобы 100% правильно написать констрейны? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vascom 0 2 марта, 2017 Опубликовано 2 марта, 2017 · Жалоба С грехом пополам решил проблему использованием PLL и вычитанием из констрейнов задержки, вносимой входным буфером. set_input_delay -clock ADC_DCO_P -rise -max 0.759 [get_ports {ADC_OUT*}] set_input_delay -clock ADC_DCO_P -rise -min -0.300 [get_ports {ADC_OUT*}] -add_delay set_input_delay -clock ADC_DCO_P -clock_fall -max 0.759 [get_ports {ADC_OUT*}] -add_delay set_input_delay -clock ADC_DCO_P -clock_fall -min -0.300 [get_ports {ADC_OUT*}] -add_delay Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 2 марта, 2017 Опубликовано 2 марта, 2017 · Жалоба С грехом пополам решил проблему использованием PLL и вычитанием из констрейнов задержки, вносимой входным буфером. set_input_delay -clock ADC_DCO_P -rise -max 0.759 [get_ports {ADC_OUT*}] set_input_delay -clock ADC_DCO_P -rise -min -0.300 [get_ports {ADC_OUT*}] -add_delay set_input_delay -clock ADC_DCO_P -clock_fall -max 0.759 [get_ports {ADC_OUT*}] -add_delay set_input_delay -clock ADC_DCO_P -clock_fall -min -0.300 [get_ports {ADC_OUT*}] -add_delay Меня терзают смутные сомненья, что вы решаете задачу не с того конца. Следует написать входные констрейны в соответствии с даташитом на АЦП и параметрами ПП, и создать дизайн, им удовлетворяющий, а не подгонять констрейны под дизайн. Тема констрейнов, АЦП и LVDS обсуждалась не менее 10 раз, погуглите. Ещё советую почитать аппноты по этой теме на чипы Virtex4, Virtex5, Virtex6, Virtex7, Kintex7, Artix7. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vascom 0 2 марта, 2017 Опубликовано 2 марта, 2017 · Жалоба Изначально так и было сделано - в первом посте. Только FPGA плевать на то, что там на входе, ведь она имеет свои собственные задержки, которые оказываются разными для клока и данных - всё расползается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться