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

Все зависит от PHY. Если у Вас MAC-интрефейс RGMII и фронты тактового сигнала совпадают с началом/концом данных (нет сдвига, именно так работает например 88E1111 и 88E1145 по умолчанию), то можно применить констрейн наподобие снизу:

 

NET "rgmii_rx_clk0" TNM_NET = "phy_clk_rx0";
TIMESPEC TS_phy_rx0 = PERIOD "phy_rx0" 8 ns HIGH 50 %;
///////////////////////////////////////////////////////
INST "rgmii_rxd0[0]" TNM = "rgmii_rx_d0_0";
INST "rgmii_rxd0[1]" TNM = "rgmii_rx_d0_1";
INST "rgmii_rxd0[2]" TNM = "rgmii_rx_d0_2";
INST "rgmii_rxd0[3]" TNM = "rgmii_rx_d0_3";
INST "rgmii_rx_ctl0" TNM = "rgmii_rx_ctrl0";
///////////////////////////////////////////////////////
TIMEGRP "rgmii_rx_d0_0" OFFSET = IN 0 ns VALID 3.5 ns BEFORE "rgmii_rx_clk0" RISING;
TIMEGRP "rgmii_rx_d0_0" OFFSET = IN 0 ns VALID 3.5 ns BEFORE "rgmii_rx_clk0" FALLING;

TIMEGRP "rgmii_rx_d0_1" OFFSET = IN 0 ns VALID 3.5 ns BEFORE "rgmii_rx_clk0" RISING;
TIMEGRP "rgmii_rx_d0_1" OFFSET = IN 0 ns VALID 3.5 ns BEFORE "rgmii_rx_clk0" FALLING;

TIMEGRP "rgmii_rx_d0_2" OFFSET = IN 0 ns VALID 3.5 ns BEFORE "rgmii_rx_clk0" RISING;
TIMEGRP "rgmii_rx_d0_2" OFFSET = IN 0 ns VALID 3.5 ns BEFORE "rgmii_rx_clk0" FALLING;

TIMEGRP "rgmii_rx_d0_3" OFFSET = IN 0 ns VALID 3.5 ns BEFORE "rgmii_rx_clk0" RISING;
TIMEGRP "rgmii_rx_d0_3" OFFSET = IN 0 ns VALID 3.5 ns BEFORE "rgmii_rx_clk0" FALLING;

TIMEGRP "rgmii_rx_ctrl0" OFFSET = IN 0 ns VALID 3.5 ns BEFORE "rgmii_rx_clk0" RISING;
TIMEGRP "rgmii_rx_ctrl0" OFFSET = IN 0 ns VALID 3.5 ns BEFORE "rgmii_rx_clk0" FALLING;

 

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

   (* IODELAY_GROUP = "group_1_0" *) // Specifies group name for associated IODELAYs and IDELAYCTRL
   IODELAY # (
      .DELAY_SRC("I"),  // Specify which input port to be used, "I"=IDATAIN,
                        //  "O"=ODATAIN, "DATAIN"=DATAIN, "IO"=Bi-directional
      .HIGH_PERFORMANCE_MODE("TRUE"), // "TRUE" specifies lower jitter
                                      //   at expense of more power 
      .IDELAY_TYPE("FIXED"),  // "FIXED" or "VARIABLE" 
      .IDELAY_VALUE(15),         // 0 to 63 tap values
      .ODELAY_VALUE(0),         // 0 to 63 tap values
      .REFCLK_FREQUENCY(200.0), // Frequency used for IDELAYCTRL
                                //   175.0 to 225.0
      .SIGNAL_PATTERN("DATA")  // Input signal type, "CLOCK" or "DATA" 
   ) IODELAY_D0 (
      .DATAOUT(rgmii_rxd_delay[0]),   // 1-bit delayed data output
      .C(1'b0),     // 1-bit clock input
      .CE(1'b0),   // 1-bit clock enable input
      .DATAIN(1'b0),     // 1-bit internal data input
      .IDATAIN(rgmii_rxd[0]),   // 1-bit input data input (connect to port)
      .INC(1'b0), // 1-bit increment/decrement input
      .ODATAIN(),   // 1-bit output data input
      .RST(1'b0), // 1-bit active high, synch reset input
      .T(1'b0)      // 1-bit 3-state control input
   );

В отчете должно получиться примерно следующее:

Slack (setup path):     0.987ns (requirement - (data path - clock path - clock arrival + uncertainty)) 
   Source:               rgmii_rxd0<0> (PAD) 
   Destination:          RGMII_test/rgmii_0/IDDR_0 (FF) 
   Destination Clock:    RGMII_test/rgmii_0/clk_out_iodelay rising at 0.000ns 
   Requirement:          0.000ns 
   Data Path Delay:      2.939ns (Levels of Logic = 2) 
   Clock Path Delay:     3.951ns (Levels of Logic = 3) 
   Clock Uncertainty:    0.025ns

Т.е. TSetup~1нс, чего вполне достаточно для корректного приема.

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


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

P.S. такие большие задержки по клоку могут быть из-за :

1. Входящий клок заведен на не клоковый пин.

2. Кривое использование DCM.

1) Сигнал e0gtxclk заведен на V26 (IO_L40P_GCLK11_M1A5_1), сигнал e0rxclk на W27 (IO_L41P_GCLK9_IRDY1_M1RASN_1), сигнал e0txclk на W28 (IO_L41N_GCLK8_M1CASN_1).

Если я правильно понимаю, это клоковые пины, но так как я новичок :rolleyes: , я могу ошибаться, поправьте меня пожалуйста, если это не так.

Такое ощущение, что проблема во внутренних сигналах TX_CLKG и RX_CLKG. Может их надо как-то "по особому" определить?

2) Очень может быть, что здесь "кривое использование DCM", так как я не знаю что это. :rolleyes: Может направите где узнать об этом можно?

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


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

1) Сигнал e0gtxclk заведен на V26 (IO_L40P_GCLK11_M1A5_1), сигнал e0rxclk на W27 (IO_L41P_GCLK9_IRDY1_M1RASN_1), сигнал e0txclk на W28 (IO_L41N_GCLK8_M1CASN_1).

Если я правильно понимаю, это клоковые пины, но так как я новичок :rolleyes: , я могу ошибаться, поправьте меня пожалуйста, если это не так.

Такое ощущение, что проблема во внутренних сигналах TX_CLKG и RX_CLKG. Может их надо как-то "по особому" определить?

2) Очень может быть, что здесь "кривое использование DCM", так как я не знаю что это. :rolleyes: Может направите где узнать об этом можно?

1. У 6 Спартана есть одна странная особенность. У него 24 клоковых буфера на чип. Но из них всего 8 являются полноценно глобальными, остальные 16 - могут напрямую драйвить только половину (левую или правую) чипа.

У вас выбраны клоковые пины, однако оба они могут напрямую драйвить только правую половину чипа. Соответственно если какая-то логика (или пины I/O) расположены в левой половине (это можно поглядеть в XDE или PlanAhead) то путь клока до этих элементов сильно удлиняется. Обо всём этом можно почитать в ug382. Чтобы что-то сказать наверняка надо поглядеть развёрнутый тайминг репорт полностью. Если не затруднит - выложите плиз.

2. Если вы сами не пытались вставлять DCM для компенсации задержки по клоку, то скорее всего в пути клока нет неправильно включенной DCM. О том как использовать DCM также можно почитать в ug382.

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


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

top_tcp.txt - это ucf файл, там я подправил Timing Constraints, но что-то я опять не уверен в их правильности...

top_tcp_twx.txt - это файл, сгенерированный Timing Analyzer Post-Place & Route. Мне там не нравится сигнал e0tx_en, что-то слишком большая задержка у него, если я правильно понимаю. Он уходит с ПЛИС на физ.уровень, с компоненты TOP_LEVEL_TCP, COM5401, GMII_MII_WRAPPER сигнала TX_EN, который тоже в свою очередь вносит задержку. Можно ли эти задержки как-то минимизировать?

 

P.S. файлы .txt формата, так как мне нельзя загружать файлы форматов .ucf и .twx.

 

top_tcp.txt

top_tcp_twx.txt

Изменено пользователем Tolas

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


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

Все зависит от PHY. Если у Вас MAC-интрефейс RGMII и фронты тактового сигнала совпадают с началом/концом данных (нет сдвига, именно так работает например 88E1111 и 88E1145 по умолчанию)

Я использую GMII, ниже приведу рисунок из Datasheet на Marvell Alaska с временными характеристиками для gtx_clk сигнала.

post-60881-1422520919_thumb.png

Еще нашел для tx_en:

post-60881-1422521375_thumb.png

Я так понимаю, исходя из этих данных, я должен составить правильные Timing Constraint... Для GTX_CLK period боле-менее понятно, а вот как это соотносится с сигналами данных TXD?..

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


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

Я использую GMII, ниже приведу рисунок из Datasheet на Marvell Alaska с временными характеристиками для gtx_clk сигнала.

Я так понимаю, исходя из этих данных, я должен составить правильные Timing Constraint... Для GTX_CLK period боле-менее понятно, а вот как это соотносится с сигналами данных TXD?..

Разброс между выходным клоком и данными в ISE нельзя по-нормальному обконстрейнить. В данном случае можно объединить в группу сигналы GTX_CLK, TDX*, и задать для неё пустой(Analize only) OFFSET OUT с REFERENCE_PIN "GTX_CLK". Всё это делается, при желании, с помощью визарда. Тогда в отчёте будет максимальный разброс между данными и клоком, и можно глазами проверить, что он маленький. Если при этом восходящий фронт клока выровнен по середине данных(в этом можно убедиться в симуляции, или просто анализом дизайна), то всё в порядке.

 

Для RXD* можно задать OFFSET 2.5 ns VALID 3ns в соответствии с другим рисунком из даташита(если не учитывать PCB skew). Для этого тоже подойдёт визард, он ещё соотвествующую картинку показывает.

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


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

Разброс между выходным клоком и данными в ISE нельзя по-нормальному обконстрейнить. В данном случае можно объединить в группу сигналы GTX_CLK, TDX*, и задать для неё пустой(Analize only) OFFSET OUT с REFERENCE_PIN "GTX_CLK". Всё это делается, при желании, с помощью визарда. Тогда в отчёте будет максимальный разброс между данными и клоком, и можно глазами проверить, что он маленький. Если при этом восходящий фронт клока выровнен по середине данных(в этом можно убедиться в симуляции, или просто анализом дизайна), то всё в порядке.

 

Для RXD* можно задать OFFSET 2.5 ns VALID 3ns в соответствии с другим рисунком из даташита(если не учитывать PCB skew). Для этого тоже подойдёт визард, он ещё соотвествующую картинку показывает.

 

Скажите, пожалуйста, а нельзя ли задать в моем случае констрейны для выходных сигналов TXD используя входную тактовую RX_CLK? Напоминаю код:

RX_CLKG <= RX_CLK;
TX_CLKG <= RX_CLK;

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


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

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

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

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

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

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

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

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

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

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