Tri Mode Ethernet MAC IP核详解

本文对 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,统计向量有效标志。
  • 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,统计向量有效标志。
  • 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,读回复。
  • 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 接口例化:

verilog 复制代码
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

相关推荐
C++忠实粉丝3 小时前
计算机网络socket编程(5)_TCP网络编程实现echo_server
网络·c++·网络协议·tcp/ip·计算机网络·算法
疯狂吧小飞牛5 小时前
openssl颁发包含主题替代名的证书–SAN
运维·服务器·网络
水饺编程5 小时前
【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-32
linux·嵌入式硬件·fpga开发·硬件架构
Wang's Blog5 小时前
RocketMQ: Broker 使用指南
服务器·网络·rocketmq
北'辰6 小时前
使用ENSP实现DHCP
运维·网络
北京太速科技股份有限公司6 小时前
太速科技-232-基于FMC的2收2发TLK2711子卡
科技·fpga开发
丁总学Java7 小时前
netstat -tuln | grep 27017(显示所有监听状态的 TCP 和 UDP 端口,并且以数字形式显示地址和端口号)
网络协议·tcp/ip·udp
黑客K-ing7 小时前
开源网络安全检测工具——伏羲 Fuxi-Scanner
网络·数据库·web安全
网络安全-老纪8 小时前
AWS云安全
网络·云计算·aws