0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Xilinx KU系列三速以太网IP核RGMII时序约束方法

jf_pJlTbmA9 来源:jf_pJlTbmA9 作者:jf_pJlTbmA9 2023-07-07 14:15 次阅读

1. 概述

基于RGMII时序广泛应用于以太网通信中,基于Xilinx的三速以太网时序分析,不同的Xilinx系列方法不一样。当使用2路以上以太网通信,KU系列FPGA的MAC核需要进行修改,以支持2路以太网和满足时序要求。以下笔者对修改的部分进行说明,希望对广大开发者有所帮助,如果有不对的地方欢迎指针。

2. 代码修改

主要针对以上三个文件修改,详细的可以打开我们的配套工程阅读代码,下图是第一个以太网的三个文件

1678153197181531.png

tri_mode_ethernet_mac_1_rgmii_v2_0_if.v文件关键部分修改如下:

发送部分odelay3的代码修改,原来默认的代码对于rgmii_tx发送时序调整是通过级联一个idelay3模块来实现,这里注释掉级联的idelay3模块,默认为" TIME"模式最大是1ns延迟调整,修改odelay3模块的delay模式为"COUNT模式",这样每调整1个tap代表了0.005ns,最大可以调整512个tap,这样我们可以实现最大2ns以上的延迟调整

//InstantiatetheOutputDelayprimitive(delayoutputby2ns).Inorderto
//achieve2ns,anODELAYiscascadedwithanIDELAYfromthebitslice
//immediatelybelowit.
ODELAYE3#(

.DELAY_VALUE(300),
.DELAY_FORMAT("COUNT"),//UnitsoftheDELAY_VALUE(COUNT,TIME)

.DELAY_TYPE("FIXED"),
//.CASCADE("MASTER"),
.REFCLK_FREQUENCY(333.333),
.SIM_DEVICE("ULTRASCALE")

)
delay_rgmii_tx_clk(
.ODATAIN(rgmii_txc_odelay),
.DATAOUT(rgmii_txc_obuf),
.CLK(1'b0),
.CE(1'b0),
.INC(1'b0),
.CNTVALUEIN(9'h0),
.CNTVALUEOUT(),
.LOAD(1'b0),
.RST(1'b0),
.CASC_IN(1'b0),
.CASC_RETURN(1'b0),
.CASC_OUT(),
.EN_VTC(1'b1)
);
/*
IDELAYE3#(
.DELAY_VALUE(320),
.DELAY_TYPE("FIXED"),
.CASCADE("SLAVE_END"),
.REFCLK_FREQUENCY(333.333),
.SIM_DEVICE("ULTRASCALE_PLUS")

)
delay_rgmii_tx_clk_casc(
.IDATAIN(1'b0),
.DATAOUT(delay_rgmii_tx_clk_casc_return),
.DATAIN(1'b0),
.CLK(1'b0),
.CE(1'b0),
.INC(1'b0),
.CNTVALUEIN(9'h0),
.CNTVALUEOUT(),
.LOAD(1'b0),
.RST(1'b0),
.CASC_IN(delay_rgmii_tx_clk_casc_out),
.CASC_RETURN(1'b0),
.CASC_OUT(),
.EN_VTC(1'b1)
);
*/

//---------------------------------------------------------------------------
//RGMIITransmitterLogic:
//driveTXsignalsthroughIOBsontoRGMIIinterface
//---------------------------------------------------------------------------

//Encodergmiictlsignal
assignrgmii_tx_ctl_int=tx_en_from_mac^tx_er_from_mac;

//InstantiateDoubleDataRateOutputcomponents.Then
//putdataandcontrolsignalsthroughODELAYcomponentsto
//providesimiliarnetdelaystothoseseenontheclksignal.

assigngmii_txd_falling=txd_from_mac[7:4];

genvari;
generatefor(i=0;i<4; i=i+1)
     begin : txdata_out_bus
       ODDRE1 #(
         
          .SRVAL         (1'b0)
       )
       rgmii_txd_out (
          .Q             (rgmii_txd_odelay[i]),
          .C             (tx_clk),
          .D1            (txd_from_mac[i]),
          .D2            (gmii_txd_falling[i]),
          .SR            (tx_reset)
       );
 
      ODELAYE3 #(
          .DELAY_VALUE      (0),
          .DELAY_TYPE       ("FIXED"),
          .REFCLK_FREQUENCY (333.333),
      .SIM_DEVICE       ("ULTRASCALE")
       
       )
       delay_rgmii_txd (
          .ODATAIN       (rgmii_txd_odelay[i]),
          .DATAOUT       (rgmii_txd_obuf[i]),
          .CLK           (1'b0),
          .CE            (1'b0),
          .INC           (1'b0),
          .CNTVALUEIN    (9'h0),
          .CNTVALUEOUT   (),
          .LOAD          (1'b0),
          .RST           (1'b0),
          .CASC_IN       (1'b0),
          .CASC_RETURN   (1'b0),
          .CASC_OUT      (),
          .EN_VTC        (1'b1)
       );
 
     end
   endgenerate

同理,接收部分idelay3的代码修改,原来默认为" TIME"模式最大是1ns延迟调整,修改idelay3模块的delay模式为"COUNT模式",这样每调整1个tap代表了0.005ns,最大可以调整512个tap,这样我们可以实现最大2ns以上的延迟调整

IDELAYE3 #(
   .DELAY_FORMAT   ("COUNT"),   // Units of the DELAY_VALUE (COUNT, TIME)
   .DELAY_TYPE    ("FIXED"),
   .REFCLK_FREQUENCY (333.333),
   .DELAY_VALUE   (330),      // Input delay value setting
   .SIM_DEVICE  ("ULTRASCALE")

  )
  delay_rgmii_rx_ctl (
   .IDATAIN    (rgmii_rx_ctl_ibuf),
   .DATAOUT    (rgmii_rx_ctl_delay),
   .DATAIN    (1'b0),
   .CLK      (1'b0),
   .CE      (1'b0),
   .INC      (1'b0),
   .CNTVALUEIN  (9'h0),
   .CNTVALUEOUT  (),
   .LOAD     (1'b0),
   .RST      (1'b0),
   .CASC_IN    (1'b0),
   .CASC_RETURN  (1'b0),
   .CASC_OUT   (),
   .EN_VTC    (1'b1)
   );


  genvar j;
  generate for (j=0; j<4; j=j+1)
     begin : rxdata_bus



       IDELAYE3 #(
       .DELAY_FORMAT     ("COUNT"),     // Units of the DELAY_VALUE (COUNT, TIME)        
          .DELAY_TYPE       ("FIXED"),
          .REFCLK_FREQUENCY (333.333),
          .DELAY_VALUE      (330),           // Input delay value setting
          .SIM_DEVICE    ("ULTRASCALE")

       )
       delay_rgmii_rxd (
          .IDATAIN       (rgmii_rxd_ibuf[j]),
          .DATAOUT       (rgmii_rxd_delay[j]),
          .DATAIN        (1'b0),
          .CLK           (1'b0),
          .CE            (1'b0),
          .INC           (1'b0),
          .CNTVALUEIN    (9'h0),
          .CNTVALUEOUT   (),
          .LOAD          (1'b0),
          .RST           (1'b0),
          .CASC_IN       (1'b0),
          .CASC_RETURN   (1'b0),
          .CASC_OUT      (),
          .EN_VTC        (1'b1)
       );
     end
   endgenerate

下图是第二个以太网的三个文件,由于需要贡献一部分FPGA的delay_ctr资源,他们的代码稍微有点差异。

1678153223309296.png

修改方法和第一个以太网修改方法一样

ODELAYE3 #(

   .DELAY_VALUE   (300),
   .DELAY_FORMAT   ("COUNT"),   // Units of the DELAY_VALUE (COUNT, TIME) 

   .DELAY_TYPE    ("FIXED"),
   //.CASCADE     ("MASTER"),
   .REFCLK_FREQUENCY (333.333),
   .SIM_DEVICE    ("ULTRASCALE")

  )
  delay_rgmii_tx_clk (
   .ODATAIN     (rgmii_txc_odelay),
   .DATAOUT     (rgmii_txc_obuf),
   .CLK       (1'b0),
   .CE        (1'b0),
   .INC       (1'b0),
   .CNTVALUEIN    (9'h0),
   .CNTVALUEOUT   (),
   .LOAD       (1'b0),
   .RST       (1'b0),
   .CASC_IN     (1'b0),
   .CASC_RETURN   (1'b0),
   .CASC_OUT     (),
   .EN_VTC      (1'b1)
  );
/*
IDELAYE3 #(
   .DELAY_VALUE   (320),
   .DELAY_TYPE    ("FIXED"),
   .CASCADE     ("SLAVE_END"),
   .REFCLK_FREQUENCY (333.333),
   .SIM_DEVICE    ("ULTRASCALE_PLUS")

 )
 delay_rgmii_tx_clk_casc (
   .IDATAIN     (1'b0),
   .DATAOUT     (delay_rgmii_tx_clk_casc_return),
   .DATAIN      (1'b0),
   .CLK       (1'b0),
   .CE        (1'b0),
   .INC       (1'b0),
   .CNTVALUEIN    (9'h0),
   .CNTVALUEOUT   (),
   .LOAD       (1'b0),
   .RST       (1'b0),
   .CASC_IN     (delay_rgmii_tx_clk_casc_out),
   .CASC_RETURN   (1'b0),
   .CASC_OUT     (),
   .EN_VTC      (1'b1)
 );
*/


  //---------------------------------------------------------------------------
  // RGMII Transmitter Logic :
  // drive TX signals through IOBs onto RGMII interface
  //---------------------------------------------------------------------------

  // Encode rgmii ctl signal
  assign rgmii_tx_ctl_int = tx_en_from_mac ^ tx_er_from_mac;

  // Instantiate Double Data Rate Output components. Then
  // put data and control signals through ODELAY components to
  // provide similiar net delays to those seen on the clk signal.

  assign gmii_txd_falling = txd_from_mac[7:4];

  genvar i;
  generate for (i=0; i<4; i=i+1)
     begin : txdata_out_bus
       ODDRE1 #(

          .SRVAL         (1'b0)
       )
       rgmii_txd_out (
          .Q             (rgmii_txd_odelay),
          .C             (tx_clk),
          .D1            (txd_from_mac),
          .D2            (gmii_txd_falling),
          .SR            (tx_reset)
       );

      ODELAYE3 #(
          .DELAY_VALUE      (0),
          .DELAY_TYPE       ("FIXED"),
          .REFCLK_FREQUENCY (333.333),
      .SIM_DEVICE       ("ULTRASCALE")

       )
       delay_rgmii_txd (
          .ODATAIN       (rgmii_txd_odelay),
          .DATAOUT       (rgmii_txd_obuf),
          .CLK           (1'b0),
          .CE            (1'b0),
          .INC           (1'b0),
          .CNTVALUEIN    (9'h0),
          .CNTVALUEOUT   (),
          .LOAD          (1'b0),
          .RST           (1'b0),
          .CASC_IN       (1'b0),
          .CASC_RETURN   (1'b0),
          .CASC_OUT      (),
          .EN_VTC        (1'b1)
       );

     end
   endgenerate

接收部分

IDELAYE3 #(
   .DELAY_FORMAT   ("COUNT"),
   .DELAY_TYPE    ("FIXED"),
   .REFCLK_FREQUENCY (333.333),
   .DELAY_VALUE   (250),      // Input delay value setting       
   .SIM_DEVICE  ("ULTRASCALE")

  )
  delay_rgmii_rx_ctl (
   .IDATAIN    (rgmii_rx_ctl_ibuf),
   .DATAOUT    (rgmii_rx_ctl_delay),
   .DATAIN    (1'b0),
   .CLK      (1'b0),
   .CE      (1'b0),
   .INC      (1'b0),
   .CNTVALUEIN  (9'h0),
   .CNTVALUEOUT  (),
   .LOAD     (1'b0),
   .RST      (1'b0),
   .CASC_IN    (1'b0),
   .CASC_RETURN  (1'b0),
   .CASC_OUT   (),
   .EN_VTC    (1'b1)
   );


  genvar j;
  generate for (j=0; j<4; j=j+1)
     begin : rxdata_bus



       IDELAYE3 #(
          .DELAY_FORMAT     ("COUNT"),
          .DELAY_TYPE       ("FIXED"),
          .REFCLK_FREQUENCY (333.333),
          .DELAY_VALUE      (250),           // Input delay value setting              
          .SIM_DEVICE    ("ULTRASCALE")
       )
       delay_rgmii_rxd (
          .IDATAIN       (rgmii_rxd_ibuf[j]),
          .DATAOUT       (rgmii_rxd_delay[j]),
          .DATAIN        (1'b0),
          .CLK           (1'b0),
          .CE            (1'b0),
          .INC           (1'b0),
          .CNTVALUEIN    (9'h0),
          .CNTVALUEOUT   (),
          .LOAD          (1'b0),
          .RST           (1'b0),
          .CASC_IN       (1'b0),
          .CASC_RETURN   (1'b0),
          .CASC_OUT      (),
          .EN_VTC        (1'b1)
       );
     end
   endgenerate

以上也能看出第二个以太网和第一个以太网的时序调整有所差异。

3. 约束文件修改

由于我们在tri_mode_ethernet_mac_1_rgmii_v2_0_if.v中完成了时序的调整,因此需要注释以下约束

1678153253659549.png

时序约束部分修改和硬件上PHY的delay延迟设置有关系,米联客的FPGA的PHY以太网芯片rx 有2ns延迟,tx没有2ns延迟。因此rgmii_rx数据是源同步中心对齐方式分析,而rgmii_tx数据是源源步边沿对齐方式分析,米联客使用的是RTL8211FD芯片,关键的时序参数如下:

1678153261672626.png

1678153267748460.png

1678153270637738.png

1678153274853743.png

1678153282882204.png

因此给出如下时序约束:

############################################################
# RX Clock period Constraints (per instance)        #
############################################################
# Receiver clock period constraints: please do not relax
set rx_clk [get_clocks -of [get_ports rgmii_rxc]]

############################################################
# Obtain input clocks from top level XDC             #
############################################################
set ip_gtx_clk   [get_clocks -of_objects [get_ports gtx_clk]]

#
####
#######
##########
#############
#################
#BLOCK CONSTRAINTS

############################################################
# For Setup and Hold time analysis on RGMII inputs     #
############################################################

# define a virtual clock to simplify the timing constraints
create_clock -name [current_instance .]_rgmii_rx_clk -period 8
set rgmii_rx_clk [current_instance .]_rgmii_rx_clk

# Identify RGMII Rx Pads only. 
# This prevents setup/hold analysis being performed on false inputs,
# eg, the configuration_vector inputs.

set_input_delay -clock [get_clocks $rgmii_rx_clk] -max -1.5 [get_ports {rgmii_rxd
rgmii_rx_ctl}]
set_input_delay -clock [get_clocks $rgmii_rx_clk] -min -2.5 [get_ports {rgmii_rxd
rgmii_rx_ctl}]
set_input_delay -clock [get_clocks $rgmii_rx_clk] -clock_fall -max -1.5 -add_delay[get_ports {rgmii_rxd
rgmii_rx_ctl}]
set_input_delay -clock [get_clocks $rgmii_rx_clk] -clock_fall -min -2.5 -add_delay[get_ports {rgmii_rxd
rgmii_rx_ctl}]

set_false_path -rise_from [get_clocks $rgmii_rx_clk] -fall_to $rx_clk -setup
set_false_path -fall_from [get_clocks $rgmii_rx_clk] -rise_to $rx_clk -setup
set_false_path -rise_from [get_clocks $rgmii_rx_clk] -rise_to $rx_clk -hold
set_false_path -fall_from [get_clocks $rgmii_rx_clk] -fall_to $rx_clk -hold

set_multicycle_path -from [get_clocks $rgmii_rx_clk] -to $rx_clk -setup 0
set_multicycle_path -from [get_clocks $rgmii_rx_clk] -to $rx_clk -hold -1

############################################################
# For Setup and Hold time analysis on RGMII outputs    #
############################################################

create_generated_clock -name [current_instance .]_rgmii_tx_clk -divide_by 1 -source[get_pins {tri_mode_ethernet_mac_i/rgmii_interface/rgmii_txc_ddr/C}] [get_ports rgmii_txc]
set rgmii_tx_clk [current_instance .]_rgmii_tx_clk

set_output_delay -0.5 -max -clock [get_clocks $rgmii_tx_clk] [get_ports {rgmii_txd
rgmii_tx_ctl}]
set_output_delay -1.2 -min -clock [get_clocks $rgmii_tx_clk] [get_ports {rgmii_txd
rgmii_tx_ctl}]
set_output_delay -0.5 -max -clock [get_clocks $rgmii_tx_clk] [get_ports {rgmii_txd
rgmii_tx_ctl}] -clock_fall -add_delay
set_output_delay -1.2 -min -clock [get_clocks $rgmii_tx_clk] [get_ports {rgmii_txd
rgmii_tx_ctl}] -clock_fall -add_delay

set_false_path -rise_from $ip_gtx_clk -fall_to [get_clocks $rgmii_tx_clk] -setup
set_false_path -fall_from $ip_gtx_clk -rise_to [get_clocks $rgmii_tx_clk] -setup
set_false_path -rise_from $ip_gtx_clk -rise_to [get_clocks $rgmii_tx_clk] -hold
set_false_path -fall_from $ip_gtx_clk -fall_to [get_clocks $rgmii_tx_clk] -hold

set_multicycle_path -from $ip_gtx_clk -to [get_clocks $rgmii_tx_clk] 0 -setup
set_multicycle_path -from $ip_gtx_clk -to [get_clocks $rgmii_tx_clk] -1 -hold

这里时序分析是比较难理解的部分,尤其是根据datasheet分析时序要求,更多的关于时序相关的内容,请看米联客时序课程相关内容。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1625

    文章

    21619

    浏览量

    601148
  • 以太网
    +关注

    关注

    40

    文章

    5336

    浏览量

    170745
  • Xilinx
    +关注

    关注

    71

    文章

    2155

    浏览量

    120834
  • 时序约束
    +关注

    关注

    1

    文章

    115

    浏览量

    13403
收藏 人收藏

    评论

    相关推荐

    基于Xilinx FPGA的千兆以太网控制器的开发

    MAC子层的FPGA设计、MAC子层与上层协议的接口设计以及MAC与物理层(PHY)的MII接口设计。##Xilinx 提供了以太网MAC控制器的IP Core,可实现单条吉比特
    发表于 01-23 11:13 3w次阅读
    基于<b class='flag-5'>Xilinx</b> FPGA的千兆<b class='flag-5'>以太网</b>控制器的开发

    求助,怎样控制altera的以太网IP呢?

    本人想使用altera的以太网IPtse,发现Quartus里面并没有告诉怎样控制这个。请问大家是怎样控制这个
    发表于 01-22 14:55

    以太网

    各位大神,请问有谁调试过altera中的以太网MAC,我的MAC返回给TX的应答信号没有反应,请问是什么原因?如何解决?谢谢,万分感
    发表于 10-06 11:23

    有谁做过xilinx k7的以太网

    本人最近在做xilinx k7的以太网,主要是在100M的传输速率下,时序数据收发。现在做着发送部分,卡住很久很久了,发送的目的地址一直
    发表于 04-13 14:46

    vivado以太网IP怎么用

    vivado的以太网IP接口太多了,完全不知道应该怎么用,哪位大佬能发我一份设计或者仿真吗?简单的就好
    发表于 04-15 12:58

    莱迪思和Flexibilis推出FPGA以太网交换IP

    莱迪思半导体公司和FLEXIBILIS Oy日前宣布了即可获取Flexibilis以太网交换(FES)IP(10Mbps/100Mb
    发表于 06-16 08:44 598次阅读
    莱迪思和Flexibilis推出FPGA<b class='flag-5'>以太网</b>交换<b class='flag-5'>IP</b><b class='flag-5'>核</b>

    基于Xilinx公司的SOPC的以太网设计

    1.设计(论文)的主要任务及目标 (1) 研究SOPC理论如何应用于以太网终端设计; (2) 研究如何使用EDK软件和IP搭建整个设计硬件结构; (3) 在开发板上实现以太网终端设计
    发表于 09-18 11:09 134次下载
    基于<b class='flag-5'>Xilinx</b>公司的SOPC的<b class='flag-5'>以太网</b>设计

    Xilinx时序约束设计

    Xilinx时序约束设计,有需要的下来看看
    发表于 05-10 11:24 18次下载

    基于Avalon总线的非标准以太网控制器IP设计_薛毅

    基于Avalon总线的非标准以太网控制器IP设计_薛毅
    发表于 03-19 11:33 1次下载

    xilinx时序分析及约束

    详细讲解了xilinx时序约束实现方法和意义。包括:初级时钟,衍生时钟,异步时终域,多时终周期的讲解
    发表于 01-25 09:53 6次下载

    千兆以太网IP接口和万兆以太网IP接口

    对于IP输出数据的解析最好的工具就是其自带的仿真文件,里面既将接收的数据进行了解析,又将发送给IP的数据进行了封装,这对于了解数据结构和协议是十分有帮助的,
    发表于 07-09 14:07 3834次阅读

    Xilinx平台以太网接口(一)TCP/IP基础

    在完成以太网通信实验之前,必须要对以太网基础知识进行了解。时间充裕的可以看看《图解TCP/IP》作为扫盲。本文重点对以太网帧结构进行介绍。
    的头像 发表于 02-19 17:54 2264次阅读
    <b class='flag-5'>Xilinx</b>平台<b class='flag-5'>以太网</b>接口(一)TCP/<b class='flag-5'>IP</b>基础

    基于FPGA的UDP RGMII千兆以太网通信方案

    本文介绍一个FPGA开源项目:UDP RGMII千兆以太网通信。该项目在我之前的工作中主要是用于FPGA和电脑端之间进行图像数据传输。本文简要介绍一下该项目的千兆以太网通信方案、以太网
    的头像 发表于 09-04 16:49 1482次阅读
    基于FPGA的UDP <b class='flag-5'>RGMII</b>千兆<b class='flag-5'>以太网</b>通信方案

    设置AMD以太网IP的Pause帧处理

    目前 AMD 的以太网 IP ,如软 10G/25G,40G/50G 或者硬核 CMAC,MRMAC,DCMAC 等等,都采用的是同一种 Pause 帧处理方式。
    的头像 发表于 10-18 09:15 891次阅读
    设置AMD<b class='flag-5'>以太网</b><b class='flag-5'>IP</b><b class='flag-5'>核</b>的Pause帧处理

    解决以太网RGMII通信的电源时序难题

    电子发烧友网站提供《解决以太网RGMII通信的电源时序难题.pdf》资料免费下载
    发表于 08-27 11:23 0次下载
    解决<b class='flag-5'>以太网</b><b class='flag-5'>RGMII</b>通信的电源<b class='flag-5'>时序</b>难题