以太网:输出时钟管理
因为在:
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没有):延迟数据或时钟其中一个;
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步