RGMII_PHY测试笔记1 基于开发板MiS603-X25

作者:汤金元

日期:20150817

公司:南京米联电子科技有限公司

博客:http://blog.chinaaet.com/detail/46639

论坛:www.osrc.cn

网址:www.milinker.com

网店:http://osrc.taobao.com

网络通信对于本人来说一直很神秘,没有搞过10M网络,也没有搞过100M网络,更没有搞过千兆网络,更不要说RGMII了。但是今天本人成功了,实现0到RGMII突破。如果,兄弟你觉得有难度,我告诉你,你也行的,下面就开始见证本人徒步学习RGMII千兆网络部分的苦逼经历。今天主要完成PHY的测试。

何为RGMII ?

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个。

RGMII接口定义?

发送器:

◎ 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根数据线。

RGMII通信时序?

发送器:

◎ 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是数据同步机制,可以理解为同步信号

RGMII 硬件方案-VSC8601

VITESSE公司的VSC8601是一颗支持10/100/1000M PHY的RGMII MAC接口芯片,此芯片价格便宜,淘宝价格大概十几元一颗,另外封装是TQFP64 封装,只有64个PIN外围简单,焊接调试方便,功耗低,支持3.3V的IO接口,算是RGMII方案中首选无二的IC了。

VSC8601应用方案

RGMII 硬件接口

硬件电路原理图

由于时钟速度125MHZ 双边沿采样,对硬件要求很高,PCB必须等长布线

好了,具备这些硬件知识就可以设计程序了。

一下本人把一些设计要点列出来,读者具体看程序

1、产生至少1MS 复位信号,如果没有产生这个信号,那么PHY芯片不会工作

//generate PHY reset signal

reg[22:0]rgmii_rst_cnt=0;

assign rgmii_rst_n_o=rgmii_rst_cnt[22];

always @(posedge CLK_50MHZ_i)begin

if(!rgmii_rst_cnt[22])rgmii_rst_cnt<=rgmii_rst_cnt+1'b1;

End

2、为了实现上下沿都进行采样,关于一些原语的基础知识

ILOGIC2资源

图ILOGIC2逻辑框图,它可支持以下功能。

边沿触发D型触发器。

IDDR(NONE、C0或C1)模式。

锁存器。

异步/组合逻辑。

(1) 异步/组合逻辑。

当有下列情况之一时,软件会自动生成组合通路,使输入驱动器与FPGA内部逻辑资源直接连接。

FPGA的输入数据与内部逻辑直接相连,而没有用寄存器。

“打包I/O寄存器/锁存器到IOB中”的属性设置为OFF。

(2) IDDR模式。

Spartan-6器件的ILOGIC2中有专用寄存器来实现输入双倍数据速率(DDR)寄存器。可以通过例化IDDR2的原语来使用此功能。

DDR2的属性DDR_ALIGNMENT有3种模式:NONE、C0和C1。

在NONE模式下,输入DDR时序如图2-40所示。寄存器在C0上升沿将输入数据D寄存到Q0,C1上升沿将下一输入数据D寄存到Q1。

· · 

图2-40 DDR_ALIGNMENT=NONE时输入DDR时序示意图

在某些情况下,输入数据必须同步到一个时钟域里,通常C0同步。但是在频率比较高的情况下,这种同步相对比较困难,因为有效时间仅为时钟周期的一半(50%占空比的情况下)。Spartan-6器件中的IDDR2包含了专用的逻辑,可以在ILOGIC2内部进行时钟域的同步。

当DDR_ALIGNMENT为C0(或C1),信号Q0(Q1)在C1(C0)再次寄存,通过内部互联将输入数据同步到同一时钟域。时序图如图2-41所示。

图2-41 DDR_ALIGNMENT=C0\C1 的输入DDR

IDDR 的原语如图2-42 所示。

· · 

图2-42 IDDR2 的原语

OLOGIC2 资源

如图2-43所示,OLOGIC2主要由两部分组成,分别是输出数据路径和三态控制路径。

这两个部分可以配置成以下模式。

边沿触发D 型触发器。

DDR 模式(NONE、C0 或C1 同步方式)。

电平敏感锁存器。

异步/组合逻辑。

图2-43 OLOGIC2 逻辑模块

(1) 组合数据输出和三态控制路径。

当有下列情况之一时,软件会自动生成组合通路,将FPGA 内部数据直接输出到输出驱动器或驱动器的控制端。

“打包I/O 寄存器/锁存器到IOB 中”的属性设置为OFF。

(2) ODDR模式。

Spartan-6器件的OLOGIC2中具有专用寄存器,用来实现DDR输出寄存器。例化ODDR2原语可以使用此功能。当使用OLOGIC2时,会自动使用多路复用器,多路复用器的控制端产生于时钟信号,不需要手动控制。ODDR2 有两个时钟输入,相位差180°。

ODDR2 支持以下操作模式。

NONE 模式:允许设计人员在C0 和C1 时钟的上升沿将两个数据通过DDR多路复用器送

至输出引脚,如图2-44所示。·

图2-44 DDR_ALIGNMENT=NONE 下的ODDR2

C0模式:在时钟C0上升沿时,将两个数据通过DDR多路复用器送至输出引脚。

C1模式:在时钟C1上升沿时,将两个数据通过DDR多路复用器送至输出引脚。

ODDR原语如图2-45所示。

· ·

图2-45 ODDR原语

原语应用-双边沿采样

//use IDDR2 sample data with poseadge and negadge

IDDR2 #(

.DDR_ALIGNMENT("C0"),

.INIT_Q0(1'b0),

.INIT_Q1(1'b0),

.SRTYPE("SYNC")

)

Iddr2_0(

.Q0(gmii_rxd[4]), // 1-bit output captured with C0 clock

.Q1(gmii_rxd[0]), // 1-bit output captured with C1 clock

.C0(rgmii_rxclk_n), // 1-bit clock input

.C1(rgmii_rxclk_i), // 1-bit clock input

.CE(1'b1), // 1-bit clock enable input

.D(rgmii_rxd_i[0]),   // 1-bit ddr data input

.R(1'b0),   // 1-bit reset input

.S(1'b0)    // 1-bit set input

);

原语应用双边沿输出

//usb ODDR2 output data with posadge and neadge

assign rgmii_txdv_o = gmii_txdv;

ODDR2 #(

.DDR_ALIGNMENT("C0"), // Sets output alignment to "NONE", "C0" or "C1"

.INIT(1'b0),    // Sets initial state of the Q output to 1'b0 or 1'b1

.SRTYPE("ASYNC") // Specifies "SYNC" or "ASYNC" set/reset

)

ODDR2_0 (

.Q(rgmii_txd_o[0]),   // 1-bit DDR output data

.C0(rgmii_txclk),   // 1-bit clock input

.C1(rgmii_txclk_n),   // 1-bit clock input

.CE(1'b1), // 1-bit clock enable input

.D0(gmii_txd[0]), // 1-bit data input (associated with C0)

.D1(gmii_txd[4]), // 1-bit data input (associated with C1)

.R(1'b0),   // 1-bit reset input

.S(1'b0)    // 1-bit set input

);

为了实现数据的发送和接收的对比需要准备2块MIS603开发板

测试数据发送:

原理:发送数据从0~255 不停循环

//计数器循环累加,当gmii_txdv_cnt[8]为0时将数据输出

reg [8:0]gmii_txdv_cnt;

assign gmii_txd_ts  = gmii_txdv_cnt[8] ?  7'd0  : gmii_txdv_cnt[7:0];

//数据有效标志

assign gmii_txdv_ts = ((~gmii_txdv_cnt[8])||(gmii_txdv_cnt==256)||(gmii_txdv_cnt==257)) ?  1'b1  : 1'b0;

//循环计数器

always @(posedge rgmii_txclk_ts)

if(~rst_n)begin

gmii_txdv_cnt <= 9'd0;

end

else begin

gmii_txdv_cnt <= gmii_txdv_cnt +1'b1;

end

测试数据接收对比:

原来采用了一个状态机首先识别0x55 识别2个0x55后,后面就是有效数据,如果是从0~255不停累加就代表正确。

reg [7:0]gmii_rxd_next;

//比较数据

assign rxd_error= (rxd_s==2'd2) ? ((gmii_rxd_next==gmii_rxd_ts) ? 1'b0 : 1'b1 ) : 1'b0;

reg [1:0] rxd_s;

//下一个数据被比较数据准备

always @(posedge rgmii_rxclk_ts)begin

if((~rst_n)||(gmii_rxdv_ts!=2'b11))begin

gmii_rxd_next<=8'd1;

rxd_s<=2'd0;

end

else if(gmii_rxdv_ts==2'b11)begin

case(rxd_s)

0:

if(gmii_rxd_ts==8'h55)//接收第一个55

rxd_s <= rxd_s + 1'b1;//0x55

1:

if(gmii_rxd_ts==8'h55)//接收第二个55

rxd_s <= rxd_s + 1'b1;

else

rxd_s <= 2'd0;

2: begin //计算下一个比较数据

gmii_rxd_next <= gmii_rxd_ts+1'b1;

if(gmii_rxd_ts==8'd255)

rxd_s <= 2'd0;

end

endcase

end

end

测试结果:

PHY板对板测试,48小时以上没有任何错误。

源码下载地址:

http://pan.baidu.com/s/1pwSnc

转载:http://blog.chinaaet.com/whilebreak/p/46639

http://xilinx.eetrend.com/blog/1949

RGMII_PHY测试笔记1 基于开发板MiS603-X25的更多相关文章

  1. 搭建测试环境——针对S3C6410开发板

    (一)前言 目前市面上的开发板型号和种类很多,但目前最流行的是基于三星S3C6410 ARM11架构的开发板.国内很多厂商在S3C6410 ARM11架构的开发板的基础上进行了扩展,开发了扩展板,本博 ...

  2. [国嵌笔记][013][Mini2440开发板介绍]

    系统资源 处理器:三星 S3C2440A ARM9 内存:64M SDRAM Nor Flash:2MB Nand  Flash:256MB LCD:3.5寸 分辨率320*240 启动模式 从nan ...

  3. Hi3516开发笔记(一):海思HI3516DV300芯片介绍,入手开发板以及Demo测试

    前言   目前主流国产芯片为RV11XX.RK33XX.Hi35XX系列,本系列开启Hi3516系列的开发教程.   Hi3516DV300芯片介绍   Hi3516DV300为专业行Smart IP ...

  4. linux下开发板网络速度测试记录

        由于做的项目对于网络和USB的读写速度有很高的要求,因此新拿回来的板子要测试网络和usb的最佳传输速度.要考虑不少因素,先把我能想到的记录下来.     测试的环境是开发板和ubuntu虚拟机 ...

  5. 学习itop4412开发板有哪些资料可学习?能否学会

    1.光盘资料 下面简单的做一下了解,在需要使用这些资料的时候,会针对性的做详细介绍. 将文件以及文件夹按照“名称+递增”的方式排列,如下: 01_PCB_SCH_DATASHEET-- -----开发 ...

  6. 迅为iTop开发板使用buildroot构建opencv文件系统

    这次我们来介绍使用buildroot构建opencv开发环境,buildroot 是 Linux平台上一个构建嵌入式Linux系统的框架.整个buildroot是由 Makefile脚本和Kconfi ...

  7. 搭建S3C6410开发板的测试环境

      因为ARM架构的开发板可基于X86架构的PC在CPU指令以及二进制上都有所不同,而且如果linux驱动需要访问硬件,这些硬件很难在PC上模拟,所以就需要我们在带有这些硬件的开发板上进行调试和测试. ...

  8. AC6102开发板USB3.0测试和使用说明

    AC6102开发板USB3.0测试和使用说明 概述 AC6102上集成了一颗Cypress 推出的高性能USB3.0传输芯片CYUSB3014,Cypress称之为EZ-USBFX3.该芯片性能强劲, ...

  9. 第五章 搭建S3C6410开发板的测试环境

    在PC上可以开发Linux驱动,重新编译成ARM架构的Linux驱动模块,但最后还是要在开发板上进行测试.目前最流行的是基于三星S3C6410 ARM11架构的开发板,很多厂商在其基础上进行了扩展,开 ...

随机推荐

  1. IdentityServer4-EF动态配置Client和对Claims授权(二)

    本节介绍Client的ClientCredentials客户端模式,先看下画的草图: 一.在Server上添加动态新增Client的API 接口. 为了方便测试,在Server服务端中先添加swagg ...

  2. TypeReference -- 让Jackson Json在List/Map中识别自己的Object

    private Map<String, Object> buildHeaders(Object params) { ObjectMapper objectMapper = JacksonH ...

  3. iOS 技术篇:渐变色的简单实现方式

    实现效果 //渐变设置 UIView *view = [[UIView alloc] initWithFrame:CGRectMake(,, [UIScreen mainScreen].bounds. ...

  4. python有序字典OrderedDict()

    转python创建有序字典OrderedDict # -*- coding:utf-8 -*- """ python有序字典 需导入模块collections " ...

  5. SQL EXCEPT INTERSECT

    EXCEPT是指在第一个集合中存在,但是不存在于第二个集合中的数据. INTERSECT是指在两个集合中都存在的数据. )) go )) go insert into t1 ,'t1' union a ...

  6. HDU.5628.Clarke and math(狄利克雷卷积 快速幂)

    \(Description\) \[g(i)=\sum_{i_1|i}\sum_{i_2|i_1}\sum_{i_3|i_2}\cdots\sum_{i_k|i_{k-1}}f(i_k)\ mod\ ...

  7. 洛谷.1501.[国家集训队]Tree II(LCT)

    题目链接 日常zz被define里没取模坑 //标记下放同线段树 注意51061^2 > 2147483647,要开unsigned int //*sz[]别忘了.. #include < ...

  8. [POI2014]Couriers

    OJ题号:BZOJ3524.BZOJ2223.洛谷3567 思路: 维护一颗可持久化权值线段树,记录每次加入数字时,不同数字出现的个数.对于每一个询问$[l,r]$,同时查询以$r$和$l-1$为根的 ...

  9. 2016年3月15日Android实习日记

    1.解决了ScrollView滑动冲突问题. 2.设置好了“查看详解”与“题目编号”的部分. 3.完成了app启动图片的设置,并在启动的过程中开辟新的线程连接服务器并开启监听数据. 别忘了注册启动Ac ...

  10. 2016年3月11日Android实习日记

    1.明天删除orthodotics_design_animation_content_gif.gif文件.(已完成) 2. 如何检测内存泄露? A: 可以通过一些性能监测分析工具,如 JProfile ...