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

Как законстрейнить DDR LVDS вход?

Не могу понять, как правильно законстрейнить 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.

 

При этом вылезает дикое несоответствие по холдам:

h_1487766153_9553366_be67ecb748.png

 

Подскажите как быть? Ведь наверняка кто-то делал такое.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Щас меня опять запинают приверженцы 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) ддр-регистр написан текстом на вхдл, а не через инстансы как у вас

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне казалось разницы между set_input_delay и set_max_delay/set_min_delay нет.

Про написание DDR-регистра вручную думал, но вроде этот IDDR должен быть быстрее, оптимизирован, рядом с IOB.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне казалось разницы между set_input_delay и set_max_delay/set_min_delay нет.

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

 

Про написание DDR-регистра вручную думал, но вроде этот IDDR должен быть быстрее, оптимизирован, рядом с IOB.

Ну в реальности-то система тот же самый IDDR туда и отрядила.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В вашем случае неконтролируемая задержка клока по цепям BUFG составила 3.8ns, она более, чем в два раза длиннее окна валидных данных, тут никакие констрейны не помогут(ну разве что неправильные:) ), надо использовать более быстрое тактовое дерево(BUFIO и т.п.) и/или компенсацию задержки с помощью IDELAY/DCM/PLL, вопрос обсасывали здесь уже раз десять.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С PLL тоже не срабатывает. Там же констрейны по другому задаются.

Где тут это десять раз обсасывали, чтобы 100% правильно написать констрейны?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С грехом пополам решил проблему использованием 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С грехом пополам решил проблему использованием 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Изначально так и было сделано - в первом посте. Только FPGA плевать на то, что там на входе, ведь она имеет свои собственные задержки, которые оказываются разными для клока и данных - всё расползается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...