标签:
作者:MiS603开发团队
日期:20150911
公司:南京米联电子科技有限公司
论坛:www.osrc.cn
EAT博客:http://blog.chinaaet.com/whilebreak
博客园:http://www.cnblogs.com/milinker/
RGMII(Reduced Gigabit Media Independent Interface)是Reduced GMII(吉比特介质独立接口)。RGMII均采用4位数据接口,工作时钟125MHz,并且在上升沿和下降沿同时传输数据,因此传输速率可达1000Mbps。同时兼容MII所规定的10/100 Mbps工作方式,支持传输速率:10M/100M/1000Mb/s ,其对应clk 信号分别为:2.5MHz/25MHz/125MHz。RGMII数据结构符合IEEE以太网标准,接口定义见IEEE 802.3-2000。采用RGMII的目的是降低电路成本,使实现这种接口的器件的引脚数从25个减少到14个。
发送器:
◎ GTX_CLK——吉比特TX..信号的时钟信号(125MHz)
◎ TXD[3..0]——被发送数据
◎ TX_CTL——发送控制
注:在千兆速率下,向PHY提供GTX_CLK信号,TXD、TXEN、TXER信号与此时钟信号同步。否则,在10/100M速率下,PHY提供 TXCLK时钟信号,其它信号与此信号同步。其工作频率为25MHz(100M网络)或2.5MHz(10M网络)。
接收器:
◎ RX_CLK——接收时钟信号(从收到的数据中提取,因此与GTXCLK无关联)
◎ RXD[3..0]——接收数据
◎ RX_CTL——接收控制
◎ COL——冲突检测(仅用于半双工状态)
◎ CRS——载波监听
管理配置(控制和状态信息):
◎ MDC——配置接口时钟
◎ MDIO——配置接口I/O
RGMII接口相对于GMII接口,在TXD和RXD上总共减少8根数据线。
发送器:
◎ TX_CLK
吉比特TX..信号的时钟信号(125MHz)
◎ TXD[3..0]
发送数据
TX_CLK高电平输出数据低4位,低电平输出数据高四位。
◎ TX_CTL
—发送控制
TX_CLK高电平期间为1表示发送使能,TX_CLK低电平期间为1表示发送正确
接收器:
◎ RX_CLK
吉比特RX..信号的时钟信号(125MHz)
◎ RXD[3..0]
接收数据
RX_CLK高电平接收数据低4位,低电平接收数据高四位。
◎ RX_CTL
—接收控制
RX_CLK高电平期间为1表示接收使能,RX_CLK低电平期间为1表示接收正确
TX_CTL和RX_CTL是数据同步机制,可以理解为同步信号
VITESSE公司的VSC8601是一颗支持10/100/1000M PHY的RGMII MAC接口芯片,此芯片价格便宜,淘宝价格大概十几元一颗,另外封装是TQFP64 封装,只有64个PIN外围简单,焊接调试方便,功耗低,支持3.3V的IO接口,算是RGMII方案中首选无二的IC了。
VSC8601硬件接口图
由于时钟速度125MHZ 双边沿采样,对硬件要求很高,PCB必须等长布线
为了测试PHY的稳定性,采用了2块开发板进行互联通信,如果发送的数据和接收的数据不匹配,则通过LED指示出来。
1)、原语应用-双边沿采样
1. //use IDDR2 sample data with poseadge and negadge
2. IDDR2 #(
3. .DDR_ALIGNMENT("C0"),
4. .INIT_Q0(1‘b0),
5. .INIT_Q1(1‘b0),
6. .SRTYPE("SYNC")
7. )
8. Iddr2_0(
9. .Q0(gmii_rxd[4]), // 1-bit output captured with C0 clock
10. .Q1(gmii_rxd[0]), // 1-bit output captured with C1 clock
11. .C0(rgmii_rxclk_n), // 1-bit clock input
12. .C1(rgmii_rxclk_i), // 1-bit clock input
13. .CE(1‘b1), // 1-bit clock enable input
14. .D(rgmii_rxd_i[0]), // 1-bit ddr data input
15. .R(1‘b0), // 1-bit reset input
16. .S(1‘b0) // 1-bit set input
17. );
2)、原语应用双边沿输出
1. //usb ODDR2 output data with posadge and neadge
2. assign rgmii_txdv_o = gmii_txdv;
3. ODDR2 #(
4. .DDR_ALIGNMENT("C0"), // Sets output alignment to "NONE", "C0" or "C1"
5. .INIT(1‘b0), // Sets initial state of the Q output to 1‘b0 or 1‘b1
6. .SRTYPE("ASYNC") // Specifies "SYNC" or "ASYNC" set/reset
7. )
8. ODDR2_0 (
9. .Q(rgmii_txd_o[0]), // 1-bit DDR output data
10. .C0(rgmii_txclk), // 1-bit clock input
11. .C1(rgmii_txclk_n), // 1-bit clock input
12. .CE(1‘b1), // 1-bit clock enable input
13. .D0(gmii_txd[0]), // 1-bit data input (associated with C0)
14. .D1(gmii_txd[4]), // 1-bit data input (associated with C1)
15. .R(1‘b0), // 1-bit reset input
16. .S(1‘b0) // 1-bit set input
17. );
3)、为了实现数据的发送和接收的对比需要准备2块MIS603开发板
测试数据发送:
原理:发送数据从0~255 不停循环
18. reg [8:0]gmii_txdv_cnt;//计数器循环累加,当gmii_txdv_cnt[8]为0时将数据输出
19. assign gmii_txd_ts = gmii_txdv_cnt[8] ? 7‘d0 : gmii_txdv_cnt[7:0];
20. //数据有效标志
21. assign gmii_txdv_ts = ((~gmii_txdv_cnt[8])||(gmii_txdv_cnt==256)||(gmii_txdv_cnt==257)) ? 1‘b1 : 1‘b0;
22. //循环计数器
23. always @(posedge rgmii_txclk_ts)
24. if(~rst_n)begin
25. gmii_txdv_cnt <= 9‘d0;
26. end
27. else begin
28. gmii_txdv_cnt <= gmii_txdv_cnt +1‘b1;
29. end
4)、产生至少1MS 复位信号,如果没有产生这个信号,那么PHY芯片不会工作
1. //generate PHY reset signal
2. reg[22:0]rgmii_rst_cnt=0;
3. assign rgmii_rst_n_o=rgmii_rst_cnt[22];
4. always @(posedge CLK_50MHZ_i)begin
5. if(!rgmii_rst_cnt[22])rgmii_rst_cnt<=rgmii_rst_cnt+1‘b1;
6. end
本程序详细描述了RGMII PHY的传输原理,看起来这就像是我们熟悉的没有协议的双工千兆串口。通过本节程序的学习,可以掌握千兆网RGMII接口的驱动程序编写,特别是使用到了原语IDDR2 和ODDR2 分布实现双边沿数据的采样和双边沿数据的发送,为后面进行UDP协议的编写做好准备工作。
标签:
原文地址:http://www.cnblogs.com/milinker/p/4804893.html