当前位置: 首页 > news >正文

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

相关文章:

Tri Mode Ethernet MAC IP核详解

本文对 Vivado 的三速 MAC IP 核(Tri Mode Ethernet MAC,TEMAC)进行介绍。 在自行实现三速以太网 MAC 控制器时,GMII/RGMII 接口可以通过 IDDR、ODDR 原语实现,然而实际使用中自己实现的模块性能不是很稳定&#xff08…...

【U盘车载音乐】某宝198的3068首车载专用音乐合集【高音质】24G

「【U盘车载音乐】某宝198的3068首车载专用音乐合集【高音质】24G」 复制下方口令,打开最新版「夸克APP」即可获取保存(防止和谐!!!) 口令: 动作懿范鉴真渡多好备用口令: /~19dc35…...

android 实现答题功能

一、效果 二、实现思路 1、界面实现 实现起来其实不难,首先我们可以看到,界面是由答题进度、题目、选项ABCD组成,现在就是要考虑实现方式,答题进度可以使用Textviewprogressbar实现,题目直接使用Textview,…...

JSONP处理跨域请求

JSONP 背景 由于浏览器存在安全策略,所以当访问的请求中的协议、域名、端口其中一个与本站不同时就会形成跨域,这里介绍一种比较简单的方案——jsonp。 原理 浏览器对 script、img这些带有src属性的的标签在发送请求时是不会触发跨域的校验&#xff…...

栈的应用,力扣394.字符串解码力扣946.验证栈序列力扣429.N叉树的层序遍历力扣103.二叉树的锯齿形层序遍历

目录 力扣394.字符串解码 力扣946.验证栈序列 力扣429.N叉树的层序遍历 力扣103.二叉树的锯齿形层序遍历 力扣394.字符串解码 看见括号,由内而外,转向用栈解决。使用两个栈处理,一个用String,一个用Integer 遇到数字:提取数字放入到数字栈…...

华为手机启用ADB无线调试功能

打开开发者模式,勾选USB调试,和“仅充电”模式下允许ADB调试 确认 设置添加adb路径到PATH变量 使用adb查看安卓设置 切换为无线模式: 查看手机IP...

HTML 元素类型介绍

目录 1. 块级元素(Block-level Elements) 2. 行级元素(Inline Elements) 3. 行内块级元素(Inline-block Elements) 4. 表格相关元素 5. 列表相关元素 6. 表单相关元素 示例代码 示例效果 ​编辑 …...

前端反向代理的配置和實現

反向代理是位於客戶端和服務器之間的一個中間層,它代表客戶端向伺服器發起請求,然後將伺服器的回應返回給客戶端。與傳統的正向代理不同,反向代理是由伺服器端配置的,客戶端通常不知道它的存在。在前端開發中,反向代理…...

日志分析工具

一、nginx_log_analysis工具 1、工具下载,http://linux5588.blog.51cto.com/,它是用python语言写的,只是用来分析nginx日志,它的输出比较简单,以IP为主,可以查看每个IP的访问的流量,次数&#…...

python: Serialize and Deserialize complex JSON using jsonpickle

# encoding: utf-8 # 版权所有 2024 ©涂聚文有限公司 # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # Serialize and Deserialize complex JSON in Python # 描述:pip install jsonpickle https://github.com/jsonpi…...

【分布式锁解决超卖问题】setnx实现

目录 使用场景的描述 并发安全问题 悲观锁与乐观锁问题 一人一单的问题 服务器负载均衡问题 分布式锁 分布式锁的实现 获取锁 释放锁 实现思路 误删情况的分析 解决误删的方法 代码优化 分布式锁的原子性分析 文章代码地址:分布式锁1.0 使用场景的描述 今天的主人…...

【MySQL实战45讲笔记】基础篇——事务隔离

系列文章 基础篇——MySQL 的基础架构 基础篇——redo log 和 binlog 目录 系列文章1. 事务隔离1.1 隔离性与隔离级别1.2 如何实现事务隔离1.3 事务的启动方式1.4 思考: 使用什么方案来避免长事务 1. 事务隔离 简单来说,事务就是要保证一组数据库操作&…...

RFdiffusion calculate_igso3函数解读

calculate_igso3 函数旨在对 IGSO(3) 分布的概率密度函数 (PDF)、累积分布函数 (CDF)、以及相关统计量进行数值近似计算,特别用于预计算以加速后续操作(例如采样、反向扩散等)。 calculate_igso3函数源代码: def calculate_igso3(*, num_sigma, num_omega, min_sigma, ma…...

Vue3 + Vite 项目引入 postcss + tailwindcss

一、PostCSS 1. 简介 PostCSS 是一个强大的 CSS 处理工具,它本身是一个工具库,但其核心功能是通过插件扩展,来对 CSS 进行编译、转换和优化。它适用于现代 CSS 开发,提供更灵活、高效的方式来处理样式表。 2. 主要作用 增强 CS…...

AI Large Language Model

AI 的 Large Language model LLM , 大语言模型: 是AI的模型,专门设计用来处理自然语言相关任务。它们通过深度学习和庞大的训练数据集,在理解和生成自然语言文本方面表现出色。常见的 LLM 包括 OpenAI 的 GPT 系列、Google 的 PaLM 和 Meta…...

Linux系统性能优化技巧

系统性能优化 在当今的信息技术领域,Linux系统的性能优化变得越来越重要。随着Linux操作系统的广泛应用,从桌面环境到大型服务器集群,性能优化不仅可以提升系统的响应速度和吞吐量,还能降低资源消耗,从而延长硬件使用…...

基于CNN+RNNs(LSTM, GRU)的红点位置检测(pytorch)

1 项目背景 需要在图片精确识别三跟红线所在的位置,并输出这三个像素的位置。 其中,每跟红线占据不止一个像素,并且像素颜色也并不是饱和度和亮度极高的红黑配色,每个红线放大后可能是这样的。 而我们的目标是精确输出每个红点的…...

【AI系统】GPU 架构回顾(从2018年-2024年)

Turing 架构 2018 年 Turing 图灵架构发布,采用 TSMC 12 nm 工艺,总共 18.6 亿个晶体管。在 PC 游戏、专业图形应用程序和深度学习推理方面,效率和性能都取得了重大进步。相比上一代 Volta 架构主要更新了 Tensor Core(专门为执行…...

Vue 内置组件 keep-alive 中 LRU 缓存淘汰策略和实现

LRU(Least Recently Used,最近最少使用)是通过记录缓存项的访问顺序来决定淘汰的策略:当缓存满时,移除最久未被使用的项。 核心概念: 缓存存储:使用 Map 存储键值对,用于快速访问缓…...

联邦学习安全聚合算法综述(论文解析)以及如何确定自己研究方向的方法

自己写相关论文的方法: 可以重点看看综述类论文的未来研究方向和引言中前人已经做过的内容 联邦学习安全聚合算法综述 auth:江萍 1 通讯作者 李芯蕊 1 赵晓阳 2 杭永凯 摘要 摘要:随着深度学习技术的发展,人工智能在社会的各个方面有着重要…...

【JAVA 笔记】12 带有数据库文件的完整的JDBC访问例子,命令行界面

【JAVA 笔记】12 带有数据库文件的完整的JDBC访问例子,命令行界面 代码结构解析 1. 导入必要的包 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.sql.PreparedStatement; impo…...

基于java+SpringBoot+Vue的在线宠物用品交易网站设计与实现

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis Maven mysql5.7或8.0等等组成&#x…...

智慧社区管理系统平台提升物业运营效率与用户体验

内容概要 智慧社区管理系统平台是一个集成了多项功能的综合性解决方案,旨在通过先进的技术手段提升物业管理的效率和居民的生活质量。该平台不仅关注物业运营的各个方面,还强调用户体验的重要性。随着科技的发展,社区管理方式正发生着翻天覆…...

el-table-column自动生成序号在序号前插入图标

实现效果&#xff1a; 代码如下&#xff1a; 在el-table里加入这个就可以了&#xff0c;需要拿到值可以用scope.$index ​​​​​​​<el-table-column type"index" label"序号" show-overflow-tooltip"true" min-width"40">…...

深度学习之目标检测的常用标注工具

1 LabelImg ​ LabelImg 是一款开源的图像标注工具&#xff0c;标签可用于分类和目标检测&#xff0c;它是用 Python 编写的&#xff0c;并使用Qt作为其图形界面&#xff0c;简单好用。注释以 PASCAL VOC 格式保存为 XML 文件&#xff0c;这是 ImageNet 使用的格式。 此外&…...

「Mac玩转仓颉内测版21」基础篇1 - 仓颉程序的基本组成

本篇将系统介绍Cangjie编程语言中程序的基本组成部分&#xff0c;涵盖 main 函数的定义、包与模块的使用、变量类型、作用域和代码结构原则&#xff0c;帮助开发者理解Cangjie程序的整体结构。 关键词 程序入口点main函数包与模块变量类型与作用域值类型与引用类型代码结构与规…...

【计算机网络】解决bind error

服务器有时可以立即重启&#xff0c;有时候无法立即重启 — bind error 首先要知道&#xff1a;四次挥手动作完成之后&#xff0c;主动断开连接的一方要维持一段时间的TIME_WAIT bind error原因&#xff1a;因为是服务器主动断开的&#xff0c;所以服务器要去维持TIME_WAIT状…...

【SVN和GIT】版本控制系统详细下载使用教程

文章目录 ** 参考文章一、什么是SVN和GIT二、软件使用介绍1 SVN安装1.1 服务端SVN下载地址1.2 客户端SVN下载地址2 SVN使用2.1 服务端SVN基础使用2.1.1 创建存储库和用户成员2.1.2 为存储库添加访问人员2.2 客户端SVN基础使用2.2.1 在本地下载库中的内容2.2.2 版本文件操作--更…...

初识 Pynecone:构建现代化 Web 应用的 Python 框架

初识 Pynecone&#xff1a;构建现代化 Web 应用的 Python 框架 引言 在 Web 开发的世界里&#xff0c;Python 是后端开发的常客&#xff0c;但如果想用 Python 直接构建现代化的前端应用会怎样&#xff1f;这正是 Pynecone 框架的用武之地&#xff01;Pynecone 是一个全栈 Pyt…...

Go-RPC关键指标分析与企业实践

1.稳定性-保障策略 熔断&#xff1a;保护调用方 限流&#xff1a;保护被调用方 超时控制&#xff1a;避免浪费 2.稳定性-请求成功率&#xff08;用重复发送 负载均衡&#xff09; 3.稳定性-长尾请求&#xff08;用备份请求&#xff09; 4.稳定性-注册中间件 易用性&#xff1a…...

社交电商专业赋能高校教育与产业协同发展:定制开发AI智能名片及2+1链动商城小程序的创新驱动

摘要&#xff1a;本文围绕社交电商有望成为高校常态专业这一趋势展开深入探讨&#xff0c;剖析国家政策认可下其学科发展前景&#xff0c;着重阐述在专业建设进程中面临的师资短缺及实践教学难题。通过引入定制开发AI智能名片与21链动商城小程序&#xff0c;探究如何借助这些新…...

Ubuntu下安装Qt

1.如图1所示&#xff0c;在Index of /archive上下载安装包&#xff1b; 图1 2.将图1安装包下载好之后&#xff0c;通过共享文件夹的方式拷贝到ubutntu&#xff0c;如图2所示&#xff1b; 图2 3.如图3所示&#xff0c;执行chmod x qt-creator-opensource-linux-x86_64-10.0.2.…...

《FreeRTOS任务删除篇》

任务删除函数 源码1. 进入临界区1.1 第一步1.2 第二步1.3 第三步1.4 第四步 2. 获取待删除任务的任务控制块TCB3. 从就绪/延迟列表中删除任务4. 从事件列表中删除任务5. 如果待删除任务是当前运行的任务6. 如果待删除任务是其它任务7. 退出临界区7.1 第一步7.2 第二步7.3 第三步…...

取电快充协议芯片,支持全协议、内部集成LDO支持从UART串口读取电压电流消息

H004D 是一款支持全协议的受电端诱骗取电协议芯片&#xff0c;支持宽电压输入 3.3V~30V&#xff0c;芯片内部集成LDO&#xff0c;可输出 3.3V电压, 支持 通过UART 串口读取电压电流&#xff0c;支持定制功能&#xff0c;芯片采用QFN_20封装&#xff0c;线路简单&#xff0c;芯片…...

Linux:自定义Shell

本文旨在通过自己完成一个简单的Shell来帮助理解命令行Shell这个程序。 目录 一、输出“提示” 二、获取输入 三、切割字符串 四、执行指令 1.子进程替换 2.内建指令 一、输出“提示” 这个项目基于虚拟机Ubuntu22.04.5实现。 打开终端界面如图所示。 其中。 之前&#x…...

git 基础之 merge 和 rebase 的比较

在团队软件开发过程中&#xff0c;代码合并是一个基本且频繁执行的任务。 Git 提供了多种合并代码的策略&#xff0c;其中最常用的是 merge 和 rebase。 尽管二者的终极目标是相同的——整合代码变更——它们的方法和推荐的使用场景却有所区别。本文将详细介绍和比较这两种策…...

pve 磁盘选错位置修改

选中磁盘选择磁盘操作&#xff0c;移动存储 改到你要迁移的位置&#xff0c;迁移后原来的文件如果没选择删除源不会删除&#xff0c;需要确认数据没问题后选择相应的文件&#xff0c;如果有快照&#xff0c;快照可能也需要提前删除&#xff0c;删除前请做好备份。...

C语言第十二周课——有趣的小程序

目录 1.我是猪关机程序 1.1dos命令&#xff08;强制关机&#xff09; 1.2思路 1.3源码 2.猜数字 2.1介绍 2.2思路 2.3源码 1.我是猪关机程序 效果:运行程序后电脑在60s后关机&#xff0c;如果输入“我是猪”则取消关机&#xff1b;如果输入“你是猪”则立即关机&…...

【Linux学习】【Ubuntu入门】1-7 ubuntu下磁盘管理

1.准备一个U盘或者SD卡&#xff08;插上读卡器&#xff09;&#xff0c;将U盘插入主机电脑&#xff0c;右键点击属性&#xff0c;查看U盘的文件系统确保是FAT32格式 2.右键单击ubuntu右下角图标&#xff0c;将U盘与虚拟机连接 参考链接 3. Ubuntu磁盘文件&#xff1a;/dev/s…...

解决Windows + Chrome 使用Blob下载大文件时,部分情况下报错net:ERR_FAILED 200 (OK)的问题

背景&#xff1a; 部分线上用户反馈&#xff0c;下载文件会报错&#xff0c;但重启电脑又好了。测试无法复现。遂远程客户&#xff0c;发现在下载超过一定阈值大小的文件时&#xff0c;会报错。 但直接点击下载链接&#xff0c;可以正常下载 查阅代码&#xff0c;以前的写法是…...

SpringBoot多文件上传

多文件上传是在单文件上传的基础上修改而来&#xff0c;不了解单文件上传可以参考上一篇。以下在将修改部分展示如下&#xff1a; 一、修改upload.html文件&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title&g…...

Jenkins修改LOGO

重启看的LOGO和登录页面左上角的LOGO 进入LOGO存在的目录 [roottest-server01 svgs]# pwd /opt/jenkins_data/war/images/svgs [roottest-server01 svgs]# ll logo.svg -rw-r--r-- 1 jenkins jenkins 29819 Oct 21 10:58 logo.svg #jenkins_data目录是我挂载到了/opt目录&…...

幼儿园管理系统|Java|SSM|Vue| 前后端分离

【重要①】前后端源码万字文档部署文档 【重要②】正版源码有问题包售后 【包含内容】 【一】项目提供非常完整的源码注释 【二】相关技术栈文档 【三】源码讲解视频 【其它服务】 【一】可以提供远程部署安装&#xff0c;包扩环境 【…...

Unity 实现界面拖拽功能的脚本,通过IDragHandler 实现

using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems;namespace Assets.Scripts._1024 {class EVENTdome : MonoBehaviour, IPointerDownHandler, IBeginDragHandler, IDragHandler{//Unity 事件处理的几种方式//1 通过编辑…...

【042A】基于51单片机门禁系统【Proteus仿真+Keil程序+报告+原理图】

☆、设计硬件组成&#xff1a;51单片机最小系统RFID读卡器继电器蜂鸣器LED灯。 1、设计采用STC89C51/52、AT89C51/52、AT89S51/52作为主控芯片&#xff1b; 2、通过RC522读卡器读取IC卡信息&#xff0c;信息匹配继电器吸合门锁打开&#xff1b; 3、可通过上位机对IC卡进行注…...

数据库中的增删改查操作、聚合函数、内置函数、分组查询

数据库中的增删改查操作、聚合函数、内置函数、分组查询 CRUD简介Create 新增语法示例单⾏数据全列插⼊单⾏数据指定列插⼊多⾏数据指定列插⼊ Retrieve 检索语法⽰例构造数据 Select全列查询指定列查询查询字段为表达式为查询结果指定别名语法⽰例 结果去重查询 Order by 排序…...

递归------深度优先搜索

深度优先搜索&#xff08;Depth-First Search&#xff0c;简称DFS&#xff09;是一种用于遍历或搜索树或图的算法。它从一个顶点开始&#xff0c;尽可能深地搜索树的分支。深度优先搜索沿着一条路径深入&#xff0c;直到无法继续为止&#xff0c;然后回溯并尝试其他路径。这种搜…...

三十一、构建完善微服务——API 网关

一、API 网关基础 系统拆分为微服务后&#xff0c;内部的微服务之间是互联互通的&#xff0c;相互之间的访问都是点对点的。如果外部系统想调用系统的某个功能&#xff0c;也采取点对点的方式&#xff0c;则外部系统会非常“头大”。因为在外部系统看来&#xff0c;它不需要也没…...

【大语言模型】ACL2024论文-20 SCIMON:面向新颖性的科学启示机器优化

【大语言模型】ACL2024论文-20 SCIMON&#xff1a;面向新颖性的科学启示机器优化 目录 文章目录 【大语言模型】ACL2024论文-20 SCIMON&#xff1a;面向新颖性的科学启示机器优化目录摘要研究背景问题与挑战如何解决创新点算法模型实验效果推荐阅读指数&#xff1a;★★★★☆ …...

GRU (门控循环单元 - 基于RNN - 简化LSTM又快又好 - 体现注意力的思想) + 代码实现 —— 笔记3.5《动手学深度学习》

目录 0. 前言 1. 门控隐状态 1.1 重置门和更新门 1.2 候选隐状态 1.3 隐状态 2. 从零开始实现 2.1 初始化模型参数 2.2 定义模型 2.3 训练与预测 3 简洁实现 4. 小结 0. 前言 课程全部代码&#xff08;pytorch版&#xff09;已上传到附件看懂上一篇RNN的所有细节&am…...