Tri Mode Ethernet MAC IP核详解

embedded/2024/11/28 17:42:08/

  本文对 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 接口例化:

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


http://www.ppmy.cn/embedded/141229.html

相关文章

读书笔记_《创华为.任正非传》_精华书摘

人生经历 43岁,开始创建华为 爷爷:金华火腿乡间厨师 父亲: 1910年生,北平民大经济系读书->职业学校任教->国民党兵工厂会计,组织读书会(读书会后来有很多人在新中国成立后成为高级干部。) 母亲: 高中毕业,乡村教师&#xf…

IAR Embedded Workbench for Arm 使用技巧

1 C-RUN C-RUN直接集成在IAR Embedded Workbench for Arm中,在代码执行过程中进行动态代码分析,及时发现运行时发现的实际错误。   C-RUN可以检查算术问题、边界问题和堆完整性,各个功能特点: 算术问题: 包括溢出、…

强制大模型输出json

一个是api里面有一个return_json的选项设置为True. 这个要看大模型厂商是否提供这个选项了.是利用提示词: 返回信息格式为: json格式, 包含一个字段code用整数1-4表示函数编号, 一个字段input用一个字符串表示函数的输入参数. 请只返回json, 返回其他数据都会得到批评 这个句子…

市面上好用的AIPPT-API接口

文多多 AiPPT | 一键搞定PPT 文多多 AiPPT | 一键搞定PPT文多多AiPPT,一键搞定PPT。AI根据主题、文档、网址智能生成PPT文档,同时支持在线编辑、美化、排版、导出、一键动效、自动生成演讲稿等功能,告别工作烦恼!https://docmee.…

群论入门笔记

群的基本定义 群由一组元素 G 和一个运算(常用符号包括 ,x , 或 ∗)组成。 封闭性 对于任意两个元素 x,y∈G,运算 x * y 的结果仍然属于集合 G,即: ∀x,y∈G,x∗y∈G. 结合律 对于任意 a,b,c∈G&…

scrapy框架学习

scrapy框架学习 Spider(蜘蛛): 详细说明:Spiders是Scrapy框架中用户自定义的类,它们是爬取过程的起点。每个Spider定义了爬取的逻辑,包括起始URLs、如何跟踪链接以及如何解析页面内容。Spiders通常会生成两种输出:提取的数据(通常以Item对象的形式)和新的请求(Reques…

R安装rgdal报错 解决办法

尝试了网上很多办法,不知道哪一步解决了,记录一下所有步骤: 1. 尝试github安装 options(repos c(CRAN "https://mirrors.tuna.tsinghua.edu.cn/CRAN/"))install.packages("devtools")library(devtools)devtools::in…

设计模式——装饰器模式

装饰器模式是结构型设计模式,在Python中有一个非常著名的装饰器wrapper,它的实现方法就是使用了该设计模式,装饰器可以修饰类也可以修饰函数。 从类的设计上说,他的本质是在不定义子类的情况下动态的给对象添加一些额外的功能。举…