千兆以太网

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作用
Preamble32位引导码,由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。

  • 2
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值