概述
1.以太网
千兆是指传输速度。有十兆、百兆、千兆、万兆以太网。
实际传输速率由两端协商,取最低值。
RGMII接口和IDDR原语的使用和千兆PHY数据接收。
RGMII是FPGA和PHY通信的接口。
IDDR是将PHY里面的数据恢复出来。
2.遵循的协议
1.RGMII(Reduced Gigabit Media Independent Interface);
2.UDP(User Datagram Protocol);
2.1 RGMII
RGMII是吉比特介质独立接口。采用4位数据接口,工作时钟125MHZ,双边沿传输,兼容10M/100M工作方式。10M/100M1000Mb/s对应的clk信号分别为2.5MHZ/25MHZ/125MHZ。
GMII是上升沿传输,8bit位宽。
2.2 UDP
全称用户数据报协议,在网络中与TCP一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层–传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送后,无法得知其是否安全完全送达。UDP用来支持那些需要在计算机之间传输数据的网络应用。
3.硬件介绍
通过电脑将图像通过网线发送到板卡(RJ45),RJ45将数据传输给网卡(PHY),PHY将差分信号转化成双边沿数据传输给FPGA,FPGA处理完成后将图像信息缓存到DDR3中,当一帧图像信息传输完成后,将DDR3中的数据读出显示加上UDP协议传回PC机。
3.1 RJ45
在10M/100Mb/s通信速率下的引脚功能
由图和表可知:RJ45只用了四根线,其中两根用来接收数据,两根用来发送数据。其余四根是备用线。
在1000Mb/s通信速率下的引脚功能:
由图和表可知在千兆速度下八根线都有用到且是双向引脚。支持千兆通讯的RJ45接口是向下兼容的,也支持10M和100M,只是引脚功能有区别。
3.2 PHY芯片
以太网接口电路主要由MAC(Media Access Control)控制器和物理层接口PHY(Physical Layer,PHY)两大部分构成。这两部分既可整合到一颗芯片内,也可独立分开。对于本次设计来说,MAC控制器由FPGA实现,PHY芯片开发板板载。
VSC8601设备包含一个IEEE802.3兼容的串行管理接口(SMI),其中MDC和MDIO可对芯片进行控制。SMI提供了访问权限设备控制和状态寄存器。控制SMI的寄存器由32组成16位寄存器,包括所有需要的IEEE指定寄存器。此外,有通过设备寄存器31可以访问的寄存器的附加寄存器。
PHY芯片指开发板板载的以太网芯片。PHY接收MAC发送过来的数据,把并行数据转化为串行数据,按照物理层的编码规则把数据编码转化为模拟信号发送出去,接收数据时流程反之。
PHY还提供了和对端设备连接的重要功能,并通过LED灯显示连接状态和工作状态。还可互相协商连接速度、双工或者半双工、是否采用流控等。通常结果是采用双方能同时支持的最大速度和最好的双工。这种技术被称为自协商。
3.2.1 MDIO接口
MAC和PHY芯片有一个配置接口,即MDIO接口。可以配置PHY芯片的工作模式以及获取PHY芯片的状态信息。PHY芯片内部有一系列寄存器。用户通过配置寄存器来配置PHY芯片的工作模式。
FPGA通过MDIO接口对PHY芯片的内部寄存器进行配置。通常情况下芯片在默认情况下也可以工作,即配置芯片不是必须的。
MDIO接口也被称为SMI接口(Serial Management Interface,串行管理接口),包括ETH_MDC(数据管理时钟,最大不超过12.5MHZ)和ETH_MDIO(数据管理输入输出,双向数据线)两条信号线。
MDIO接口的读写通信协议如下图:
名称1 | 作用 |
---|---|
Preamble | 32位引导码,由MAC端发送32位逻辑1,用于同步PHY芯片 |
ST(Start of Frame) | 两位帧开始信号,用01表示 |
OP(Operation Code) | 两位操作码,读:10 , 写:01 |
PHYAD | 五位PHY地址,用于表示和那个PHY芯片通讯 |
REGAD(Register Address) | 五位寄存器地址,可以表示32位寄存器 |
TA(Turnaround) | 两位转向。在读命令中MDIO由MAC驱动改为PHY驱动。写命令中MAC固定输入01 |
data | 读取PHYAD寄存器中对应的数据或者写入数据。高位在前低位在后 |
IDLE | 空闲状态均为高阻态 |
转向就是MAC由发送数据变成接收数据 |
3.2.2 以太网PHY芯片(RTL8211FD)
1.芯片地址:芯片地址有五位。高两位固定为00,低三位可通过硬件电路设置为上拉或者下拉。从而表示不同的地址。达芬奇PRO的地址为5‘b00001。
2.复位:复位后PHY内部寄存器内的数据会恢复至默认状态,并且重新开始自协商。本芯片有两种复位模式一种是硬件复位:通过ETH_RST_N持续10ms的低电平来复位。一种是软件复位:向寄存器地址0x00的bit[15]写入1进行复位。复位完成后改位会自动清零。
3.寄存器:RTL8211FD共有32位寄存器,本次实验仅用三个寄存器:控制寄存器、状态寄存器以及PHY芯片具体状态寄存器。
寄存器也可通过CMODE引脚进行配置,CMODE引脚外接不同的电阻代表不同的四位数,用来配置寄存器的0和1
寄存器
控制寄存器(Basic Mode Control Register,address 0x00)简写为BMCR,用于芯片复位和其他功能的控制。各个位的说明如下图所示。
位 | 作用 |
---|---|
15 | 软件复位,1:PHY复位.2:正常模式 |
14 | 内部环回模式,1:本地环回模式 0:正常模式; |
13 | 通信速度:00:10M 01:100M 10:1000M 11:保留 |
12 | 自动协商使能 1:自动协商使能 0:自动协商不使能; |
11 | |
10 | |
9 | 重启自协商,1:重新开始自协商 0:自协商重启完成。 |
8 | 通信模式,1:全双工 0:半双工 |
7 | |
6 | |
5 | |
4 | |
3 | |
2 | |
1 | |
0 |
基本状态寄存器器(Basic Mode Status Register, Address 0x01),简写为:BMSR,各个位的说明如下图所示:
位 | 作用 |
---|---|
15 | |
14 | |
13 | |
12 | |
11 | |
10 | |
9 | |
8 | |
7 | |
6 | |
5 | 自协商完成 1:自协商完成 0:正在进行自协商; |
4 | |
3 | |
2 | 连接状态, 1:连接成功 0:连接失败。 |
1 | |
0 |
PHY 特定状态寄存器(PHY Specific Status Register ,Address 0x00),简写为:PHYSR,各个位的说明如下图所示:
位 | 作用 |
---|---|
15 | |
14 | |
13 | |
12 | |
11 | |
10:9 | |
8 | |
7 | |
6 | |
5:4 | 通信速度:00:10M 01:100M 10:1000M 11:保留 |
3 | |
2 | |
1 | |
0 |
4.硬件设计
4.1 MDIO实验
PHY芯片内部有许多的寄存器,通过配置这些寄存器参数可以控制PHY的工作状态
4.2 ARP实验
两台主机通过以太网进行通讯,必须知道目的主机的MAC地址(物理地址),这个由ARP协议完成。
4.2.1 ARP概论
ARP(Address Resolution Protocol),即地址解析协议。是根据IP地址(逻辑地址)获取MAC地址的一种TCP/IP协议。
4 Xilinx原语
BUFG
全局缓冲,BUFG的输出到达FPGA内部的IOB、CLB、块RAM的时钟延迟和抖动最小。原语模板如下
BUFG BUFG_inst (
.O(O), // 1-bit output: Clock output
.I(I) // 1-bit input: Clock input
);
除了BUFG之外,常用的还有BUFR,BUFR是regional时钟网络,他的驱动范围只能局限在一个clock region逻辑。BUFR相比BUFG最大的优势是偏斜和功耗都比较小。
BUFIO:BUFIO是IO时钟网络,其独立与全局时钟资源,适合采集源同步数据。只能驱动IO Block里面的逻辑,不能驱动CLB里面的LUT、REG等逻辑。原语模板如下
BUFIO BUFIO_inst (
.O(O), // 1-bit output: Clock output (connect to I/O clock loads).
.I(I) // 1-bit input: Clock input (connect to an IBUF or BUFMR).
);
BUFIO在采集源同步IO数据时,提供非常小的延时,因此非常适合采集比如RGMII接收侧的数据。但是由于其不能驱动FPGA的内部逻辑,因此需要BUFIO和BUFG配合使用,以达到最佳性能。如ETH_RXC的时钟经过BUFIO,用来采集端口数据,ETH_RXC经过BUGG,用来作为除了端口外的其他模块的操作时钟。
IDDR
IDDR(input double data rate)registers,在7系列设备的ILOGIC block中有专属的registers来实现。作用是将双边沿(DDR)的信号变成两个单边沿(SDR)的信号。
引脚 | 作用 |
---|---|
C | 输入时钟 |
D | 输入的1位DDR数据 |
Q1、Q2 | 分别是C时钟上升沿和下降沿同步输出的SDR数据 |
CE | 时钟使能 |
S/R | 置位/复位信号 |
原语模板
IDDR #(
.DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE", "SAME_EDGE"
// or "SAME_EDGE_PIPELINED"
.INIT_Q1(1'b0), // Initial value of Q1: 1'b0 or 1'b1
.INIT_Q2(1'b0), // Initial value of Q2: 1'b0 or 1'b1
.SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
) IDDR_inst (
.Q1(Q1), // 1-bit output for positive edge of clock
.Q2(Q2), // 1-bit output for negative edge of clock
.C(C), // 1-bit clock input
.CE(CE), // 1-bit clock enable input
.D(D), // 1-bit DDR data input
.R(R), // 1-bit reset
.S(S) // 1-bit set
);
DDR_CLK_EDGE参数为IDDR的三种采集模式,分别是“OPPOSITE_EDGE”、“SAME_EDGE”和“SAME_EDGE_PIPELINED”
OPPOSITE_EDGE模式的时序图如下图所示:
SAME_EDGE模式的时序图如下图所示:
SAME_EDGE_PIPELINED模式的时序图如下图所示:
ODDR
通过 ODDR 把两路单端的数据合并到一路上输出,上下沿同时输出数据,上升沿输出 a 路,下降沿输出 b 路;如果两路输入信号一路固定为 1,另外一路固定为 0,那么输出的信号实际上是时钟信号。
ODDR #(
.DDR_CLK_EDGE("OPPOSITE_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 (
.Q(Q), // 1-bit DDR output
.C(C), // 1-bit clock input
.CE(CE), // 1-bit clock enable input
.D1(D1), // 1-bit data input (positive edge)
.D2(D2), // 1-bit data input (negative edge)
.R(R), // 1-bit reset
.S(S) // 1-bit set
);
ODDR的只有两种输出模式,分别是“OPPOSITE_EDGE”和“SAME_EDGE”模式。
此种模式下,在 FPGA 内部需要两个反相时钟来同步 D1 和 D2,此种模式使用较少。
此种模式下,数据可以在相同的时钟边沿输出到 Q,一般采用此种模式。
IDELAYE2和IDELAYCTRL
IO延时原语,用于在信号通过引脚进入芯片内部之前,进行延时调节,一般高速端口信号由于走线延时等原因,需要通过IDELAYE2原语对数据进行微调。原语模板如下:
IDELAYE2 #(
.CINVCTRL_SEL("FALSE"), // Enable dynamic clock inversion (FALSE, TRUE)
.DELAY_SRC("IDATAIN"), // Delay input (IDATAIN, DATAIN)
.HIGH_PERFORMANCE_MODE("FALSE"), // Reduced jitter ("TRUE"), Reduced power ("FALSE")
.IDELAY_TYPE("FIXED"), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE
.IDELAY_VALUE(0), // Input delay tap setting (0-31)
.PIPE_SEL("FALSE"), // Select pipelined mode, FALSE, TRUE
.REFCLK_FREQUENCY(200.0), // IDELAYCTRL clock input frequency in MHz
.SIGNAL_PATTERN("DATA") // DATA, CLOCK input signal
)
IDELAYE2_inst (
.CNTVALUEOUT(CNTVALUEOUT), // 5-bit output: Counter value output
.DATAOUT(DATAOUT), // 1-bit output: Delayed data output
.C(C), // 1-bit input: Clock input
.CE(CE), // 1-bit input: Active high enable increment/decrement input
.CINVCTRL(CINVCTRL), // 1-bit input: Dynamic clock inversion input
.CNTVALUEIN(CNTVALUEIN), // 5-bit input: Counter value input
.DATAIN(DATAIN), // 1-bit input: Internal delay data input
.IDATAIN(IDATAIN), // 1-bit input: Data input from the I/O
.INC(INC), // 1-bit input: Increment / Decrement tap delay input
.LD(LD), // 1-bit input: Load IDELAY_VALUE input
.LDPIPEEN(LDPIPEEN), // 1-bit input: Enable PIPELINE register to load data input
.REGRST(REGRST) // 1-bit input: Active-high reset tap-delay input
);
引脚 | 作用 |
---|---|
IDATAIN | 延时前的输入信号 |
DATAOUT | 延时后的输出信号 |
REFCLK_FREQUENCY | 为IDELAYCTRL 原语的参考时钟频率,一般为200Mhz |
IDELAY_VALUE | 用来设置延时的 tap 数,范围为 1~31,每个 tap 数的延时时间和参考时钟频率有关 |
IDELAYCTRL 和 IDELAYE2 一般同时使用,IDELAYCTRL 对 IDELAYE2 延时进行校准。IDELAYE2 原语如下:
(* IODELAY_GROUP = <iodelay_group_name> *)
IDELAYCTRL IDELAYCTRL_inst (
.RDY(RDY), // 1-bit output: Ready output
.REFCLK(REFCLK), // 1-bit input: Reference clock input
.RST(RST) // 1-bit input: Active high reset input
);
IODELAY_GROUP 为延时 IO 分组,一般数据接口位于多个 BANK 时,才需要分组。
IDELAYCTRL 通过参考时钟 REFCLK 来校准 IDELAY2 每个 tap 的延时值,可用的 REFCLK 频率为190Mhz到210Mhz 或者 290Mhz~310Mhz。时钟频率越高对应的 tap 延时平均值越小,即延时调节精度越高。当参考时钟为 200Mhz 时,一个 tap 为 78ps。
最后
以上就是野性蜻蜓为你收集整理的千兆以太网1.以太网2.遵循的协议3.硬件介绍4.硬件设计的全部内容,希望文章能够帮你解决千兆以太网1.以太网2.遵循的协议3.硬件介绍4.硬件设计所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复