本文对 Vivado 的三速 MAC IP 核(Tri Mode Ethernet MAC,TEMAC)进行介绍。
在自行实现三速以太网 MAC 控制器时,GMII/RGMII 接口可以通过 IDDR、ODDR 原语实现,然而实际使用中自己实现的模块性能不是很稳定(主要是时序约束问题),导致在不同板子上、不同编译版本的固件中,经常出现数据错乱的问题,这就不免需要重新修改设计,很是麻烦,因此尝试使用官方提供的 TEMAC IP 核,以期解决这一问题。
TEMAC 简介
TEMAC 支持 10M、100M、1000M、2.5G 等多种速度,支持 RGMII、GMII、MII、SGMII、internal 等多种 PHY 接口。下图展示了 TEMAC 的功能框图
其中 Transmit Engine 从 AXI-Stream TX 接口接收数据,并添加前导码 Preamble、帧起始界定符 SFD、帧校验序列 FSC 等,并在必要时(长度小于最小 MAC 帧长度)填充数据,因此在使用 TEMAC 时,MAC 帧的这几个部分就不需要我们自己添加了(不过其他的 MAC 帧部分,如目的MAC地址、源MAC地址、类型/长度、MAC数据段等部分,还是要用户按字节流给入 TEMAC 的)。流量控制模块 Flow Control 可发送和接收可编程的暂停帧。
用户使用三个 AXI4 接口进行数据收发以及 MAC 控制器/ PHY 芯片配置,其中数据发送和接收使用 AXI4_Stream 接口,而配置接口使用 AXI4-Lite 接口,实现对 MAC 的配置和 MDIO 接口的读写。
可选的帧过滤器 Frame Filter 用于过滤与一组可配置过滤器匹配的帧,一般用于过滤掉目的 MAC 地址与本设备不一致的帧,TEMAC 默认开启帧过滤器。
统计计数器 Statistics Counters 用于记录 TX 和 RX 的帧数量,达到最大值后回绕,可配置为 32 或 64 位宽。
常用用户接口介绍
-
Transmitter Interface
- CLK & RESET & ENABLE
- tx_mac_aclk,output,TX Interface 接口的工作时钟,由 TEMAC 给出,(当物理接口为RGMII接口时,在三速下 tx_mac_aclk 均为 125M,不受 Speed Configuration 配置影响);
- tx_reset,output,复位信号;
- tx_enable,output,发送使能,1000M下恒为高,100M下占空比 1/10 (因为 tx_mac_aclk 恒为 125M)。
- AXI4-Stream TX Interface
- tx_axis_mac_tdata[7:0],input,要传输的帧数据;
- tx_axis_mac_tvalid,input,数据有效信号;
- tx_axis_mac_tready,output,握手信号,当数据被正确接收时,该信号被断言(注意到而非指示 TEMAC TX 空闲,这与一般的 ready 握手信号工作原理不同,因此不能用于判断是否可以传递数据,而是判断数据是否被正确传输了,从而决定是重传本字节还是继续传输下一字节);
- tx_axis_mac_tlast,input,帧结束信号;
- tx_axis_mac_tuser,input,端口控制信号,指示发生一个错误;当在传输期间断言该信号时,则 MAC 会插入一个错误代码以损坏当前帧,中止传输并回到空闲状态。
- TX Sideband Signal Pins
- tx_ifg_delay[7:0],input,帧间隙 IFG 配置端口,在启用帧间隙调整功能时,帧发送开始时发送器会读取该端口以确定 IFG;
- tx_collision,output,碰撞标志,全双工模式下恒输出 0(全双工时,实际生成 IP 时该接口不生成);
- tx_retransmit,output,重传标志,当与 tx_collision 同时被断言时,该 MAC 帧应当被重新提交以重传,全双工模式下恒输出 0(全双工时,实际生成 IP 时该接口不生成);
- tx_statisitics_vector[31:0],output,发送帧统计向量;
- tx_statistics_valid,output,统计向量有效标志。
- CLK & RESET & ENABLE
-
Receiver Interface
- CLK & RESET & ENABLE
- rx_mac_aclk,output,RX Interface 接口的工作时钟,由 TEMAC 给出,125M/25M/2.5MHz,受 TEMAC 接收器工作速度影响(Speed Configuration 寄存器);
- rx_reset,output,复位信号;
- rx_enable,output,接收使能,1000M下恒为高,100M 和 10M 下只有一半时间为高。
- AXI4-Stream RX Interface
- rx_axis_mac_tdata[7:0],output,接收到的帧数据;
- rx_axis_mac_tvalid,output,数据有效信号;
- rx_axis_mac_tlast,output,帧结束信号;
- rx_axis_mac_tuser,output,控制信号,在帧接收结束时断言,以表明该帧有一个错误;
- rx_axis_filter_tuser[x:0],output,帧过滤器输出。
- RX Sideband Signal Pins
- rx_statistics_vector[27:0],output,接收帧统计向量;
- rx_statistics_valid,output,统计向量有效标志。
- CLK & RESET & ENABLE
-
RGMII/GMII/MII Interafce
根据 PHY 芯片的接口形式,在生成 IP 时进行选择,介绍略。
-
MDIO Interface
PHY 芯片 MDIO 接口,介绍略。
-
流量控制接口 Flow Control Interface
- pause_req,input,时钟域 tx_mac_aclk,暂停请求,MAC 在当前数据包完成时发送一个暂停帧;
- pause_val[15:0],input,暂停值,该值被插入到暂停帧的相应字段。
-
速度指示接口 Speed Indication
-
speedis100,output,断言运行在 100M;
-
speedis10100,output,断言运行在 10M/100M;
-
这两个速度指示端口由 MAC Speed Configuration register 的 Bits[13:12] 驱动。若 {speedis100, speedis10100} = 2’b10,表示 TEMAC 运行在 100M,若为 2’b01,表示运行在 10M,若为 2’b00,表示运行在 1000M(注意,TEMAC 不会自动切换工作连接速度)。
-
Optional RGMII Interface Signal Pinout
-
inband_link_status,output,断言 RGMII 连接状态;
-
inband_clock_speed,output,断言 RGMII 连接速度;
-
inband_duplex_status,output,断言 RGMII 全双工状态。
实测表明,这三个信号可以实时指示实际连接的 PHY 网口状态,可根据这三个信号配置 MAC IP 的 MAC Speed Configuration register 寄存器,以实现三速以太网。
-
-
AXI4-Lite Interface (配置端口 Management Interface)
- 写地址通道 AWC
- s_axi_awaddr[11:0],input,写地址;
- s_axi_awvalid,input,写地址有效信号;
- s_axi_awready,output,写地址握手信号;
- 写数据通道 DWC
- s_axi_wdata[31:0],input,写数据;
- s_axi_wvalid,input,写数据有效信号;
- s_axi_wready,output,写数据握手信号;
- 写回复通道 RC
- s_axi_bresp[1:0],output,写回复;
- s_axi_bvalid,output,写回复有效信号;
- s_axi_bready,input,写回复握手信号;
- 读地址通道 ARC
- s_axi_araddr[11:0],input,读地址;
- s_axi_arvalid,input,读地址有效信号;
- s_axi_arready,output,读地址握手信号;
- 读数据通道 DRC
- s_axi_rdata[31:0],output,读数据;
- s_axi_rvalid,output,读数据/回复有效信号;
- s_axi_rready,input,读数据/回复握手信号;
- s_axi_rresp[1:0],output,读回复。
- 写地址通道 AWC
-
Clocks
-
s_axi_aclk,input,AXI4-Lite Interface 的工作时钟;
-
refclk,input,idelayctrl 的时钟,200M - 300M;
-
gtx_clk,input,全局 125MHz 时钟,2.5G 以太网时为 312.5MHz 时钟;
-
gtx_clk90,input,与 gtx_clk 相差 9 0 ∘ 90^\circ 90∘ 的时钟;
-
rx_mac_aclk,output,物理接口 RX 时钟,312.5 MHz at 2.5 Gb/s,125 MHz at 1 Gb/s,25 MHz at 100 Mb/s,and 2.5 MHz at 10 Mb/s;
-
tx_mac_aclk,output,物理接口 TX 时钟,312.5 MHz at 2.5 Gb/s,125 MHz at 1 Gb/s,25 MHz at 100 Mb/s,and 2.5 MHz at 10 Mb/s。
-
gtx_clk_out,output,全局 125MHz 时钟,2.5G 以太网时为 312.5MHz 时钟;
-
gtx_clk90_out,output,与 gtx_clk_out 相差 9 0 ∘ 90^\circ 90∘ 的时钟;
当为 A7 或 K7 系列芯片且接口为 RGMII 时,在 Shared Logic 配置下,可选择 IDELAYCTRL 包含在 Core 内部还是由外部给入;当共享逻辑由核心内部生成时,相比外部给入,额外多出 refclk、gtx_clk_out、gtx_clk90_out 三个时钟,而减少了 gtx_clk90 这个时钟,gtx_clk_out 和 gtx_clk90_out 可以被其他的 TEMAC 核心实例使用。
-
-
复位信号
-
s_axi_resetn,input,AXI4-Lite 接口复位,s_axi_aclk 时钟域;
-
glbl_rstn,input,全局异步复位信号,gtx_clk 时钟域;
-
rx_axi_rstn,input,RX 时钟域复位信号,s_axi_aclk 时钟域;
-
tx_axi_rstn,input,TX 时钟域复位信号,s_axi_aclk 时钟域;
-
tx_reset,output,Active High,以太网 MAC 核心发出的 TX 软复位,tx_mac_aclk 时钟域;
-
rx_reset,output,Active High,以太网 MAC 核心发出的 RX 软复位,rx_mac_aclk 时钟域。
-
- Interrupt Signals
- mac_irq,output,s_axi_aclk 时钟域,中断控制器的中断输出,目前唯一的中断源是 MDIO。
核心寄存器
通过 AXI4-Lite 可以配置核心寄存器,从而配置核心参数,实现流量控制等功能,每个寄存器占据 4 Bytes,因此寄存器地址均为 4 的倍数。以下列出几个常用的核心寄存器:
-
统计向量寄存器
一组统计接收和发送帧数量的寄存器,寄存器地址 0x200 到 0x364,详见数据手册;
-
MAC 配置寄存器
- Receiver Configuration Word 0,寄存器地址 0x400,本地 MAC 地址 的 [31:0](源地址的 [47:32] 存放在 Receiver Configuration Word 1 寄存器),用于和传入的流量控制帧(暂停帧)进行匹配,MAC 地址按小端存放,即如果 MAC 地址为 AB-CD-EF-GH-MN-PQ,则寄存器 [47:0] 中应存入 PQ MN GH EF CD AB;应注意到该寄存器的 MAC 地址不用于对接收帧的过滤,接收过滤器应当在 Unicast Address Word 寄存器进行设置;
- Receiver Configuration Word 1,寄存器地址 0x404,该寄存器的 bits15-0 存放了本地 MAC 源地址的 [47:32],bit 31 为接收器 Reset,bit30 为接收器巨型帧接收使能,bit29 为带内 FSC 使能,bit28 为接收器使能,bit27 为 VLAN 接收使能,bit26 为半双工使能(0 全双工,1 半双工),bit25 为长度/类型错误校验失能(为 1 时不执行错误检查),bit24 为控制帧长度错误校验失能(为 1 时不执行错误检查);
- Transmitter Configuration,寄存器地址 0x408,bit31 为发送器 Reset,bit30 为巨型帧发送使能,bit29 为带内 FSC 使能,bit27 为 VLAN 发送使能,bit26 为半双工使能(0 全双工,1 半双工),bit25 为帧间隙调整使能(若为 0,根据 IEEE 标准,发送机发出至少 12 长度的 IFG;若为 1,则在帧传输开始时读取端口 tx_ifg_delay 上的值,并根据帧相应地调整帧间间隙;注意,对于 TEMAC,在支持半双工时,默认 IFG=96,动态 IFG 时取 tx_ifg_delay 与 64 中的较大者,在仅支持全双工时,默认 IFG=96,动态 IFG 时取 tx_ifg_delay 和 32 中的较大者);
- Flow Control Configuration,寄存器地址 0x40C,bit30 为暂停帧发送使能(为 0 时 pause_req 信号无作用),bit29 为暂停帧接收使能(为 0 时忽略接收到的暂停帧);
- Speed Configuration,寄存器地址 0x410,bit31:30 为 MAC 速度配置,00 = 1Mbits/s,01 = 100Mbits/s,10 = 1Gbits/s,注意该寄存器的值不受 reset 影响;读取 MDIO 获取当前连接速度(或根据 RGMII inband 信号获取当前连接状态),随后修改该寄存器,以适应网络通信速度(TEMAC 核不会自动根据 rxc 速度切换速度模式);
- RX Max Frame Configuration,寄存器地址 0x414,用于指定接收帧的最大帧长,bit16 为功能使能,bit14:0 为帧长设置;
- TX Max Frame Configuration,寄存器地址 0x418,用于指定发送帧的最大帧长,bit16 为功能使能,bit14:0 为帧长设置;
- Ability Register,寄存器地址 0x4FC,RO,可获取诸如统计向量、连接速度等的使能情况;
-
MDIO 相关寄存器
-
MDIO Setup,寄存器地址 0x500,bit6 为 MDIO Enable(只有当时钟分频值非 0 且本位为 1 时,MDIO 才可用),bit5:0 为时钟分频数 CLKDIV[5:0](默认为 0),MDC 的时钟频率计算公式如下
KaTeX parse error: Expected 'EOF', got '_' at position 32: …\frac{f_\text{s_̲axi_clk}}{2\tim…
为防止 MDC 频率超出协议规范,MDC 应分频到小于 2.5MHz(考虑到这一点,s_axi_clk 不应取太高;实际上,s_axi_clk 除本处用于分频产生 MDC 外,仅用于配置端口 AXI4-Lite Interface,所以也不需要取太高的频率);注意到 CLKDIV 寄存器默认值为 0,因此必须首先配置该寄存器,才可以使用 MDIO 接口; -
MDIO Control Word,寄存器地址 0x504,bit28:24 为 PHYADDR,bit20:16 为 REGADDR,bit15:14 为 OP(该字段决定启动 MDIO 时的访问类型,01:写,10:读),bit11 为 MDIO 启动(WO,写入 1 时将启动一次 MDIO 传输),bit7 为 MDIO ready(RO,为 1 时表示 MDIO 已启动并准备进行新的传输,也用于标识先前的任务是否完成,如读取数据是否有效);
-
MDIO Write Data,寄存器地址 0x508,bit15:0 为写入数据;
-
MDIO Read Data,寄存器地址 0x50C,RO,bit16 为 MDIO Ready(为 MDIO Control Word bit7 的复制),bit15:0 为读取数据;
在使用配置接口进行 MDIO 读写时,写入流程如下:首先将待写入数据写到 MDIO Write Data 寄存器,随后对 MDIO Control Word 寄存器进行配置,设置好 PHYADDR 和 REGADDR,设置 OP 为 01,并置位 bit11 以启动 MDIO 写入事务,这将导致 MDIO ready 位被断言,并保持到写入事务结束;读取流程如下:设置 MDIO Control Word 寄存器,设置好 PHYADDR 和 REGADDR,设置 OP 为 10,并置位 bit11 以启动 MDIO 读取事务,这将导致 MDIO ready 位被断言,并保持到读取事务结束,当 MDIO ready 被重新断言时,可以从 MDIO Read Data 寄存器读取数据。
-
-
帧过滤器相关寄存器
-
Unicast Address Word 0,寄存器地址 0x700,单播地址寄存器,[31:0] 存储单播 MAC 地址的 [31:0] 位,用于和传入的 MAC 帧进行匹配,一般而言,该 MAC 地址应和本地 MAC 地址相同(即与 Receiver Configuration Word 寄存器中的相同);
-
Unicast Address Word 1,寄存器地址 0x704,[15:0] 存储单播 MAC 地址的 [47:32];
-
Frame Filter Control,寄存器地址 0x708,bit31 为混杂模式使能(为 1 时所有 MAC 帧都将被传输给接收器,而不管目的地址是什么,默认为 1),bit3:0 为 Filter Index(指定当前访问的帧过滤器,支持 16 个不同的帧过滤器);
-
Frame Filter Enable,寄存器地址 0x70C,bit0 为帧过滤器使能,默认为 1,单独作用于每一个帧过滤器;
-
Frame Filter Value,寄存器地址 0x710、0x714、…、0x74C,分别对应 Bytes 3-0、Bytes 7-4、…、Bytes 63-60,默认 bit[47:0] 为 1(这个地址其实就是 MAC 广播地址,不过实际不起作用,因为过滤器默认接收所有广播帧),其他 bits 均为 0,可配置这些寄存器以额外接收其他的单播或多播地址;
-
Frame Filter Mask Value,寄存器地址 0x750、0x754、…、0x78C,分别对应 Bytes 3-0、Bytes 7-4、…、Bytes 63-60,默认 bit[47:0] 为 1,其他 bits 均为 0,该寄存器的每一位为对应相应帧过滤器位的掩码,位为 1 时将比对接收帧与帧过滤器的对应位,若不同,该帧将无法通过过滤器;
每个帧过滤器包含 64Bytes(512bits),可用于适配任何前 64Bytes 与过滤器匹配的 MAC 帧(因此除了匹配 MAC 地址,帧过滤器还可以匹配不同协议类型甚至自定义的数据模式)。可以指定最多 16 个帧过滤器(可通过 Frame Filter Control 修改当前访问的帧过滤器以及它的使能状态,随后对 Frame Filter Value 和 Frame Filter Mask Value 寄存器进行配置,从而获得多个不同的帧过滤器)。
当混杂模式位为 1 时,所有完好的帧都被标记为 Good,当混杂模式被关闭时,只有通过了帧过滤器的完好的帧才被标记为 Good。Xilinx 建议在设置帧过滤器前,先禁用帧过滤器,以免接收到意外的帧。
rx_axis_filter_tuser 端口报告了当前帧为与过滤器的匹配情况(视为 “坏帧指示器”),当接收帧与过滤器匹配时,该信号将在 tlast 时被断言,表示该帧应当被丢弃。每额外生成一个帧过滤器,rx_axis_filter_tuser 将多生成 1 位,例如选择了 4 个帧过滤器时,将生成 5bit 位宽的 rx_axis_filter_tuser 信号,每个额外的位(高位)都是前一位的
else
情况。(手册里关于帧过滤器 rx_axis_filter_tuser 的多处表述相互矛盾,须实际测试确定其真实的工作方式)
-
TEMAC IP 例化设置
一个常见的 TEMAC 接口例化:
tri_mode_ethernet_mac_0 tri_mode_ethernet_mac_inst(
.s_axi_aclk (s_axi_aclk), // input wire s_axi_aclk
.s_axi_resetn (s_axi_resetn), // input wire s_axi_resetn
.gtx_clk (gtx_clk), // input wire gtx_clk
.gtx_clk90 (gtx_clk90), // input wire gtx_clk90
.glbl_rstn (glbl_rstn), // input wire glbl_rstn
.rx_axi_rstn (rx_axi_rstn), // input wire rx_axi_rstn
.tx_axi_rstn (tx_axi_rstn), // input wire tx_axi_rstn
.rx_statistics_vector (rx_statistics_vector), // output wire [27 : 0] rx_statistics_vector
.rx_statistics_valid (rx_statistics_valid), // output wire rx_statistics_valid
.rx_mac_aclk (rx_mac_aclk), // output wire rx_mac_aclk
.rx_reset (rx_reset), // output wire rx_reset
.rx_enable (rx_enable), // output wire rx_enable
.rx_axis_filter_tuser (rx_axis_filter_tuser), // output wire [4 : 0] rx_axis_filter_tuser
.rx_axis_mac_tdata (rx_axis_mac_tdata), // output wire [7 : 0] rx_axis_mac_tdata
.rx_axis_mac_tvalid (rx_axis_mac_tvalid), // output wire rx_axis_mac_tvalid
.rx_axis_mac_tlast (rx_axis_mac_tlast), // output wire rx_axis_mac_tlast
.rx_axis_mac_tuser (rx_axis_mac_tuser), // output wire rx_axis_mac_tuser
.tx_ifg_delay (tx_ifg_delay), // input wire [7 : 0] tx_ifg_delay
.tx_statistics_vector (tx_statistics_vector), // output wire [31 : 0] tx_statistics_vector
.tx_statistics_valid (tx_statistics_valid), // output wire tx_statistics_valid
.tx_mac_aclk (tx_mac_aclk), // output wire tx_mac_aclk
.tx_reset (tx_reset), // output wire tx_reset
.tx_enable (tx_enable), // output wire tx_enable
.tx_axis_mac_tdata (tx_axis_mac_tdata), // input wire [7 : 0] tx_axis_mac_tdata
.tx_axis_mac_tvalid (tx_axis_mac_tvalid), // input wire tx_axis_mac_tvalid
.tx_axis_mac_tlast (tx_axis_mac_tlast), // input wire tx_axis_mac_tlast
.tx_axis_mac_tuser (tx_axis_mac_tuser), // input wire [0 : 0] tx_axis_mac_tuser
.tx_axis_mac_tready (tx_axis_mac_tready), // output wire tx_axis_mac_tready
.pause_req (pause_req), // input wire pause_req
.pause_val (pause_val), // input wire [15 : 0] pause_val
.speedis100 (speedis100), // output wire speedis100
.speedis10100 (speedis10100), // output wire speedis10100
.rgmii_txd (rgmii_txd), // output wire [3 : 0] rgmii_txd
.rgmii_tx_ctl (rgmii_tx_ctl), // output wire rgmii_tx_ctl
.rgmii_txc (rgmii_txc), // output wire rgmii_txc
.rgmii_rxd (rgmii_rxd), // input wire [3 : 0] rgmii_rxd
.rgmii_rx_ctl (rgmii_rx_ctl), // input wire rgmii_rx_ctl
.rgmii_rxc (rgmii_rxc), // input wire rgmii_rxc
.inband_link_status (inband_link_status), // output wire inband_link_status
.inband_clock_speed (inband_clock_speed), // output wire [1 : 0] inband_clock_speed
.inband_duplex_status (inband_duplex_status), // output wire inband_duplex_status
.mdio (mdio), // inout wire mdio
.mdc (mdc), // output wire mdc
.s_axi_awaddr (s_axi_awaddr), // input wire [11 : 0] s_axi_awaddr
.s_axi_awvalid (s_axi_awvalid), // input wire s_axi_awvalid
.s_axi_awready (s_axi_awready), // output wire s_axi_awready
.s_axi_wdata (s_axi_wdata), // input wire [31 : 0] s_axi_wdata
.s_axi_wvalid (s_axi_wvalid), // input wire s_axi_wvalid
.s_axi_wready (s_axi_wready), // output wire s_axi_wready
.s_axi_bresp (s_axi_bresp), // output wire [1 : 0] s_axi_bresp
.s_axi_bvalid (s_axi_bvalid), // output wire s_axi_bvalid
.s_axi_bready (s_axi_bready), // input wire s_axi_bready
.s_axi_araddr (s_axi_araddr), // input wire [11 : 0] s_axi_araddr
.s_axi_arvalid (s_axi_arvalid), // input wire s_axi_arvalid
.s_axi_arready (s_axi_arready), // output wire s_axi_arready
.s_axi_rdata (s_axi_rdata), // output wire [31 : 0] s_axi_rdata
.s_axi_rresp (s_axi_rresp), // output wire [1 : 0] s_axi_rresp
.s_axi_rvalid (s_axi_rvalid), // output wire s_axi_rvalid
.s_axi_rready (s_axi_rready), // input wire s_axi_rready
.mac_irq (mac_irq) // output wire mac_irq
);
该 IP 的配置如下:
该页配置 TEMAC 的工作速度,配置为 1G 时,后面可以继续选择对 10M/100M 的支持,而选择 2.5G 时则仅支持这一个速度。我们芯片是千兆以太网芯片,因此选择 1G。
PHY 接口按 PHY 芯片接口形式选择,我的千兆以太网芯片是 RGMII 接口的;MAC Speed 选择 Tri Speed 以支持 10M/100M/1000M 三速以太网;Management Type 选择 AXI4-Lite 接口形式,并配置合理的 AXI4-Lite 时钟(如前所说,该时钟不应取太高,以避免超过 MDC 频率限制,因此这里配置为 10M),以及可选择是否启用 MDIO 接口。
第三页是配置共享逻辑是否包含在核心内,这里我们保持默认,由外部给入 gtx_clk 和 gtx_clk90。
最后一页,默认不勾选 Half Duplex,即是全双工模式;可选择是否启用帧过滤器以及配置过滤器的数目,这里我们保持默认,生成 4 个过滤器;统计向量可选 32bit 或 64bit,如果不需要帧计数器,可以不勾选生成统计向量计数器。
TEMAC 需要许可证才能生成比特流文件,否则只能进行仿真测试。许可证可以到 AMD 官网免费申请(限时许可证)。
TEMAC 配置及环回测试
收发时序
接收器时序如下:
1000M 速度下,rx_mac_aclk 为 125MHz,tvalid 在每个有效数据周期为高;100M 和 10M 速度下,rx_mac_aclk 为 25MHz/2.5MHz,tvalid 在每个有效数据周期只有一半为高(这是由于此时每个 clk 仅传输 4bit,因此单个 8bit 数据需要 2 个 clk 才能完成传输);
对于 tlast 信号,由于需要进行 FSC 校验,因此实际上 tlast 以及其对应的 tvalid 会延迟几个周期才出现,如上图所示。当帧发生错误时,tuser 将在 tlast 同一周期被断言,以指示该帧应被丢弃。
发射器时序如下:
在 1000M 下,RGMII/GMII/MII 三种接口下,其时序均如上图 Fig 3-22 所示,tx_mac_aclk 为 125M,注意 tready 在对前两个数据做出回应后,会进入一段持续数个周期的非应答状态;在 MII/GMII 接口下,100M、10M 速度下,tx_mac_aclk 分别为 25M、2.5M,因此每个数据占据 2 个时钟周期,tready 相应地也只有一半时间为高;而对于 RGMII 接口,25M/2.5M 速度下,tx_mac_aclk 保持 125M,相应的数据时钟周期分别为 10、100,tready 因此每 10、100 个 clk 才给出一次,但对于最开始的两个数据,会连续发出两个 tready,随后进入持续数个周期的非应答状态。
代码实现
这篇文档比较长了,如何配置 TEMAC 以及进行自动协商三速环回测试(Verilog 实现),就放到下一篇博客进行介绍。
- 参考文献
pg051_vivado_tri_mode_eth_mac.pdf