Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как законстрейнить DDR LVDS вход?
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Vascom
Не могу понять, как правильно законстрейнить 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
Щас меня опять запинают приверженцы 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
Мне казалось разницы между set_input_delay и set_max_delay/set_min_delay нет.
Про написание DDR-регистра вручную думал, но вроде этот IDDR должен быть быстрее, оптимизирован, рядом с IOB.
Dr.Alex
Цитата(Vascom @ Feb 22 2017, 20:48) *
Мне казалось разницы между set_input_delay и set_max_delay/set_min_delay нет.

Скажем так вроде бы не должно быть (за исключением того что значение set_input_delay это период минус собсно внутр. задержка, надеюсь не забыли).

Цитата(Vascom @ Feb 22 2017, 20:48) *
Про написание DDR-регистра вручную думал, но вроде этот IDDR должен быть быстрее, оптимизирован, рядом с IOB.

Ну в реальности-то система тот же самый IDDR туда и отрядила.
Timmy
В вашем случае неконтролируемая задержка клока по цепям BUFG составила 3.8ns, она более, чем в два раза длиннее окна валидных данных, тут никакие констрейны не помогут(ну разве что неправильныеsm.gif ), надо использовать более быстрое тактовое дерево(BUFIO и т.п.) и/или компенсацию задержки с помощью IDELAY/DCM/PLL, вопрос обсасывали здесь уже раз десять.
Vascom
С PLL тоже не срабатывает. Там же констрейны по другому задаются.
Где тут это десять раз обсасывали, чтобы 100% правильно написать констрейны?
Vascom
С грехом пополам решил проблему использованием 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
Цитата(Vascom @ Mar 2 2017, 14:58) *
С грехом пополам решил проблему использованием 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
Изначально так и было сделано - в первом посте. Только FPGA плевать на то, что там на входе, ведь она имеет свои собственные задержки, которые оказываются разными для клока и данных - всё расползается.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.