自协商SGMII_SerDers与SGMII篇

自协商SGMII_SerDes与SGMII篇

  • 前言
  • SerDes
  • SGMII
    • MII
    • RMII
    • SMII
    • GMII
    • SGMII
  • 总结

前言

最近调通了电口与交换之间的自协商,FPGA侧实现桥梁的作用,例化两个对称的SGMII IP核,完成phy<=>[sgmii<=>gmii<=>sgmii]<=>SW的数据通路,其实,这个IP CORE的使用并不难,Xilinx的用例和文档非常专业,提供了最大程度的支持,毕竟是行业第一,但在一些细节的地方,文档就理所当然似的忽略了,或者就是解释的很有限,这很容易让人产生理解上的偏差,造成的后果就是需要编译不同版本去试错,从而验证解读,这很耗费时间和精力,为什么不仿真?仿真确实能很好的了解功能时序,但对于自协商功能来说就能力有限了,设计激励模块和跑仿真更是个体力活,最好的策略就是读文档pg047!抓信号!这样即使设计有问题,也可以通过抓取的信号判断是哪里的问题了。

SerDes

SerDes,是SERializer(串行器)和DESerializer(解串器)的简称,是一种点对点的高速串行通信技术,好了,概念上记住这些就够了,网上资料很丰富,感兴趣的可以去百度一下,我主要分享下我的理解。
我觉的SerDes就是一个超级串口收发器!串口协议跟IIC、SPI等总线协议还是有很大差别的,最大的特点就是点对点收发、没有随路时钟,它的速率是隐含在协议里的,双方必须按照约定好的波特率进行数据的发送和接受才能正确的完成通信,SPI则是主机向从机发送时钟,从机在这个时钟的上升沿采样数据、下降沿发送数据,最开始人们为了提高通信速率的思路有两条:提高随路时钟频率、增加数据通路位宽,这都很好理解,举个栗子就是四线SPI(Qspi),但逐渐地这种思路就遇到瓶颈!第一、时钟频率的不断增加,时钟抖动和偏斜的因素变得更加明显,也增加了时钟质量的要求,为了充分利用时钟,工程师们还想到了利用下降沿,没错,就是DDR!第二、数据总线的增加意味着管脚数的增加,这会引起PCB布局布线的灾难。人们又开始把思路回到不用时钟线的串口协议上。先看看串口收发器的伪代码!

//串口收发器 Serial Transceiver
module serialTR(
	input			sys_clk,
	input  			rst_n,
	//可配置单双工,双工模式
	input  [1:0] 	I_rxtx_en,		//收发使能,高有效 
	output [1:0]	O_rxtx_done, 	//收发完成脉冲信号
	
	input			RX,				//串口总线
	output			TX,
	//数据位宽可配置
	input  [7:0]	data2tx,		//待发送数据	
	output [7:0]	data2rx			//待接收数据
);

//串口接收 ---> 串转并
always@()begin
	if(!rst_n)
		//寄存器复位
	else if(I_rxtx_en[1])	
		//1、下降沿检测,获取起始位
		//2、3、4、5、6、7、8、9波特率定时器,采样数据
		//9、10接收校验位和结束位
		//11、12、产生完成脉冲信号
end		
//串口发送 ---> 并转串
always@(!rst_n)begin
	if(!rst_n)
		//复位
	else if(I_rxtx_en[0])
		//1、构建数据格式
		//2~12 按位发送
		//13、14产生完成脉冲信号
end


endmodule

这里想说明的是1、串口的单双工和数据位宽都是可以配置的,按照自己的需求去设置,2、串口协议也是有时钟的,只不过这个时钟是隐含在协议里,除了常见的9600、38400、115200,自己也可以去配置特殊模式的串口,关键是双方都要遵守相同的协议,那么SerDes呢?
相同的,SerDes也是收发两条线,准确地说,是两组,因为它是差分形式,即tx_ptx_nrx_prx_n;在数据端也是可以配置成不同的数据位宽和单双工模式;
不同的,就是在于SerDes的时钟是隐含在数据中!这就需要额外的电路去完成数据和时钟的“融合”与“解析”,而这正是PCS和PMA的作用,其内部采用的编码技术和信号补偿技术正是为了完美的将时钟“融合”进串行数据(发送端),再将时钟从串行数据中“解析出来”(接收端)!至于内部如8b/10b、去加重、预加重等技术细节可以自行搜索哈。
Xilinx将这个SerDes硬核进行了封装,成为GigabitTransceiver,即GT,而它在BANK里的位置和数量都是固定的,从这个角度来看这也算是它不灵活的不足所在吧。
自协商SGMII_SerDers与SGMII篇_第1张图片

SGMII

这一部分我可能要做个搬运工了,因为这些都是常识性的东西了,百度文库有一篇非常全面的讲解所有MII接口,自行搜索看看就行了,为什么单独列出来?因为这些概念很重要,并且从MII发展到SGMII也正是反映了总线的变化历史,我挑几个代表性的分析分析,资料来源百度文库,侵删。

MII

MII Medium Independent Interface
接口连线很多,是能、时钟、标志信号的error、valid等等,共16根线,啧啧
自协商SGMII_SerDers与SGMII篇_第2张图片

RMII

MII连线太多,怎么办,Reduce! R MII,注意这里不仅仅是连接线数量的减少,更重要的是数据时钟的变化,这里用的是外部参考源提供的CLK_REF参考钟,在PHY侧数据接收是由外部晶振提供,和接收到的数据处于不同的时钟域,所以需要FIFO进行缓存。
自协商SGMII_SerDers与SGMII篇_第3张图片

SMII

RMII连线依然太多怎么办?继续减少?串行! Serial MII,也衍生了SSMII Serial Sync(串行同步)SSSMII Source Sync Serial(源同步串行)

GMII

MII的进化版,Giga Bit MII 位宽增加一倍,时钟均为125MHz,值得注意的是,发送参考钟GTX_CLK的方向是由MAC发送给PHY
自协商SGMII_SerDers与SGMII篇_第4张图片

SGMII

终于到了SGMII,这个RX_CLK是可选的,去掉之后是不是很像串口,MII总线中的标志信号TX_ENTX_ER``RX_DVRX_ER都成为串行数据的一部分,这样,人们为了提高数据吞吐,从增加数据线到增加时钟频率,再到减少总线,最终回到了串行的形式,也是非常有趣。
自协商SGMII_SerDers与SGMII篇_第5张图片

总结

这一篇主要是基础概念,看了就知道了,最怕觉得这个东西复杂、很难就不去看了,概念不掌握在后面设计的过程中会很痛苦,因为你会迷茫这个东西有什么用,为什么要这样用,按照我的理解,把SerDes看成超级串口,串口,这个总该不难了吧!下一篇就可以打开这个超级串口,看看这个IP核。

你可能感兴趣的:(Xilinx,IP,Core)