赞
踩
以太网的通信离不开物理层 PHY 芯片的支持,以太网 MAC 和 PHY 之间有一个接口,常用的接口有MII、 RMII、 GMII、 RGMII 等。
RGMII接口如下:
信号名称 | 位宽 | 方向 | 描述 |
---|---|---|---|
TXC | 1 | OUT | 发送时钟信号,10/100/1000Mbps 模式频率分别为 2.5M/25M/125MHz |
TD | 4 | OUT | 发送数据信号 |
TX_CTL | 1 | OUT | 发送数据控制信号,上升沿时为数据有效信号,下降沿时为数据有效信号/错误信号 |
RXC | 1 | IN | 接收时钟信号,10/100/1000Mbps 模式频率分别为 2.5M/25M/125MHz |
RD | 4 | IN | 接收数据信号 |
RX_CTL | 1 | IN | 接收控制信号,上升沿时为数据有效信号,下降沿时为数据有效信号/错误信号 |
RGMII 是 GMII 的简化版,数据位宽为 4 位
MAC(介质访问控制)和PHY(物理层)是网络通信中两个互补的组件,它们共同工作以实现数据在网络中的传输。它们在OSI模型中分别对应不同的层次:
MAC(Media Access Control,介质访问控制)是网络接口的一部分,负责管理和控制数据在物理媒介上的传输。PHY(Physical Layer,物理层)是网络接口的另一个重要组成部分,它负责通过物理媒介(如电缆、光纤等)传输和接收实际的比特流。MAC和PHY共同工作以实现网络通信。
MAC需要配置PHY的原因包括:
总之,MAC配置PHY是为了确保网络接口能够在物理层上正确、高效、可靠地传输数据,并与网络中的其他设备兼容。
MDIO(Management Data Input/Output,管理数据输入输出) 是一种简单的双线串行接口。该总线由 IEEE 通过以太网标准 IEEE 802.3 的若干条款加以定义。可收集的信息包括链接状态、传输速度与选择、断电、低功率休眠状态、TX\RX 模式选择、自动协商控制、环回模式控制等。
其包含 2 个引脚:MDC 和 MDIO。MDC 管理数据的时钟输入,最高速率 8.3 MHz;MDIO 管理数据的输入输出,数据是与 MDC 时钟同步的。
通过FPGA向PHY操作的数据格式如下:
Preamble | Start | Opcode | PHY address | Register address | Turn-around | Register data | Idle |
32bit 1 | 01 | Read:10 Write:01 | 5bit | 5bit | Read:z0 Write:10 | 16 bit | z |
下面给出读写两种情况下的MDIO和MDC的时序图:
①写操作
②读操作
时序图中与手册规定的不一样,并没有采用32bit的前导码。
对寄存器进行配置或读取时,需要按照上述的数据格式,通过MDIO一比特一比特的传输到PHY中。
要确定PHY芯片的地址,需要查看PHY芯片手册以及板卡原理图。
①PHY芯片手册决定了控制信号和PHY地址的对应关系
②板卡原理图决定了PHY地址的控制信号所连接的对象
接下来以手上的一个325t的办卡进行举例:
先看一下PHY芯片手册:
可以看到各个控制信号对应的管脚信息,并且说明了CONFIG[0]决定了PHY地址的低3位,CONFIG[1]决定了PHY地址的高两位。
查看板卡原理图:
我们可以发现,CONFIG[0]连接着PHYA_LED_RX,CONFIG[1]连接着PHYA_LED_LINK1000。我们查看88E1111的手册,如下:
可知LED_RX对应010,LED_LINK1000对应100,因此CONFIG[0]对应的PHY地址低3位为010,CONFIG[1]对应的PHY地址高2位为00,因此PHY地址为00010。
我们以控制寄存器0举例,为了配置千百兆模式需要对控制寄存器0的bit6和bit13进行配置。
因此寄存器地址为0,将寄存器数据的bit13、bit6按照需要的模式进行配置,其他功能可对对应bit配置相应数据。
接收端信号时序如下图所示:
一般的PHY芯片包含两种RGMII接收端口时序模式,分别为延时模式和非延时模式,通过控制寄存器20的bit7实现,当其为1时是延时模式,为0时是非延时模式,默认情况下是非延时模式。
非延时模式下,接收时钟与接收数据信号边沿对其。
延时模式下时钟信号RX_CLK的边沿处于数据和控制信号的中心位置,此时的RX_CLK相对于数据和控制信号有2ns的延迟(2ns是因为在1000M速率下时钟为125MHz,一个时钟周期为8ns,一个数据的有效时间为4ns)
发送端信号时序如下图所示:
一般的PHY芯片包含两种RGMII发送端口时序模式,分别为延时模式和非延时模式,通过控制寄存器20的bit1实现,当其为1时是延时模式,为0时是非延时模式,默认情况下是非延时模式。
非延时模式下时序图如上图所示,可知在此模式下时钟信号TX_CLK的边沿处于数据和控制信号的中心位置,此时的TX_CLK相对于数据和控制信号有2ns的延迟(2ns是因为在1000M速率下时钟为125MHz,一个时钟周期为8ns,一个数据的有效时间为4ns)。
延时模式下,要求发送时钟和数据及控制信号的边沿对齐。
IDDR(Input Double Data Rate)原语是Xilinx FPGA中用于处理双数据速率信号的一种原语,它将输入的双被速率数据转换为单倍速率信号。
信号名称 | 位宽 | 方向 | 描述 |
---|---|---|---|
CE | 1 | IN | 时钟使能信号 |
C | 1 | IN | 时钟信号 |
S | 1 | IN | 置位信号 |
R | 1 | IN | 复位信号 |
D | 1 | IN | 输入的双倍速率的数据,即D在时钟的上升沿和下降沿都会发生切换,一个时钟周期发送2bit数据 |
Q1 | 1 | OUT | 单倍速率的输出数据 |
Q2 | 1 | OUT | 单倍速率的输出数据 |
它支持三种不同的工作模式,这些模式决定了IDDR如何对输入数据进行采样以及输出数据的生成方式:
OPPOSITE_EDGE模式:在这种模式下,IDDR将在时钟的上升沿和下降沿都进行数据采样。这意味着每个时钟周期的上升沿和下降沿都会有数据变化,实现双沿传输。输出Q1在时钟的每个上升沿提供在该上升沿采集到的数据,而Q2在时钟的每个下降沿提供在该下降沿采集到的数据。
SAME_EDGE模式:此模式与OPPOSITE_EDGE模式的输入信号时序一致,但区别在于Q1和Q2都只在时钟的上升沿输出数据。在第一个上升沿,Q1输出在该上升沿采集到的数据,而在随后的下降沿,Q2采集数据,并在第二个上升沿,Q1输出第二个上升沿采集的数据,Q2输出第一个下降沿采集的数据。
SAME_EDGE_PIPELINED模式:这是最常用的数据采集模式。与SAME_EDGE模式类似,但Q1的输出数据会延迟一个时钟周期,使得Q1和Q2的第一个数据至最后一个数据进行对齐,这样方便后续逻辑的操作,但代价是Q1的输出数据会有一个时钟周期的延迟
它的功能是将单倍速率的数据转化成双倍速率的数据。
信号名称 | 位宽 | 方向 | 描述 |
---|---|---|---|
C | 1 | IN | 时钟信号 |
CE | 1 | IN | 时钟使能信号 |
S | 1 | IN | 置位信号 |
R | 1 | IN | 复位信号 |
D1 | 1 | IN | 单倍速率的输入数据 |
D2 | 1 | IN | 单倍速率的输入数据 |
Q | 1 | OUT | 输出的双倍速率的数据,即Q在时钟的上升沿和下降沿都会发生切换 |
ODDR支持两种不同的工作模式:
OPPOSITE_EDGE模式:在此模式下,ODDR在时钟的上升沿采集D1输入信号,并在上升沿将采集到的信号输出;在时钟的下降沿采集D2输入信号,并在下降沿将采集到的信号输出。这种模式使用起来相对复杂,因为FPGA内部需要在时钟的上升沿给D1赋值,在时钟的下降沿给D2赋值,一般不常使用1820。
SAME_EDGE模式:此模式下,ODDR在时钟的上升沿同时采集D1和D2的数据,然后在时钟的上升沿输出采集的D1数据,在下降沿输出采集的D2数据。这种方式实现起来比较简单,属于常用的模式20。
用于将数据延迟一段时间。
例化:
(* IODELAY_GROUP = <iodelay_group_name> *) // Specifies group name for associated
IDELAYs/ODELAYs and IDELAYCTRL
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 (190.0-210.0,
290.0-310.0).
.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
);
延时值如下:
延时值 = 600 p s + t a p ∗ r e s o l u t i o n r e s o l u t i o n = 1 64 ∗ f ( u s ) 延时值=600ps+tap*resolution\\ resolution=\frac{1}{64*f} (us) 延时值=600ps+tap∗resolutionresolution=64∗f1(us)
其中f频率的单位为MHz,tap值为CNTVALUEIN的值。
详细可参考下面文章:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。