以太网:输出时钟管理

因为在:

https://www.cnblogs.com/VerweileDoch/p/18100198

提到:你的网卡虽然会根据你的输入增加延迟,但仍可能存在误差!

所以千万记得在输出端也做好类似的处理!

A7系列没有ODLEAY原语,所以用PLL的ADV来完成也是可以的!

(但我试了一下,如果等长,那芯片那配置天生偏移也能正确采集数据)

 处理方法①:PLL输出双时钟——当你不输入以太网仅输出的时候

PLL输出两个相同的时钟,其中一个进行相位偏移作为输出。

这是我想到的最简单的方法,效果也非常好!

但是用两个PLL端口感觉很浪费!我想想有没有其他方法!

 处理方法②:idelay+ODDR

直接ODDR处理很容易产生误差,包基本都是错的!

需要你对时钟delay以后再输出,形成一个与数据的合适的采样相位。

复制代码
    ODDR #(
    .DDR_CLK_EDGE("SAME_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE" 
    .INIT(1'b0),                // Initial value of Q: 1'b0 or 1'b1
    .SRTYPE("SYNC")             // Set/Reset type: "SYNC" or "ASYNC" 
    ) ODDR_inst_txc (
        .Q  ( rgmii_txc          ),   // 1-bit DDR output
        .C  ( rgmii_tx_clk       ),   // 1-bit clock input
        .CE ( 1'b1               ),   // 1-bit clock enable input
        .D1 ( 1'b1               ),   // 1-bit data input (positive edge)
        .D2 ( 1'b0               ),   // 1-bit data input (negative edge)
        .R  (  1'b0              ),   // 1-bit reset
        .S  (  1'b0              )    // 1-bit set
    );
复制代码

 处理方法②:最推荐的方法——路由以太网的输入时钟

IDELAY延迟输入时钟(可能不需要,看输入时钟能不能稳定采集,不能就延迟一下),然后OBUF完成时钟路由;

这是天然的(网卡芯片延迟了合适的相位)的时钟,通过BUFR或BUFG也有了足够的驱动能力;

复制代码
//txc
   OBUF #(
      .DRIVE     (12),          // Specify the output drive strength
      .IOSTANDARD("DEFAULT"),   // Specify the output I/O standard
      .SLEW      ("SLOW")       // Specify the output slew rate
   ) OBUF_inst (
      .O( rgmii_txc          ), // Buffer output (connect directly to top-level port)
      .I( rgmii_tx_clk_phase )  // Buffer input
   );
复制代码

 处理方法③:ODELAY

(A7没有):延迟数据或时钟其中一个;

 

 

posted @   NoNounknow  阅读(46)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示