реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как законстрейнить DDR LVDS вход?
Vascom
сообщение Feb 22 2017, 12:25
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 2-08-07
Из: Москва
Пользователь №: 29 534



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

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


Подскажите как быть? Ведь наверняка кто-то делал такое.
Go to the top of the page
 
+Quote Post
Dr.Alex
сообщение Feb 22 2017, 15:14
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 386
Регистрация: 5-04-05
Из: моська, RF
Пользователь №: 3 863



Щас меня опять запинают приверженцы 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) ддр-регистр написан текстом на вхдл, а не через инстансы как у вас
Go to the top of the page
 
+Quote Post
Vascom
сообщение Feb 22 2017, 17:48
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 2-08-07
Из: Москва
Пользователь №: 29 534



Мне казалось разницы между set_input_delay и set_max_delay/set_min_delay нет.
Про написание DDR-регистра вручную думал, но вроде этот IDDR должен быть быстрее, оптимизирован, рядом с IOB.
Go to the top of the page
 
+Quote Post
Dr.Alex
сообщение Feb 22 2017, 18:18
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 386
Регистрация: 5-04-05
Из: моська, RF
Пользователь №: 3 863



Цитата(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 туда и отрядила.
Go to the top of the page
 
+Quote Post
Timmy
сообщение Feb 23 2017, 13:30
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 835
Регистрация: 9-08-08
Из: Санкт-Петербург
Пользователь №: 39 515



В вашем случае неконтролируемая задержка клока по цепям BUFG составила 3.8ns, она более, чем в два раза длиннее окна валидных данных, тут никакие констрейны не помогут(ну разве что неправильныеsm.gif ), надо использовать более быстрое тактовое дерево(BUFIO и т.п.) и/или компенсацию задержки с помощью IDELAY/DCM/PLL, вопрос обсасывали здесь уже раз десять.
Go to the top of the page
 
+Quote Post
Vascom
сообщение Feb 27 2017, 10:40
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 2-08-07
Из: Москва
Пользователь №: 29 534



С PLL тоже не срабатывает. Там же констрейны по другому задаются.
Где тут это десять раз обсасывали, чтобы 100% правильно написать констрейны?
Go to the top of the page
 
+Quote Post
Vascom
сообщение Mar 2 2017, 11:58
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 2-08-07
Из: Москва
Пользователь №: 29 534



С грехом пополам решил проблему использованием 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
Go to the top of the page
 
+Quote Post
Timmy
сообщение Mar 2 2017, 13:54
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 835
Регистрация: 9-08-08
Из: Санкт-Петербург
Пользователь №: 39 515



Цитата(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.
Go to the top of the page
 
+Quote Post
Vascom
сообщение Mar 2 2017, 13:58
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 2-08-07
Из: Москва
Пользователь №: 29 534



Изначально так и было сделано - в первом посте. Только FPGA плевать на то, что там на входе, ведь она имеет свои собственные задержки, которые оказываются разными для клока и данных - всё расползается.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 12th July 2025 - 09:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.0144 секунд с 7
ELECTRONIX ©2004-2016