open_prj24_以太网

MDIO读写测试

概述

a)以太网(Ethernet)是当今现有局域网采用的最通用的通信协议标准,该标准定义了在局域网中采用的电缆类型和信号处理方法。以太网凭借其成本低、通信速率高、抗干扰性强等优点被广泛应用在网络远程监控、交换机、工业自动化等对通信速率要求较高的场合。

b)以太网的分类有标准以太网(10Mbit/s)、快速以太网(100Mbit/s)、千兆以太网(1000Mbit/s)。随着以太网技术的飞速发展,市场上也出现了万兆以太网(10Gbit/s),它扩展了IEEE802.3协议和MAC规范,使其技术支持10Gbit/s的传输速率。在实际应用中,千兆以太网理论上最高通信速率为1000Mbit/s,可以胜任大部分的使用场景。

c)以太网通信离不开连接端口的支持,网络数据连接的端口就是以太网接口。以太网接口类型有RJ45接口、RJ11接口(电话线接口)、SC光纤接口等。其中RJ45接口是我们现在最常见的网络设备接口(如:电脑网口),我们开发板使用的就是这种接口。RJ45接口俗称"水晶头",专业术语为RJ45连接器,由插头(接头、水晶头)和插座(母座)组成,属于双绞线以太网接口类型。RJ45插头只能沿固定方向插入,设有一个塑料弹片与RJ45插槽卡住以防止脱落。

d)

从硬件的角度来说,以太网接口电路主要由MAC(Media Access Control)控制器和物理层接口PHY(Physical Layer,PHY)两大部分构成。MAC指媒体访问控制子层协议,它和PHY接口既可以整合到单颗芯片内,也可以独立分开,对于本次设计来说,MAC控制器由FPGA实现,PHY芯片指开发板板载的以太网芯片。

e)PHY在发送数据的时候,接收MAC发过来的数据(对PHY来说,没有帧的概念,都是数据而不管什么地址,数据还是CRC),把并行数据转化为串行流数据,按照物理层的编码规则把数据编码转换为模拟信号发送出去,接收数据时的流程反之。PHY还提供了和对端设备连接的重要功能,并通过LED灯显示出自己目前的连接状态和工作状态。当我们给网卡接入网线的时候,PHY芯片不断发出脉冲信号来检测对端是否有设备,它们通过标准的语言交流,互相协商并确定连接速度、双工模式、是否采用流控等。通常情况下,协商的结果是两个设备中能同时支持的最大速度和最好的双工模式。这个技术被称为Auto Negotiation,即自协商。

MDIO接口

a)MAC和PHY芯片有一个配置接口,即MDIO接口,可以配置PHY芯片的工作模式以及获取PHY芯片的若干状态信息。PHY芯片内部包含一系列寄存器,用户通过这些寄存器来配置PHY芯片的工作模式以及获取PHY芯片的若干状态信息,如连接速率、双工模式、自协商状态等。FPGA通过MDIO接口对PHY芯片内部的寄存器进行配置。通常情况下,PHY芯片在默认状态下也可以正常工作,在做以太网通信实验时,对MDIO接口的配置不是必须的,本章旨在向大家介绍MDIO接口以及如何对MDIO接口进行读写操作。MAC和PHY连接示意图如下图所示:

b)MDIO接口也称为SMI接口(Serial Management Interface,串行管理接口),包括ETH_MDC(数据管理时钟)和ETH_MDIO(数据管理输入输出)两条信号线。ETH_MDC为ETH_MDIO提供时钟,ETH_MDC的最大时钟不能超过12.5Mhz。ETH_MDIO为双向数据引脚,既用于发送数据,也用于接收数据。

c)读时序

整个读操作过程的MDC时钟由MAC驱动,同时MAC驱动MDIO引脚输出前导码+帧开始+操作码+PHY地址+寄存器地址,随后MDIO引脚切

换至PHY驱动。在第一个TA位,MDIO引脚为高阻状态,第二个TA位为低电平,表示PHY芯片成功响应,并且接下来会输出16位寄存器数据;而如果第二个TA位处于高电平,则PHY芯片响应失败,有可能PHY地址不正确或者其它时序的错误。

需要注意的是,PHY在MDC时钟的上升沿采集数据,为保证数据的稳定传输,MAC在MDC的下降沿更新MDIO引脚的数据。当MDIO引脚切换至PHY驱动时,MDIO数据在MDC时钟的下降沿更新,因此MAC在MDC时钟的上升沿采集数据。在读操作结束后,MAC将MDIO引脚输出高阻,此时MDIO引脚的外部上拉电阻会将MDIO引脚拉高,此时MDIO接口处于空闲状态。

e)写时序

上图是以PHY地址为0x01,向寄存器地址0x00写入0x1340为例,在整个写操作过程中,MDC时钟和MDIO引脚一直由MAC端驱动,按照MDIO接口写通信协议开始传输数据。需要注意的是,PHY在MDC时钟的上升沿采集数据,为保证数据的稳定传输,MAC在MDC的下降沿将数据更新至MDIO引脚。在写操作结束后,MAC将MDIO引脚输出高阻,此时MDIO引脚的外部上拉电阻会将MDIO引脚拉高,此时MDIO接口处于空闲状态。

以太网PHY芯片

a)地址选择:YT8521芯片的PHY地址由PHYAD[2:0]生成,如下图所示:由芯片手册的引脚分配表可知PHYAD[2:0]三位引脚从低位到高位分别对应LED0、RX_CLK、RX_CTL,我们可以通过硬件电路设置LED0、RX_CLK、RX_CTL引脚为上拉或者下拉,即分配为高低电平,0或1,从而表示不同的地址。

b)复位:YT8521芯片复位后,PHY内部寄存器的数据会恢复默认的状态,并且重新开始和MAC进行自协商。YT8521支持两种复位方式,一种是硬件复位,另外一种是软件复位。硬件复位时通过ETH_RST_N引脚实现对PHY芯片的复位,当ETH_RST_N引脚持续10ms的低电平时,即可实现对PHY芯片的复位。软件复位通过向寄存器地址0x00的Bit[15]写入1进行复位,并且在完成复位后,该位会自动清零

c)寄存器:YT8521共有22位寄存器,这里我们仅介绍本实验用到的三个寄存器,控制寄存器、状态寄存器、PHY芯片具体状态寄存器。基本控制寄存器(Basic Control Register,Address0x00),简写为:BCR,用于芯片的复位和其它功能的控制,各个位的说明如下图所示:





硬件设计

a)以太网的数据传输离不开以太网PHY(物理层)芯片的支持,物理层定义了数据发送与接收所需要的电信号、线路状态、时钟基准、数据编码和电路等,并向数据链路层设备提供标准接口。我们的MPSoC-P4开发板上使用的PHY芯片为裕太车通公司的YT8521,其原理图如下图示:

实验任务

程序设计

a)总体模块设计

1)根据实验任务,因为我们需要对MDIO接口进行驱动,所以需要设计一个MDIO驱动模块实现了对MDIO接口的读写驱动。我们还需要一个输入的按键的接口,实现了对MDIO接口驱动模块的写操作,并每隔一段时间对MDIO接口驱动模块进行读操作,将获取到的网口连接状态与速度通过LED灯进行指示,所以还需要设计一个MDIO接口控制模块。

2)

b)MDIO驱动模块设计

1)注意学习正点原子的模块描述框架!

输入信号中,时钟信号clk,频率100MHz,作为系统时钟;复位信号rst_n,系统复位按键,低电平有效;触发开始信号op_exec,op_exec默认低电平,当触发信号时,op_exec拉高,表示PHY芯片被触发;读写信号op_rh_wl,当op_exec被触发后,会根据读写信号op_rh_wl的高低电平判断读与写,低电平进行写操作,高电平进行读操作;op_addr为寄存器地址,最大位宽为5。

输出信号中,op_wr_data为向寄存器写入的数据,op_rd_data为向读出寄存器的数据,当写入完成或者读出完成后,op_done读写完成会拉高一个时钟周期,表示读或者写操作完成。op_rd_ack为读应答信号,默认拉高,当进入读操作之后,应答完成后会拉低应答信号,并读取寄存器中的数据。dir_clk为驱动时钟,eth_mdc为PHY管理接口的时钟信号,eth_mdc是在dri_clk的基础上进行分频,一般频率不能超过12.5Mhz。eth_mdio为PHY管理接口的双向数据信号,既用于发送数据,也用于接收数据。

由简介部分MDIO接口读写时序图我们可以发现,MDIO驱动模块非常适合采用状态机来编写。状态机的跳转图如下图所示,总共有6个状态,分别为st_idle(空闲状态)、st_pre(发送前导码状态)、st_start(发送帧开始+操作码)、st_addr(发送PHY地址+寄存器地址)、st_wr_data(发送TA+写入数据)、st_rd_data(接收TA+接收数据)。当状态机处于空闲状态时,如果触发信号拉高(op_exec=1),状态机进入发送前

导码状态。另外当状态机处于st_addr时,在发送完PHY地址和寄存器地址之后,接下来状态机根据读或者写操作来跳转至st_wr_data状态或者st_rd_data状态。在读或者写完数据后,状态机重新跳转至空闲状态。

2)

3)绘制波形图

FPGA通过MDIO控制模块向MDIO驱动模式读写数据时,拉高触发控制信号op_exec来触发MDIO驱动模块,op_rh_wl用于表示读或者写操作,当op_rh_wl为低电平时,MDIO驱动模块执行写操作,当op_rh_wl为高电平时,MDIO驱动模块执行读操作。op_addr表示读写寄存器地址,op_wr_data信号表示写入的数据,op_rd_data信号表示从MDIO接口的寄存器中读到的数据。当读或者写操作完成时,MDIO驱动模块会产生一个时钟周期的op_done信号,表示MDIO驱动模块读或者写操作完成。由于eth_mdc需要在输入时钟的基础上进行分频,为了方便操作,这里先对输入的时钟进行分频,得到一个dri_clk时钟,作为MDIO驱动模块和MDIO控制模块的操作时钟。

4)代码实现→仿真结果图

c)MDIO控制模块设计

d)编写TB文件

1)在简介部分我们介绍过eth_mdio为双向数据引脚,既用于发送数据,也用于接收数据。所以在仿真的激励中,我们需要将eth_mdio设置为上拉。另外在本次仿真文件中,我们还需要例化一个MDIO的从机接口,该从机接口模块为官方模板,我们直接例化到顶层就可以了。

上板调试

实验管脚分配需要写明:信号名、方向、管脚、端口说明、电平标准。

以太网ARP实验

概述

a)ARP(Address Resolution Protocol),即地址解析协议,是根据IP地址(逻辑地址)获取MAC地址的一种TCP/IP协议。在以太网通信中,数据是以"帧"的格式进行传输的,帧格式里面包含目的主机的MAC地址。源主机的应用程序知道目的主机的IP地址,却不知道目的主机的MAC地址。而目的主机的MAC地址直接被网卡接收和解析,当解析到目的MAC地址非本地MAC地址时,则直接丢弃该包数据,因此在通信前需要先获得目的的MAC地址,而ARP协议正是实现了此功能。

b)ARP协议的基本功能是通过目的设备的IP地址,查询目的设备的MAC地址,以保证通信的顺利进行。MAC地址在网络中表示网卡的ID,每个网卡都需要并有且仅有一个MAC地址。在获取到目的MAC地址之后,将目的MAC地址更新至ARP缓存表中,称为ARP映射,下次通信时,可以直接从ARP缓存表中获取,而不用重新通过ARP获取MAC地址。但一般ARP缓存表会有过期时间,过期后需要重新通过ARP协议进行获取。

c)ARP映射是指将IP地址和MAC地址映射起来,分为静态映射和动态映射。静态映射指手动创建一张ARP表,把IP地址和MAC地址关联起来。手动绑定之后,源主机在通信之前,就可以直接从ARP表中直接找到IP地址对应的MAC地址,但这样做有一定的局限性,因为MAC地址可能会变化。动态映射指使用协议来获取相对应的物理地址,之所以用动态这个词是因为这个过程是自动完成的,一般应用程序的用户或系统管理员不必关心。已经设计出用于实现动态映射协议的有ARP和RARP(逆地址解析协议)两种,如下图所示:

ARP把IP地址映射为物理地址,RARP把物理地址映射为IP地址。RARP是被那些没有磁盘驱动器的系统使用(一般是无盘工作站或X终端),此类应用较少,本章不做讨论。

//----------
提问!

a)ARP与RARP的工作场景对比

1)ARP访问互联网(外网):你的电脑要访问百度110.242.68.3,首先判断目标IP不在同一子网,于是会把数据包发给网关192.168.3.1。此时你的电脑只需要ARP解析网关的MAC地址,而不需要百度服务器的MAC地址。

2)RARP 的典型工作场景(已淘汰):无盘工作站没有硬盘,无法存储自己的IP地址,开机时只有BIOS烧录的MAC地址。工作站发送RARP广播包:"我的MAC地址是aa:bb:cc:dd:ee:ff,请告诉我我的IP地址"。

//----------

d)ARP协议分为ARP请求和ARP应答,源主机发起查询目的MAC地址的报文称为ARP请求,目的主机响应源主机并发送包含本地MAC地址的报文称为ARP应答。当主机需要找出这个网络中的另一个主机的物理地址时,它就可以发送一个ARP请求报文,这个报文包含了发送方的MAC地址和IP地址以及接收方的IP地址。因为发送方不知道接收方的物理地址,所以这个 查 询 分 组 会 在 网 络 层 中 进 行 广 播 , 即ARP请 求 时 发 送 的 接 收 方 物 理 地 址 为 广 播 地 址 , 用48'hff_ff_ff_ff_ff_ff表示。

上图中的主机A发起ARP请求,由于发送的目的MAC地址为广播地址,所以此时局域网中的所有主机都会进行接收并处理这个ARP请求报文,然后进行验证,查看接收方的IP地址是不是自己的地址。是则返回ARP应答报文,不是则不响应。

主机B利用收到的ARP请求报文中的请求方物理地址,以单播的方式直接发送给主机A,主机A将收到的ARP应答报文中的目的MAC地址解析出来,将目的MAC地址和目的IP地址更新至ARP缓存表中。当再次和主机A通信时,可以直接从ARP缓存表中获取,而不用重新发起ARP请求报文。需要说明的是,ARP缓存表中的表项有过期时间(一般为20分钟),过期之后,需要重新发起ARP请求以获取目的MAC地址。

//----------
提问!

a)ARP广播包的接收范围?

1)仅同一个广播域内的设备能收到。ARP是纯二层广播协议,它的以太网帧目的MAC地址是FF:FF:FF:FF:FF:FF(广播地址)。而路由器的核心功能之一就是隔离广播域,不会转发任何二层广播包到其他网络接口。一个广播域就是一个逻辑局域网,通常对应一个VLAN。同一个VLAN内的所有设备都在同一个广播域,能收到彼此的广播包;不同VLAN之间的广播包被路由器(或三层交换机)隔离。

2)局域网之外的设备:根本不需要使用ARP请求。跨局域网通信永远不需要知道目标主机的MAC地址,只需要知道下一跳设备(通常是网关)的MAC地址。跨局域网通信的完整流程(以访问百度为例):你的电脑192.168.3.10要访问百度110.242.68.3,首先通过子网掩码判断目标IP不在同一子网→你的电脑查询本地ARP缓存,看是否有网关192.168.3.1的MAC地址→如果没有,发送ARP广播请求网关的MAC地址(只有同一局域网内的设备能收到,网关会回复)→你的电脑构造以太网帧→网关收到以太网帧后,剥离二层头,查看三层IP头的目的地址→网关查询自己的路由表,找到下一跳路由器的IP地址→网关发送ARP广播请求下一跳路由器的MAC地址(在网关和下一跳路由器所在的广播域内)→网关重新封装以太网帧,转发给下一跳路由器→这个过程不断重复,直到数据包到达百度服务器所在的局域网→百度服务器所在局域网的最后一跳路由器,发送ARP广播请求百度服务器的MAC地址→最后一跳路由器把数据包转发给百度服务器。

b)ARP代理

在某些特殊场景下,路由器会开启ARP代理功能,代替其他网段的主机回ARP请求:

1)同一物理网络,不同逻辑子网:比如两个部门在同一个交换机上,但配置了不同的IP子网,且没有划分VLAN。此时路由器开启ARP代理后,当A子网的主机发送ARP请求B子网的主机时,路由器会回复自己的MAC地址,然后转发两个子网之间的流量。

2)VPN远程访问:VPN客户端接入公司网络时,公司的VPN网关会开启ARP代理,代替VPN客户端回复公司局域网内的ARP请求,让VPN客户端看起来就像在公司局域网内一样。

//----------

以太网概述

a)以太网是目前应用最广泛的局域网通讯方式,同时也是一种协议。以太网协议定义了一系列软件和硬件标准,从而将不同的计算机设备连接在一起。我们知道串口通信单次只传输一个字节,而以太网通信是以数据包的形式传输,其单包数据量达到几十,甚至成百上千个字节。下图为以太网通过ARP传输单包数据的格式,从图中可以看出,以太网的数据包就是对协议的封装来实现数据的传输,即ARP数据位于以太网帧格式的数据段。这里只是让大家了解下以太网数据包的格式,后面会逐个展开来讲。

//----------
提问!

a)从图上看,ARP协议似乎是架在链路层之上的,和TCP或UDP属于同一层?

ARP报文直接封装在以太网帧中,没有IP头。以太网帧类型字段为0x0806表示承载ARP报文,0x0800表示承载 IP 报文。这说明ARP和IP是同一层级的对等协议,都直接运行在以太网之上。ARP的唯一作用是为IP协议提供MAC地址解析服务,没有IP就没有ARP。它不处理任何路由、分片、端到端通信,只解决同一广播域内的二层寻址问题。TCP/UDP运行在IP协议之上,是端到端的传输层协议,负责跨网络的进程间通信;ARP运行在IP协议之下,是点到点的链路层辅助协议,只负责同一局域网内的物理寻址。

应用层 (HTTP/FTP/SSH)

传输层 (TCP/UDP)

网络层 (IP/ICMP/IGMP)

├─ 辅助协议:ARP/RARP

链路层 (以太网/Wi-Fi)

物理层

//----------

b)以太网技术的正式标准是IEEE802.3,它规定了以太网传输数据的帧结构,我们可以把以太网MAC层理解成高速公路,我们必须遵循它的规则才能在上面通行,以太网MAC层帧格式如下图所示。

1)前导码(Preamble):为了实现底层数据的正确阐述,物理层使用7个字节同步码(0和1交替(55-55-55-55-55-55-55))实现数据的同步。

2)帧起始界定符(SFD,StartFrameDelimiter):使用1个字节的SFD(固定值为0xd5)来表示一帧的开始,即后面紧跟着传输的就是以太网的帧头。

3)目的MAC地址:即接收端物理MAC地址,占用6个字节。MAC地址从应用上可分为单播地址、组播地址、广播地址。单播地址:第一个字节的最低位为0,比如00-00-00-11-11-11,一般用于标志唯一的设备;组播地址:第一个字节的最低位为1,比如01-00-00-11-11-11,一般用于标志同属一组的多个设备;广播地址:所有48bit全为1,即FF-FF-FF-FF-FF-FF,它用于标志同一网段中的所有设备。

4)源MAC地址:即发送端物理MAC地址,占用6个字节。

5)长度/类型:上图中的长度/类型具有两个意义,当这两个字节的值小于1536(十六进制为0x0600)时,代表该以太网中数据段的长度;如果这两个字节的值大于1536,则表示该以太网中的数据属于哪个上层协议,例如0x0800代表IP协议(网际协议)、0x0806代表ARP协议(地址解析协议)等。数据:以太网中的数据段长度最小46个字节,最大1500个字节。最大值1500称为以太网的最大传输单元(MTU,Maximum Transmission Unit),之所以限制最大传输单元是因为在多个计算机的数据帧排队等待传输时,如果某个数据帧太大的话,那么其它数据帧等待的时间就会加长,导致体验变差,这就像一个十字路口的红绿灯,你可以让绿灯持续亮一小时,但是等红灯的人一定不愿意的。另外还要考虑网络I/O控制器缓存区资源以及网络最大的承载能力等因素,因此最大传输单元是由各种综合因素决定的。为了避免增加额外的配置,通常以太网的有效数据字段小于1500个字节。

6)帧检验序列(FCS,Frame Check Sequence):为了确保数据的正确传输,在数据的尾部加入了4个字节的循环冗余校验码(CRC校验)来检测数据是否传输错误。CRC数据校验从以太网帧头开始即不包含前导码和帧起始界定符。通用的CRC标准有CRC-8、CRC-16、CRC-32、CRC-CCIT,其中在网络通信系统中

应用最广泛的是CRC-32标准。

//----------
提问!

a)为什么以太网帧头前导码全是01交替?

1)以太网是异步串行通信系统,发送方和接收方没有共享的全局时钟。接收方必须从接收到的信号中提取出时钟信号,才能正确采样每一位数据。接收方的物理层芯片内置锁相环,会根据前导码的跳变沿快速调整自己的时钟频率,使其与发送方完全同步。前导码的长度经过精确计算:7个字节共56位,足够所有以太网物理层芯片完成时钟同步。前导码只在物理层传输,不会被上层协议处理,接收方在同步完成后会丢弃前导码

b)为什么帧起始界定符选用0xd5?

接收方在完成时钟同步后,会持续检测比特流,当检测到连续的1010101之后跟着一个1(而不是0)时,就知道前导码结束,下一位就是以太网帧的第一个比特(目的 MAC 地址的最高位)

c)组播地址和广播地址的应用场景?

组播是只有想听的人才会收到,适用于一对多的高效数据传输场景:多媒体会议、路由协议。

//----------

c)在这里还有一个要注意的地方就是以太网相邻两帧之间的时间间隔,即帧间隙(IFG,Interpacket Gap)。帧间隙的时间就是网络设备和组件在接收一帧之后,需要短暂的时间来恢复并为接收下一帧做准备的时间,IFG的最小值是96bit time,即在媒介中发送96位原始数据所需要的时间,在不同媒介中IFG的最小值是不一样的。不管10M/100M/1000M的以太网,两帧之间最少要有96bit time,IFG的最少间隔时间计算方法如下:

10Mbit/s最小时间为:96100ns = 9600ns;
100Mbit/s最小时间为:96
10ns = 960ns;

1000Mbit/s最小时间为:96*1ns = 96ns。

d)TCP/IP是网络使用中最基本的通信协议,虽然从名字看上去TCP/IP包括两个协议,TCP和IP,但TCP/IP实际上是一组协议,它包括上百个各种功能的协议,如:TCP、IP、ARP、UDP等。而TCP协议和IP协议是保证数据完整传输的两个重要的协议,因此TCP/IP协议用来表示Internet协议簇。TCP/IP协议不仅可以运行在以太网上,也可以运行在FDDI(光纤分布式数据接口)和WLAN(无线局域网)上。反过来,以太网的高层协议不仅可以是TCP/IP协议,也可以是IPX协议(互联网分组交换协议)等,只不过以太网+TCP/IP成为IT行业中应用最普遍的技术。下面我们来熟悉下ARP协议。

ARP协议

a)ARP协议属于TCP/IP协议簇的一种,从前面的介绍中可以看出,ARP协议位于以太网MAC帧格式的数据段,ARP数据包格式如下图所示:

//----------
提问!

a)ARP的上层协议是IP协议?这怎么理解?

1)从封装格式看,ARP与IP是以太网帧之上的对等协议。两者是服务提供者与服务消费者的关系,而非传统的上下层封装关系。ARP协议的存在唯一目的就是为IP协议服务,没IP就没有ARP。这种功能上的强依赖关系,是IP是ARP上层说法的根本来源。

2)IP地址是三层逻辑地址,只能用于跨网络路由,无法直接在以太网链路上传输数据。以太网只识别MAC地址,不识别IP地址。ARP的核心价值是填补IP地址与MAC地址之间的鸿沟。当IP协议要发送一个数据包时,它必须先知道下一跳设备的MAC地址,这个任务只能由ARP来完成。IP协议先产生发送数据的需求,然后调用ARP协议获取MAC地址,最后IP数据包才能被封装成以太网帧发送出去。

//----------

b)

RGMII接口

a)以太网MAC和PHY之间有一个接口,常用的接口有MII、RMII、GMII、RGMII等。

1)MII(Medium Independent Interface,媒体独立接口):MII支持10Mbps和100Mbps的操作,数据位宽为4位,在100Mbps传输速率下,时钟频率为25Mhz。

2)RMII(Reduced MII):RMII是MII的简化版,数据位宽为2位,在100Mbps传输速率下,时钟频率为50Mhz。

3)GMII(Gigabit MII):GMII接口向下兼容MII接口,支持10Mbps、100Mbps和1000Mbps的操作,数据位宽为8位,在1000Mbps传输速率下,时钟频率为125Mhz。

4)RGMII(ReducedGMII):RGMII是GMII的简化版,数据位宽为4位,在1000Mbps传输速率下,时钟频率为125Mhz,在时钟的上下沿同时采样数据。在100Mbps和10Mbps通信速率下,为单个时钟沿采样。

b)在千兆以太网中, 常用的接口为RGMII和GMII接 口 。RGMII接口的优势是同时适用于10M/100M/1000Mbps通信速率,同时占用的引脚数较少。但RGMII接口也有其缺点,就是在PCB布线时需要尽可能对时钟、控制和数据线进行等长处理,且时序约束相对也更为严格。

//----------
提问!

a)RGMII在PCB布线时的基本要求和原理?(时钟、控制、数据线)

1)TX组内所有信号(TX_CLK、TX_CTL、TXD [3:0])必须以TX_CLK为基准做等长;RX组内所有信号(RX_CLK、RX_CTL、RXD [3:0])必须以RX_CLK为基准做等长;TX组和RX组之间不需要做等长;MDIO/MDC信号速度低,时序要求宽松,不需要严格等长。

2)时钟信号要求:阻抗控制单端50Ω±10%,全程参考完整的地平面;时钟线应尽可能短,减少信号衰减和干扰;与其他高速信号(如DDR、PCIe)的间距≥3倍线宽(3W原则);条件允许时,时钟线两侧用地线包裹,每隔100mil打一个地过孔(包地隔离);尽量不要在时钟线上打过孔,如必须使用,过孔数量不超过1个;部分PHY支持差分时钟输入TX_CLK_P/N,差分阻抗100Ω±10%,抗干扰能力更强。

3)时钟延时模式:RGMII有3种时钟延时模式。无内部延迟模式(MAC和PHY都没有内部延迟,需要在PCB上人为将时钟线比数据线长约1.5-2ns,约90-120mil,使时钟边沿对准数据的中心位置);PHY内部延迟模式(PHY内部集成了时钟延迟电路,PCB上不需要做时钟延迟,所有信号等长即可);MAC内部延迟模式(MAC内部集成了时钟延迟电路,同样不需要PCB延迟)。

4)控制信号与数据线布线要求与原理:同一组内的所有信号(控制信号 + 数据线)与对应时钟线的长度差必须控制在±10mil以内(约 ±0.25mm);TXD[3:0]之间、RXD[3:0]之间的长度差必须控制在±5mil以内;单端50Ω±10%,与时钟线保持一致;所有信号必须参考完整的地平面,禁止跨分割区布线;如果需要绕线做等长,蛇形线的振幅应≥3倍线宽,间距≥2倍线宽,避免使用直角拐角

//----------

c)RGMII使用4bit数据接口,在1000Mbps通信速率下,ETH_TXC和ETH_RXC的时钟频率为125Mhz,采用上下沿DDR(DoubleDataRate)的方式在一个时钟周期内传输8位数据信号,即上升沿发送/接收低4位数据,下降沿发送/接收高4位数据。ETH_TXCTL和ETH_RXCTL控制信号同样采用DDR的方式在一个时钟周期内传输两位控制信号,即上升沿发送/接收数据使能(TX_EN/RX_ DV)信号,下降沿发送/接收使能信号与错误信号的异或值(TX_ERRxorTX_EN、RX_ERRxorRX_DV)。当RX_DV为高电平(表示数据有效),RX_ERR为低电平(表示数据无错误),则异或的结果值为高电平,因此只有当ETH_RXCTL和ETH_TXCTL信号的上下沿同时为高电平时,发送和接收的数据有效且正确。

//----------
提问!

a)类似于ETH_RXCTL、ETH_TXCTL双边沿表示数据使能信号、数据使能信号与错误信号的异或值类似的设计思路,还有哪些接口?为什么不直接在上下边沿都表示数据使能信号与错误信号的异或值?

1)LPDDR4/LPDDR5的CA总线:命令/地址总线采用双边沿采样,同一个引脚在时钟上升沿传输命令,下降沿传输地址,大幅减少了存储器的引脚数量;

2)这种设计是特定历史条件下的折中方案,有明显的局限性:双边沿采样将时序裕量减半,对 PCB 布线的等长匹配、阻抗控制和信号完整性要求极高;随着SerDes技术的成熟,串行接口(如SGMII、PCIe、USB3.0)用更少的引脚实现了更高的速率和更好的抗干扰能力,逐渐取代了大部分并行接口。

//----------

d)当RGMII工作在100Mbps时,ETH_TXC和ETH_RXC的时钟频率为25Mhz,采用上升沿SDR的方式在一个周期内传输4位数据。不过此时ETH_TXCTL和ETH_RXCTL控制信号仍采用上下沿DDR的传输方式。当RGMII工作在10Mbps时,ETH_TXC和ETH_RXC的时钟频率为2.5Mhz,采用上升沿SDR的方式在一个周期内传输4位数据。ETH_TXCTL和ETH_RXCTL控制信号也采用SDR的传输方式。

e)RGMII时序

YT8521 RGMII接收端口的信号对齐模式由硬件上的引脚外接上下拉电阻进行配置。

xilinx相关原语

a)BUFG是全局缓冲,BUFG的输出到达FPGA内部的IOB、CLB、块RAM的时钟延迟和抖动最小。除了BUFG外,常用的还有BUFR,BUFR是regional时钟网络,它的驱动范围只能局限在一个clock region的逻辑。BUFR相比BUFG的最大优势是偏斜和功耗都比较小。BUFIO是IO时钟网络,其独立于全局时钟资源,适合采集源同步数据。它只能驱动IO Block里面的逻辑,不能驱动CLB里面的LUT,REG等逻辑。

BUFIO在采集源同步IO数据时,提供非常小的延时,因此非常适合采集比如RGMII接收侧的数据,但是由于其不能驱动FPGA的内部逻辑,因此需要BUFIO和BUFG配合使用,以达到最佳性能。如ETH_RXC的时钟经过BUFIO,用来采集端口数据;ETH_RXC经过BUFG,用来作为除端口采集外的其他模块的操作时钟。

b)IDDRE1: 在UltraScale系 列 设 备 的ILOGICblock中 有 专 属 的registers来 实 现input double-data-rate(IDDRE1) registers,将输入的上下边沿DDR信号,转换成两位单边沿SDR信号。

硬件设计

实验任务

程序设计

a)总体模块设计

1)首先我们需要完成RGMII接口数据和GMII接口数据的转换,以方便数据的采集和解析,在数据采集过程中所用到的延时原语参考时钟由锁相环输出的时钟提供;其次整个以太网帧格式与ARP协议的实现由ARP顶层模块完成;ARP控制模块负责检测输入的按键是否被按下,控制ARP顶层模块发起请求与产生应答等操作;PLL模块负责将gmii_to_rgmii模块的gmii_txc接口通过锁相环输出到顶层模块。

GMII TO RGMII模块负责将双沿DDR数据和单沿SDR数据之间的转换;ARP顶层模块实现了以太网ARP数据包的接收、发送以及CRC校验的功能;ARP控制模块根据输入的PL Key1按键信号和接收到的ARP请求信号,控制ARP顶层模块发送ARP请求或者ARP应答。

b)gmii_to_rgmii模块设计

1)

时钟专用引脚输入的rgmii_rxc时钟经过BUFG后,得到gmii_rx_clk,该时钟为全局缓冲时钟,其到达FPGA内部的IOB、CLB、块RAM的时钟延迟和抖动非常小,为其他模块提供操作时钟;另外rgmii_rxc时钟也经过BUFIO,专门用于采集IO端口的数据。

2)

//----------
提问!

问题:BUFIO采集IO BANK里的数据,BUFG用于后级数据处理,这是FPGA开发的成熟做法吗?还有类似的例子吗?

解答:

①BUFIO仅能驱动同一个 IO BANK内的 IO 寄存器(ISERDES/OSERDES/IDDR/ODDR),延迟极小<1ns,抖动极低,驱动能力弱,仅能驱动几十个IO寄存器;

②BUFG可以驱动整个 FPGA 芯片内的所有寄存器和逻辑 ,延迟较大约2-5ns,抖动中等,驱动能力极强,可驱动几十万个寄存器;

③BUFH仅能驱动一个时钟区域内的逻辑,延迟中等约1-3ns,抖动低,驱动能力中等,可驱动几千个寄存器;

④BUFMR可以驱动相邻的2-4个IO BANK内的BUFIO,延迟小<1.5ns,抖动低,驱动能力中等。

⑤高速IO接口(如RGMII、DDR4、LVDS)要求极小的时钟到输出延迟和建立/保持时间裕量,只有BUFIO能满足。内部逻辑处理要求极低的时钟偏斜Skew,保证几十万寄存器之间的时序同步,只有BUFG能满足。

⑥Xilinx MIG、Ethernet MAC等官方IP核的标准实现方式:

IO输入阶段:外部RX_CLK差分信号进入FPGA,经过IBUFDS转换为单端信号→该信号同时驱动两个缓冲器:一个BUFIO和一个BUFG→

BUFIO的输出直接连接到同一个IO BANK内的IDDR和IDDR的时钟端→用BUFIO的时钟采样RXD[3:0]和RX_CTL信号,完成第一级双沿采样;

时钟域转换阶段:IDDR输出的并行数据(8位数据 + 2位控制),用BUFG的时钟打一拍→这一步将数据从IO 时钟域同步到全局时钟域,消除 BUFIO和BUFG之间的相位差;

内部处理阶段:之后的所有逻辑(CRC校验、帧解析、FIFO缓存、AXI总线接口)全部在BUFG的时钟域下进行。

//----------

c)ARP模块设计

1)

2)arp_rx模块设计:功能解释→框图→端口信号描述和解释→设计波形图→状态跳转图→代码→仿真波形图

3)arp_tx模块设计

4)CRC模块设计

5)大模块的仿真验证:TB文件

d)arp控制模块

e)顶层模块编写

f)板级验证:操作指南和实验结果等。

本章总结

以太网ICMP测试实验

概述

a)ICMP(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。ICMP使用IP的基本支持,就像它是一个更高级别的协议。但是,ICMP实际上是IP的一个组成部分,必须由每个IP模块实现。

b)ICMP协议是一种面向无连接的协议,用于传输出错报告控制信息,它是一个非常重要的协议,它对于网络安全具有极其重要的意义。它属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制、状态信息等。当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。

c)ICMP是TCP/IP模型中网络层的重要成员,与IP协议、ARP协议、RARP协议、IGMP协议共同构成TCP/IP模型中的网络层。ping和tracert是两个常用网络管理命令,ping用来测试网络可达性,tracert用来显示到达目的主机的路径。ping和tracert都利用ICMP协议来实现网络功能,它们是把网络协议应用到日常网络管理的典型实例。

d)从技术角度来说,ICMP就是一个错误侦测与回报机制,其目的就是让我们能够检测网路的连线状况,也能确保连线的准确性。当路由器在处理一个数据包的过程中发生了意外,可以通过ICMP向数据包的源端报告有关事件。

e)其功能主要有:侦测远端主机是否存在,建立及维护路由资料,重导资料传送路径(ICMP重定向),资料流量控制。ICMP在沟通之中,主要是透过不同的类别(Type)与代码(Code)让机器来识别不同的连线状况。

f)以太网ICMP传输单包数据的格式如下图所示。从图中可以看出,以太网的数据包就是对各层协议的逐层封装来实现数据的传输。用户数据打包在ICMP协议中,ICMP协议又是基于IP协议之上的,IP协议又是走MAC层发送的,即从包含关系来说:MAC帧中的数据段为IP数据报,IP报文中的数据段为ICMP报文,ICMP报文中的数据段为用户希望传输的数据内容。接下来我们逐个来向大家介绍不同层的数据格式。

//----------
☆提问☆

问题:ICMP协议又是基于IP协议之上的,那为什么还说ICMP属于网络层?

解答:

①ICMP报文确实封装在IP数据报中传输,但这只是传输手段,不是分层的判断标准。TCP/IP协议栈的分层核心依据是功能定位和服务对象,而非简单的封装嵌套。从封装顺序看,ICMP似乎在IP之上,但这是一个必要的设计选择,而非分层的证据,因为ICMP报文需要跨网络路由到目标主机或路由器,只有IP协议具备跨不同局域网、广域网的路由能力,因此ICMP必须搭IP的便车才能传输,这是利用IP的网络层能力,而非成为IP的上层协议。

②TCP/IP协议栈每一层的定义,本质是"为谁提供服务"和"提供什么服务"。ICMP完全符合网络层的所有特征:为IP协议本身和网络层设备(路由器)服务,不为任何应用层进程提供直接服务;辅助IP协议完成网络层的差错报告、拥塞控制、路径探测和路由优化;没有端口号的概念,只有类型和代码字段来区分不同的报文类型。

③IP协议本身有一个致命缺陷:它没有任何内置的差错报告和诊断机制。如果一个IP数据报在传输过程中丢失、超时或无法到达目的地,IP协议本身不会通知发送方发生了什么错误。ICMP就是为了弥补这个缺陷而设计的,它是IP协议的 "错误处理和诊断模块"。

//----------

IP协议

a)IP协议是TCP/IP协议簇中的核心协议,也是TCP/IP协议的载体,IP协议规定了数据传输时的基本单元和格式。从前面介绍中可以看出,IP协议位于以太网MAC帧格式的数据段,IP协议内容由IP首部和数据字段组成。所有的TCP、UDP、ICMP数据都以IP数据报格式传输,IP数据包格式如下图所示。

//----------
☆提问☆

问题:IP数据报格式里面各个字段在实际应用中的核心作用?

解答:

①版本:路由器、交换机、防火墙收到数据包后,首先检查版本字段。如果不是4或6,直接丢弃,不做任何后续处理。这是防止非法协议数据包进入网络的第一道防线。

②首部长度IHL:5(20字节,无选项)到15(60字节,满选项)。这是IP头部最容易被忽略但最关键的字段之一。如果IHL字段被篡改,接收方会错误地解析数据部分的起始位置,导致整个数据包解析失败。所有IP协议栈实现都必须严格检查IHL字段,小于5的数据包会被直接丢弃。大多数现代网络设备会默认丢弃IHL大于5的数据包(即带有选项的数据包),因为选项字段存在严重的安全风险。

③服务类型(ToS,Type of Service)/ 区分服务(DSCP):实现QoS(服务质量),对不同类型的流量进行优先级区分。语音流量VoIP通常标记为EF(Expedited Forwarding,快速转发),DSCP值为46,享有最高优先级,保证低延迟、低抖动;视频流量通常标记为AF41,DSCP 值为34,享有较高优先级;普通数据流量标记为Default,DSCP值为0,享有最低优先级。路由器和交换机根据DSCP值对数据包进行队列调度,优先转发高优先级的数据包。

④标识(Identification):用于IP分片和重组。当一个IP数据报被分片时,所有分片的标识字段都相同。接收方根据标识字段、源IP地址、目的 IP地址、协议字段,将属于同一个原始数据报的所有分片重组在一起。发送方每发送一个数据报,标识字段加1,这是IP分片攻击的另一个主要利用字段,攻击者可以构造具有相同标识但不同片偏移的分片,导致接收方重组出恶意数据包。

⑤标志(Flags):DF(Don't Fragment,不分片),1表示不允许分片,0表示允许分片;MF(More Fragments,更多分片),1表示后面还有更多分片,0表示这是最后一个分片。

⑥可选头部字段(Options):0-40字节。常见选项:录路由(Record Route)记录数据包经过的所有路由器的 IP 地址;时间戳(Timestamp)记录数据包经过每个路由器的时间;源路由(Source Route)由发送方指定数据包的传输路径;安全选项(Security)用于军事网络,提供安全级别标记。

问题:为什么 IP 头部校验和只校验头部,不校验数据?

解答:IP层的核心职责是路由转发,而不是端到端的可靠性。数据部分的完整性由上层协议(TCP/UDP)负责。如果IP层校验整个数据包,每经过一个路由器都需要重新计算整个数据包的校验和,这会严重降低路由器的转发效率。这种设计将可靠性的责任交给了端系统,符合互联网 端到端原则。

//----------

b)IP首部校验和的计算方法,其计算步骤如下:将16位检验和字段置为0,然后将IP首部按照16位分成多个单元;对各个单元采用反码加法运算(即高位溢出位会加到低位,通常的补码运算是直接丢掉溢出的高位);此时仍然可能出现进位的情况,将得到的和再次分成高16位和低16位进行累加;最后将得到的和的反码填入校验和字段。

ICMP协议

a)ICMP报文包含在IP数据报中,属于IP的一个用户,IP头部就在ICMP报文的前面,所以一个ICMP报文包括IP头部、ICMP头部和ICMP报文,IP头部的Protocol值为1就说明这是一个ICMP报文。

b)

ICMP首部共8个字节,同IP首部一样,也是一行以32位(4个字节)为单位。

1)类型(type):占用了8bit位,前面我们说,是ICMP报文类型,用于标识错误类型的差错报文或者查询类型的报告报文。常用类型有:类型0,代码0:表示回显应答(ping应答),类型8,代码0:表示回显请求(ping请求)。类型11,代码0:超时;类型3,代码0:网络不可达;类型3,代码1:主机不可达;类型5,代码0:重定向。

2)代码(code):占用了8 bit位,根据ICMP差错报文的类型,进一步分析错误的原因,代码值不同对应的错误也不同,例如:类型为11且代码为0,表示数据传输过程中超时了,超时的具体原因是TTL值为0,数据报被丢弃。

3)校验和(checksum):占用了16 bit位,校验的方法同上述IP首部校验和的方法一致。数据发送到目的地后需要对ICMP数据报文做一个校验,用于检查数据报文是否有错误。

4)标识符(Identifier):占用了16 bit位,对于每一个发送的数据报进行标识。

5)序列号(Sequence number):占用了16 bit位,对于发送的每一个数据报文进行编号,比如:发送的第一个数据报序列号为1,第二个序列号为2。

c)

硬件设计

实验任务

程序设计

a)总体模块设计

本次实验同时实现了ARP协议和ICMP协议,GMII接收侧的引脚同时连接至ARP顶层模块和ICMP顶层模块,这个两个模块会分别根据ARP协议和ICMP协议解析数据。而GMII发送侧引脚只能和ARP顶层模块和ICMP顶层模块的其中一个连接,因此以太网控制模块会根据当前接收到的协议类型,选择切换GMII发送侧引脚和ARP顶层模块或者ICMP顶层模块连接。除此之外,以太网控制模块根据输入的ARP接收的类型,控制ARP顶层模块返回ARP应答信号。以太网单次会接收到大量数据,因此本次实验需要一个FIFO模块用来缓存数据,由于本次实验所使用的GMII接收时钟和GMII发送时钟实际上为同一个时钟,因此这里使用的是同步FIFO。

b)icmp_rx模块

ICMP接收模块较为简单,因为我们不需要对数据做IP首部校验也不需要做CRC循环冗余校验,只需要判断目的MAC地址与开发板MAC地址、目的IP地址与开发板IP地址是否一致即可。接收模块的解析顺序是:前导码+帧起始界定符→以太网帧头→IP首部→ICMP首部→ICMP数据(有效数据)→接收结束。

接收模块使用三段式状态机来解析以太网包,从上图可以比较直观的看到每个状态实现的功能以及跳转到下一个状态的条件。这里需要注意的一点是,在中间状态如前导码错误、MAC地址错误、协议类型错误、ICMP协议错误以及IP地址错误时跳转到st_rx_end状态而不是跳转到st_idle状态。因为中间状态在解析到数据错误时,单包数据的接收还没有结束,如果此时跳转到st_idle状态会误把有效数据当成前导码来解析,所以状态跳转到st_rx_end。而eth_rxdv信号为0时,单包数据才算接收结束,所以st_rx_end跳转到st_idle的条件是eth_rxdv=0,准备接收下一包数据。

以太网UDP测试

概述

a)UDP(User Datagram Protocol),即用户数据报协议,是一种面向无连接的传输层协议。无连接是指在传输数据时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输(如视频会议等)都会采用UDP协议进行传输,这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。

b)UDP和TCP是传输层中非常重要的两个协议,位于OSI(Open SystemInterconnection,开放式系统互联)参考模型中的第四层(传输层),是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,位于IP协议层(网络层)之上。OSI将计算机网络体系结构分为七层:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,OSI参考模型如下图所示。

c)

UDP协议

a)事实上数据是可以直接封装在IP协议里而不使用TCP、UDP或者其它上层协议的。然而在网络传输中同一IP服务器需要提供各种不同的服务,各种不同的服务类型是使用端口号来区分的,例如用于浏览网页服务的80端口,用于FTP(文件传输协议)服务的21端口等。TCP和UDP都使用两个字节的端口号,理论上可以表示的范围为0~65535,足够满足各种不同的服务类型。

b)然后是为什么不选择传输更可靠的TCP协议,而是UDP协议呢?TCP协议与UDP协议作为传输层最常用的两种传输协议,这两种协议都是使用IP作为网络层协议进行传输。下面是TCP协议与UDP协议的区别:

1)TCP协议面向连接,是流传输协议,通过连接发送数据,而UDP协议传输不需要连接,是数据报协议;

2)TCP为可靠传输协议,而UDP为不可靠传输协议。即TCP协议可以保证数据的完整和有序,而UDP不能保证;

3)UDP由于不需要连接,故传输速度比TCP快,且占用资源比TCP少;

4)应用场合:TCP协议常用在对数据文件完整性较高的一些场景中,如文件传输等。UDP常用于对通讯速度有较高要求或者传输数据较少时,比如对速度要求较高的视频直播和传输数据较少的QQ等。

c)首先可以肯定的告诉大家,使用FPGA实现TCP协议是完全没有问题的,但是,FPGA发展到现在,却鲜有成功商用的RTL级的TCP协议设计,大部分以太网传输都是基于比较简单的UDP协议。TCP协议设计之初是根据软件灵活性设计的,如果使用硬件逻辑实现,工程量会十分巨大,而且功能和性能无法得到保证,因此,TCP协议设计并不适合使用硬件逻辑实现。UDP协议是一种不可靠传输,发送方只负责数据发送出去,而不管接收方是否正确的接收。在很多场合,是可以接受这种潜在的不可靠性的,例如视频实时传输显示等。

d)

UDP首部共8个字节,同IP首部一样,也是一行以32位(4个字节)为单位。

1)源端口号:16位发送端端口号,用于区分不同服务的端口,端口号的范围从0到65535。

2)目的端口号:16位接收端端口号。

3)UDP长度:16位UDP长度,包含UDP首部长度+数据长度,单位是字节(byte)。

4)UDP校验和:16位UDP校验和。UDP计算校验和的方法和计算IP数据报首部校验和的方法相似,但不同的是IP数据报的校验和只检验IP数据报的首部,而UDP校验和包含三个部分:UDP伪首部,UDP首部和UDP的数据部分。伪首部的数据是从IP数据报头和UDP数据报头获取的,包括源IP地址,目的IP地址,协议类型和UDP长度,其目的是让UDP两次检查数据是否已经正确到达目的地,只是单纯为了做校验用的。在大多数使用场景中接收端并不检测UDP校验和。

相关推荐
坏孩子的诺亚方舟10 小时前
open_prj22_IIC读写EEPROM、AD/DA、PLSYSMON
fpga开发·mpsoc
坏孩子的诺亚方舟3 天前
open_prj21_RGB LCD和HDMI
fpga开发·mpsoc
坏孩子的诺亚方舟3 天前
open_prj20_MPSOC概述
fpga开发·正点原子·mpsoc
不知秋8808 天前
PCAN-View核心功能使用手册
can·以太网·codesys·peakcan·pcan-view
WIZnet15 天前
MQTTS连接adafruit平台示例
网络·以太网·wiznet
Once_day1 个月前
网络以太网之(3)LLDP协议
网络·以太网·lldp
FPGA的花路1 个月前
UDP协议
fpga开发·以太网·udp协议
行者..................2 个月前
第1课:搭建 Linux 驱动与 Qt 开发基础环境
linux·运维·qt·mpsoc
盛世宏博北京2 个月前
6. 物联网环境监测新标杆:POE供电以太网温湿度变送器技术详解
大数据·运维·网络·以太网·poe·温湿度变送器