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

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.mzph.cn/bicheng/61754.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目实战:基于Vue3实现一个小相册

相册的示例效果图 注意看注释... CSS部分&#xff1a; <style>/* 伪元素选择器&#xff0c;用于在具有clear_ele类的元素内部的末尾添加一个新的元素 */.clear_ele::after{ content: ""; /* 这个伪元素的内容属性必须有 *//* 块级元素&#xff0c;便于占据一…

STM32F4----DCA数字量转换成模拟量

STM32F4----DCA数字量转换成模拟量 基本原理 上一节讲诉了ADC的具体原理与程序搭建https://blog.csdn.net/qq_35970934/article/details/143999874?spm1001.2014.3001.5501。这节讲DAC的原理和程序&#xff0c;在实际应用中&#xff0c;我们经常需要调节电压的输出大小&…

Linux下通过DRM操作屏幕,发生行对齐 (stride)问题

前言 Linux下使用LVGL操作屏幕&#xff0c;屏幕尺寸是[280*1424]&#xff0c;不管如何设置LVGL的参数&#xff0c;屏幕的显示均为花屏&#xff0c;能看到有图像显示&#xff0c;但是图像是行错乱的。 ubuntu桌面系统显示正常 打印DRM看输出 drm: 280x1424 (0mm X 0mm) pixel …

HTMLCSS:比赛记分卡

效果演示 这段 HTML 和 CSS 代码创建了一个卡片式的体育比赛信息展示组件&#xff0c;用于显示篮球比赛的两个队伍名称、比赛时间、比分以及一些装饰性的视觉元素。 HTML <div class"card"><div data-status"inprogress" class"teams"…

Paper -- 3D建筑模型生成 -- GABLE: 基于高分辨率卫星影像的全国尺度精细3D建筑模型

基本信息 论文题目: GABLE: A first fine-grained 3D building model of China on a national scale from very high resolution satellite imagery 中文题目: GABLE: 基于高分辨率卫星影像的全国尺度精细3D建筑模型 作者及单位: – 多数作者来自中国科学院空间信息研究所&…

高级java每日一道面试题-2024年11月21日-数据结构篇-红黑树有哪几个特征?

如果有遗漏,评论区告诉我进行补充 面试官: 红黑树有哪几个特征? 我回答: 红黑树&#xff08;Red-Black Tree&#xff09;是一种自平衡二叉查找树&#xff08;Self-Balancing Binary Search Tree&#xff09;&#xff0c;它在插入和删除操作后能够自动保持树的高度平衡。红黑…

蓝桥杯嵌入式再学习(2)基础框架的构建

1&#xff1a;打开工程以后我们需要进行一些配置如图&#xff1a; 第一步&#xff1a;将core里面的对勾取消掉 勾选Microlib 优化等级选择level 0 将我们自己的文件夹添加到路径里面去 这个样子我们就基本将框架搭建好了我们然后需要编写各个底层的驱动了

矩阵/矩阵乘法/特征征/特征向量的讲解

线性代数里有很多的概念&#xff0c;很多概念是有几何意义的&#xff0c;了解了几何意义可能会更好的理解各种概念及其相互之间的关系。 矩阵&#xff1a; 矩阵是一个变换&#xff0c;一个坐标系到另一个坐标第的变换。矩阵里的各个参数&#xff0c;代表了如何进行变换。 矩阵…

Flink Transformation - 转换算子全面解析

Flink Transformation - 转换算子全面解析 一、引言 在Flink的数据流处理中&#xff0c;转换算子&#xff08;Transformation Operators&#xff09;扮演着极为关键的角色。它们能够对输入的数据流进行各种处理和转换操作&#xff0c;以满足不同的业务需求。本文将详细介绍Fl…

Easyexcel(5-自定义列宽)

相关文章链接 Easyexcel&#xff08;1-注解使用&#xff09;Easyexcel&#xff08;2-文件读取&#xff09;Easyexcel&#xff08;3-文件导出&#xff09;Easyexcel&#xff08;4-模板文件&#xff09;Easyexcel&#xff08;5-自定义列宽&#xff09; 注解 ColumnWidth Data…

C++ 中的模板特化和偏特化

C中的模板特化和偏特化是C模板编程中的两种重要技术&#xff0c;用于在特定情况下提供更优化的代码实现。‌ 模板特化 模板特化是指在模板参数为特定类型时&#xff0c;提供一种特定的实现方式。模板特化分为‌函数模板特化‌和‌类模板特化‌。 函数模板特化‌&#xff1a; …

短信发送业务

Override public void sendCode(String phone) {// 通过正则判断手机号的合法性if (!phone.matches("^1[3-9]\\d{9}$")) {throw new RuntimeException("请输入合法的手机号");}// 判断3次// String.format("code:%s", phone)String numKey Stri…

1+X应急响应(网络)文件包含漏洞:

常见网络攻击-文件包含漏洞&命令执行漏洞&#xff1a; 文件包含漏洞简介&#xff1a; 分析漏洞产生的原因&#xff1a; 四个函数&#xff1a; 产生漏洞的原因&#xff1a; 漏洞利用条件&#xff1a; 文件包含&#xff1a; 漏洞分类&#xff1a; 本地文件包含&#xff1a; …

深入实践 Shell 脚本编程:高效自动化操作指南

一、什么是 Shell 脚本&#xff1f; Shell 脚本是一种用 Shell 编写的脚本程序&#xff0c;用于执行一系列的命令。它是 Linux/Unix 系统中自动化管理任务的利器&#xff0c;能够显著提升工作效率&#xff0c;特别适合批量处理文件、监控系统状态、自动部署等任务。 二、Shell…

HTML5 SVG

HTML5 SVG SVG(Scalable Vector Graphics)是一种基于XML的图像格式,用于在网页上创建矢量图形。与传统的位图图像(如PNG和JPEG)不同,SVG图像可以无限放大而不失真,因为它们是由直线和曲线定义的数学路径,而不是像素点。HTML5支持直接在网页中嵌入SVG,使得网页设计更加…

Flutter:SlideTransition位移动画,Interval动画延迟

配置vsync&#xff0c;需要实现一下with SingleTickerProviderStateMixinclass _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin{// 定义 AnimationControllerlate AnimationController _controller;overridevoid initState() {super.…

gitlab:使用脚本批量下载项目,实现全项目检索

目的 当需要知道gitlab中所有项目是否存在某段代码时&#xff0c;gitlab免费版只提供了当个项目内的检索&#xff0c;当项目过多时一个个查太过繁琐。下面通过 GitLab API 将指定 Group 下的所有项目克隆到本地。此脚本会自动获取项目列表并逐一克隆它们&#xff0c;再在本地进…

【Android】android compat理解

1&#xff0c;前提 即便是在同一手机上安装的不同apk&#xff0c;其编译的apk不同&#xff0c;也会导致行为上的差异。如SDK34有限制后台启动&#xff0c;但如果安装的apk所依赖的sdk是33&#xff0c;则不会表现出此差异。这是如何实现的呢&#xff1f;其实&#xff0c;本质是…

使用php和Xunsearch提升音乐网站的歌曲搜索效果

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…

电脑自动关机时间如何定?Wise Auto Shutdown 设置关机教程

在日常使用电脑的过程中&#xff0c;有时我们需要让电脑在特定的时间自动关机&#xff0c;比如在下载大文件完成后、执行长时间的任务结束时&#xff0c;或者只是单纯想在某个预定时间让电脑自动关闭以节省能源。这时候&#xff0c;Wise Auto Shutdown 这款软件就能派上大用场了…