FPGA - 以太网UDP通信(一)

一,简述以太网

以太网简介

​以太网是一种计算机局域网技术。IEEE组织的IEEE 802.3标准制定了以太网的技术标准,它规定了包括物理层的连线、电子信号和介质访问层协议的内容。 ​

以太网类型介绍

以太网是现实世界中最普遍的一种计算机网络。以太网有两类:第一类是经典以太网,第二类是交换式以太网,使用了一种称为交换机的设备连接不同的计算机。经典以太网是以太网的原始形式,运行速度从3~10 Mbps不等;而交换式以太网正是广泛应用的以太网,可运行在100、1000和10000Mbps那样的高速率,分别以快速以太网、千兆以太网和万兆以太网的形式呈现。

二,OSI七层模型和TCP/IP五层模型

OSI模型,即开放式通信系统互联参考模型Open System Interconnection Reference Model),是国际标准化组织(ISO)提出的一个试图使各种计算机在世界范围内互连为网络的标准框架,简称OSI。”

OSI七层模型

OSI定义了网络互连的七层模型(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层),如下图所示:

应用层:为应用程序或用户请求提供各种请求服务。OSI参考模型最高层,也是最靠近用户的一层,为计算机用户、各种应用程序以及网络提供接口,也为用户直接提供各种网络服务。

表示层:数据编码、格式转换、数据加密。提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别。如果必要,该层可提供一种标准表示形式,用于将计算机内部的多种数据格式转换成通信中采用的标准表示形式。数据压缩和加密也是表示层可提供的转换功能之一。

会话层:创建、管理和维护会话。接收来自传输层的数据,负责建立、管理和终止表示层实体之间的通信会话,支持它们之间的数据交换。该层的通信由不同设备中的应用程序之间的服务请求和响应组成。

传输层:数据通信。建立主机端到端的链接,为会话层和网络层提供端到端可靠的和透明的数据传输服务,确保数据能完整的传输到网络层。

网络层:IP选址及路由选择。通过路由选择算法,为报文或通信子网选择最适当的路径。控制数据链路层与传输层之间的信息转发,建立、维持和终止网络的连接。数据链路层的数据在这一层被转换为数据包,然后通过路径选择、分段组合、顺序、进/出路由等控制,将信息从一个网络设备传送到另一个网络设备。

数据链路层:提供介质访问和链路管理。接收来自物理层的位流形式的数据,封装成帧,传送到网络层;将网络层的数据帧,拆装为位流形式的数据转发到物理层;负责建立和管理节点间的链路,通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。

物理层:管理通信设备和网络媒体之间的互联互通。传输介质为数据链路层提供物理连接,实现比特流的透明传输。实现相邻计算机节点之间比特流的透明传送,屏蔽具体传输介质和物理设备的差异。

TCP/IP五层模型

TCP/IP是一组协议的代名词,它包括许多协议,组成了TCP/IP协议簇。它是把OSI七层模型简化成了五层模型。每一层都呼叫它的下一层所提供的网络来完成自己的需求

TCP/IP 五层协议和 OSI 的七层协议对应关系如下:

从上图中可以看出, TCP/IP 模型⽐ OSI 模型更加简洁,它把 应⽤层/表示层/会话层 全部整合为了 应⽤层

在每⼀层都⼯作着不同的设备,⽐如我们常⽤的交换机就⼯作在数据链路层的,⼀般的路由器是⼯作在⽹络层的。

在每⼀层实现的协议也各不同,即每⼀层的服务也不同,下图列出了每层主要的传输协议:

一般说的FPGA UDP通信,FPGA只做到了传输层,传输层以上的会话层、表示层等等,FPGA是没有的。FPGA 开发板通过一片 以太网PHY芯片 提供对以太网连接的支持,PHY芯片内提供物理层,进行4b/10b编码,PHY芯片提供MII/GMII/RGMII 接口的MAC连接

在传输层中 TCPUDP都是传输层协议,它们都属于TCP/IP协议族:

🤔 UDP

UDP的全称是⽤户数据报协议,在⽹络中它与TCP协议⼀样⽤于处理数据包,是⼀种⽆连接的协议。在OSI模型中,在传输层,处于IP协议的上⼀层。UDP有 不提供数据包分组、组装和不能对数据包进⾏排序的缺点,也就是说,当报⽂发送之后,是⽆法得知其是否安全完整到达的

它的特点如下:

  1. 面向无连接
  2. 有单播、多播、广播的功能
  3. 面向报文
  4. 不可靠性
  5. 头部开销⼩,传输数据报⽂⾼效。
🧐 TCP
  1. 面向连接
  2. 仅支持单播传输
  3. 面向字节流
  4. 可靠传输
  5. 提供拥塞控制
  6. 提供全双工通信
😜 TCP和UDP的区别

三,FPGA UDP通信硬件构成

        根据以上的简述,我们知道 FPGA UDP通信 FPGA只做到了传输层,传输层以上的会话层、表示层等等,FPGA是没有的。 所以PC端发送数据经过传输层添加TCP/UDP 头部后,在经过网络层添加IP头部,然后经过数据链路层添加MAC头部,通过层级组包传输到FPGA的PHY芯片内提供物理层,进行4b/10b编码,PHY芯片提供MII/GMII/RGMII 接口的MAC连接

硬件简化图如下所示:

组包简化图如下所示:

 四,PHY芯片接口介绍

从数据传输角度来看,控制器(FPGA )PHY 侧芯片实现以太网传输的数据链路两端,有 3 种主要的接口形式。这 3 种接口形式主要是 MII GMIIRGMII 。 MII 主要应用在百兆网传输中,而 GMII 和 RGMII 则均可以运用于千兆网, RGMII 相较于 GMII ,则可以有更高的数据位通信效率。

MII 接口

MII 接口信号连接关系及各信号的介绍如下。

GMII 接口

GMII 接口信号连接关系及各信号的介绍如下。

GMII 发送和接收时序:

RGMII 接口

RGMII 即ReducedGMII,是GMII 的简化版本,将接口信号线数量从24根减少到14根,时钟频率仍旧为125MHz,TX/RX 数据宽度从8 位变为4位。RGMII接口信号连接关系及各信号的介绍如下。

RGMII接口为了保持1000Mbps 的传输速率不变, RGMII 接口在时钟的上升沿和下降沿都采样数据。在参考时钟的上升沿发送 GMII 接口中的 TXD[3:0]/RXD[3:0] ,在参考时钟的下降沿发送 GMII 接口中的 TXD[7:4]/RXD[7:4] 。

RGMII 的时序分为两种:延时模式和非延时模式,可以通过配置PHY芯片改变模式。 用的比较多的模式是延时模式,一般PHY芯片默认配置为延时模式

时序图如下:

根据以上介绍,我们使用RGMII接口的以太网 PHY 与 MAC (PHY )的连接实现方法,解决了接口问题,才能编写对应的网络协议实现逻辑。

五,RGMII和GMII转换电路设计

在以上了解中,我们知道RGMII 是GMII 的简化版本,接口信号线数量从24根减少到14根,TX/RX 数据宽度从8 位变为4位,所以我们要实现RGMII的发送与接收

RGMII发送

对于FPGA来说,实现 RGMII 接口的发送是一个非常直接的过程,整个发送逻辑框图如图所示:

设计实现时,我们需要使用xilinx 的ODDR(Output Double Data Rate,输出双倍数据速率)原语,将该接口使用OLOGIC 块实现。ODDR 原语只有一个时钟输入,下降沿数据由输入时钟的本地反转来计时,反馈到I/O块的所有的时钟被完全复用,ODDR 原语的框图如图 所示:

其中各个端口的功能及描述如下:

除了这些端口外, ODDR原语还包含一些可用属性:

编写rgmii_send代码:

module rgmii_send(
	input                reset              ,

    output               phy_rgmii_tx_clk  ,
	output               phy_rgmii_tx_ctl  ,
	output [3:0]         phy_rgmii_tx_data ,

	input                gmii_tx_clk       ,
	input                gmii_tx_vld       ,
	input [7:0]          gmii_tx_data      

    );

wire			rgmii_tx_ctl;
wire	[3:0]	rgmii_tx_data;     

/*------------------------------------------*\
                      ODDR
\*------------------------------------------*/

   ODDR #(
      .DDR_CLK_EDGE("SAME_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE" 
      .INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1
      .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC" 
   ) oddr_tx_rgmii_ctl (
      .Q(rgmii_tx_ctl),   // 1-bit DDR output
      .C(gmii_tx_clk),   // 1-bit clock input
      .CE(1), // 1-bit clock enable input
      .D1(gmii_tx_vld), // 1-bit data input (positive edge)
      .D2(gmii_tx_vld), // 1-bit data input (negative edge)
      .R(0),   // 1-bit reset
      .S(0)    // 1-bit set
   );
   
genvar i_tx;
generate
	for ( i_tx = 0; i_tx < 4; i_tx = i_tx + 1) begin
		ODDR #(
      		.DDR_CLK_EDGE("SAME_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE" 
      		.INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1
      		.SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC" 
   		) oddr_tx_rgmii_ctl (
      		.Q(rgmii_tx_data[i_tx]),   // 1-bit DDR output
      		.C(gmii_tx_clk),   // 1-bit clock input
      		.CE(1), // 1-bit clock enable input
      		.D1(gmii_tx_data[i_tx]), // 1-bit data input (positive edge)
      		.D2(gmii_tx_data[i_tx + 4]), // 1-bit data input (negative edge)
      		.R(0),   // 1-bit reset
      		.S(0)    // 1-bit set
        );
	end
endgenerate

/*------------------------------------------*\
                   OBUF
\*------------------------------------------*/
   OBUF  obuf_tx_rgmii_clk(
      .O(phy_rgmii_tx_clk),     // Buffer output (connect directly to top-level port)
      .I(gmii_tx_clk)      // Buffer input
   );

   OBUF  obuf_tx_rgmii_ctl(
      .O(phy_rgmii_tx_ctl),     // Buffer output (connect directly to top-level port)
      .I(rgmii_tx_ctl)      // Buffer input
   );

genvar j_tx;
generate
	for ( j_tx = 0; j_tx < 4; j_tx = j_tx + 1) begin

	   OBUF  obuf_tx_rgmii_data(
      	.O(phy_rgmii_tx_data[j_tx]),     // Buffer output (connect directly to top-level port)
      	.I(rgmii_tx_data[j_tx])      // Buffer input
   	   );	

	end
endgenerate
endmodule

RGMII接收

对于 FPGA 来说,实现 RGMII 接口的接收同样是一个非常直接的过程, 整个接收逻辑框图如图所示:

同样,设计实现时,可通过使用xilinx 的IDDR 原语,将该接口使用ILOGIC 块实现。在ILOGIC 块中,有着专用的寄存器,用于实现输入双倍数据速率(DDR)寄存器,当我们实例化IDDR 原语时便会自动访问该功能。IDDR 原语的框图如图所示:

其中各个端口的功能及描述如表

除了这些端口外, IDDR 原语还包含一些可用属性:

编写rgmii_receive代码:

`timescale 1ns / 1ps
module rgmii_receive(
	input				reset 				,

	input 				delay_refclk		,

	input 				phy_rgmii_rx_clk 	,
	input 				phy_rgmii_rx_ctl 	,
	input [3:0]			phy_rgmii_rx_data 	,

	output 				gmii_rx_clk			,
	output				gmii_rx_vld			,
	output				gmii_rx_error		,	
	output [7:0]		gmii_rx_data 			
    );
	wire			phy_rgmii_rx_clk_ibuf;	
	wire			phy_rgmii_rx_ctl_ibuf;
	wire	[3:0]	phy_rgmii_rx_data_ibuf;

	// wire            phy_rgmii_rx_ctl_delay;
	// wire [3:0]      phy_rgmii_rx_data_delay;

	wire 			gmii_rx_error_xor	 	;	

	assign gmii_rx_error = gmii_rx_vld ^ gmii_rx_error_xor;
	// assign gmii_rx_clk = phy_rgmii_rx_clk;

	/*------------------------------------------*\
	                      IBUF
	\*------------------------------------------*/
	   IBUF rgmii_rx_clk_ibuf (
	      .O(phy_rgmii_rx_clk_ibuf),     // Buffer output
	      .I(phy_rgmii_rx_clk)      // Buffer input (connect directly to top-level port)
	   );

	   IBUF rgmii_rx_ctl_ibuf (
	      .O(phy_rgmii_rx_ctl_ibuf),     // Buffer output
	      .I(phy_rgmii_rx_ctl)      // Buffer input (connect directly to top-level port)
	   );


	genvar i_rx;
	generate
		for ( i_rx = 0; i_rx < 4; i_rx = i_rx + 1) begin
			
	   IBUF rgmii_rx_data_ibuf (
	      .O(phy_rgmii_rx_data_ibuf[i_rx]),     // Buffer output
	      .I(phy_rgmii_rx_data[i_rx])      // Buffer input (connect directly to top-level port)
	   );
		end
	endgenerate
	/*------------------------------------------*\
	                    BUFG 、BUFIO
	\*------------------------------------------*/
	   BUFG rgmii_rx_clk_bufg (
	      .O(gmii_rx_clk), // 1-bit output: Clock output
	      .I(phy_rgmii_rx_clk_ibuf)  // 1-bit input: Clock input
	   );
   // BUFIO rgmii_rx_clk_bufio (
   //    .O(phy_rgmii_rx_clk_bufio), // 1-bit output: Clock output (connect to I/O clock loads).
   //    .I(phy_rgmii_rx_clk)  // 1-bit input: Clock input (connect to an IBUF or BUFMR).
   // );

	/*-----------------------------------------*\
					IDDR
	\*-----------------------------------------*/
	IDDR #(
      .DDR_CLK_EDGE("SAME_EDGE_PIPELINED"), // "OPPOSITE_EDGE", "SAME_EDGE" 
                                      //    or "SAME_EDGE_PIPELINED" 
      .INIT_Q1(1'b0), // Initial value of Q1: 1'b0 or 1'b1
      .INIT_Q2(1'b0), // Initial value of Q2: 1'b0 or 1'b1
      .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC" 
   ) iddr_rgmii_rx_ctl (
      .Q1(gmii_rx_vld), // 1-bit output for positive edge of clock
      .Q2(gmii_rx_error_xor), // 1-bit output for negative edge of clock
      .C(phy_rgmii_rx_clk_ibuf),   // 1-bit clock input
      .CE(1), // 1-bit clock enable input
      .D(phy_rgmii_rx_ctl_ibuf),   // 1-bit DDR data input
      .R(0),   // 1-bit reset
      .S(0)    // 1-bit set
   );

	genvar q_rx;
	generate
		for (q_rx = 0; q_rx<4 ; q_rx = q_rx+ 1) begin
			IDDR #(
		      .DDR_CLK_EDGE("SAME_EDGE_PIPELINED"), // "OPPOSITE_EDGE", "SAME_EDGE" 
		                                      //    or "SAME_EDGE_PIPELINED" 
		      .INIT_Q1(1'b0), // Initial value of Q1: 1'b0 or 1'b1
		      .INIT_Q2(1'b0), // Initial value of Q2: 1'b0 or 1'b1
		      .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC" 
		   ) iddr_rgmii_rx_data (
		      .Q1(gmii_rx_data[q_rx]), // 1-bit output for positive edge of clock
		      .Q2(gmii_rx_data[q_rx + 4]), // 1-bit output for negative edge of clock
		      .C(phy_rgmii_rx_clk_ibuf),   // 1-bit clock input
		      .CE(1), // 1-bit clock enable input
		      .D(phy_rgmii_rx_data_ibuf[q_rx]),   // 1-bit DDR data input
		      .R(0),   // 1-bit reset
		      .S(0)    // 1-bit set
		   );
		end
	endgenerate

endmodule

RGMII 顶层

RGMII 接口分别实现了接收和发送两部分,将两部分例化封装顶层rgmii_interface

module rgmii_interface(
	input               reset             ,

	input               delay_refclk      ,

    input               phy_rgmii_rx_clk  ,
	input               phy_rgmii_rx_ctl ,
	input [3:0]         phy_rgmii_rx_data ,

	output              gmii_rx_clk       ,
	output              gmii_rx_vld       ,
	output              gmii_rx_error     ,
	output [7:0]        gmii_rx_data      ,

    output              phy_rgmii_tx_clk  ,
	output              phy_rgmii_tx_ctl  ,
	output [3:0]        phy_rgmii_tx_data ,

	input               gmii_tx_clk       ,
	input               gmii_tx_vld       ,
	input [7:0]         gmii_tx_data 
    );


	rgmii_receive rgmii_receive
		(
			.reset             (reset),

			.delay_refclk      (delay_refclk),

			.phy_rgmii_rx_clk  (phy_rgmii_rx_clk),
			.phy_rgmii_rx_ctl (phy_rgmii_rx_ctl),
			.phy_rgmii_rx_data (phy_rgmii_rx_data),

			.gmii_rx_clk       (gmii_rx_clk),
			.gmii_rx_vld       (gmii_rx_vld),
			.gmii_rx_error     (gmii_rx_error),
			.gmii_rx_data      (gmii_rx_data)
		);

	rgmii_send rgmii_send
		(
			.reset             (reset),

			.phy_rgmii_tx_clk  (phy_rgmii_tx_clk),
			.phy_rgmii_tx_ctl  (phy_rgmii_tx_ctl),
			.phy_rgmii_tx_data (phy_rgmii_tx_data),

			.gmii_tx_clk       (gmii_tx_clk),
			.gmii_tx_vld       (gmii_tx_vld),
			.gmii_tx_data      (gmii_tx_data)
		);


endmodule

六,总结

至此,关于FPGA UDP通信的RGMII 接口与 GMII 接口的互转逻辑设计已经实现,在 FPGA 中设计以太网的接收和发送逻辑时,只需要按照 GMII 接口的形式,先设计出对应的发送和接收逻辑,再将对应的端口连接到 RGMII 与 GMII 接口转换逻辑上,就能够完成基于 RGMII 接口的以太网接收和发送。

接下来,在下一篇博客中将会实现物理层(mac层)的接收与发送。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/533005.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python篇---图片转成视频

python篇—图片转成视频 import cv2 import os# 设置图片文件夹路径和视频输出路径 image_folder /workspace/11 video_name output_video.mp4# 获取图片文件夹中的所有图片文件名&#xff0c;并按顺序排序 images [img for img in os.listdir(image_folder) if img.endswi…

SSH穿透ECS访问内网RDS数据库

处于安全考虑&#xff0c;RDS一般只会允许指定的IP进行访问&#xff0c;而我们开发环境的IP往往是动态的&#xff0c;每次IP变动都需要去修改RDS的白名单&#xff0c;为我们的工作带来很大的不便。 那么如何去解决这个问题&#xff1f; 假如我们有一台ESC服务器&#xff0c;E…

虹科Pico汽车示波器 | 免拆诊断案例 | 2011款东风悦达起亚K5车发动机偶尔起动困难

一、故障现象 一辆2011款东风悦达起亚K5车&#xff0c;搭载G4KD发动机&#xff0c;累计行驶里程约为24.5万km。车主反映&#xff0c;第1次起动发动机时偶尔无法起动着机&#xff0c;第2次能够正常起动着机&#xff0c;但发动机故障灯异常点亮。为此在其他维修厂维修过&#xf…

java Web课程管理系统用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 课程管理系统是一套完善的web设计系统&#xff0c;对理解JSP java 编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&#xff0c;使用ja…

【PDF.js】PDF文件预览

【PDF.js】PDF文件预览 一、PDF.js二、PDF.js 下载1、下载PDF.js2、在项目中引入3、屏蔽跨域错误 三、项目中使用四、说明五、实现效果 使用PDFJS实现pdf文件的预览&#xff0c;支持预览指定页、关键词搜索、缩略图、页面尺寸调整等等。 一、PDF.js 官方地址 文档地址 二、PD…

SpringCloudAlibaba-整合sleuth和zipkin(六)

目录地址&#xff1a; SpringCloudAlibaba整合-CSDN博客 一、整合sleuth 1.引入依赖 在需要追踪的微服务中引入依赖&#xff0c;user、order、product <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter…

spring boot 集成 flyway依赖 做数据库迁移,让部署没烦恼

flyway 是一个敏捷工具&#xff0c;用于数据库的移植。采用 Java 开发&#xff0c;支持所有兼容 JDBC 的数据库。 主要用于在你的应用版本不断升级的同时&#xff0c;升级你的数据库结构和里面的数据。 还是直接上代码 第一步&#xff1a; <!-- Flyway 数据库迁移 依赖 他…

LeetCode第22题:生成括号【22/1000 python 递归|动态规划】

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作http://t.csdnimg.cn/Q59WX作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打…

【I/O】基于事件驱动的 I/O 模型---Reactor

Reactor 模型 BIO 到 I/O 多路复用 为每个连接都创建一个线程 假设我们现在有一个服务器&#xff0c;想要对接多个客户端&#xff0c;那么最简单的方法就是服务端为每个连接都创建一个线程&#xff0c;处理完业务逻辑后&#xff0c;随着连接关闭线程也要销毁&#xff0c;但是…

Meta的新AI深度伪造策略:增加标签,减少下架

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【MYSQL锁】透彻地理解MYSQL锁

&#x1f525;作者主页&#xff1a;小林同学的学习笔录 &#x1f525;mysql专栏&#xff1a;小林同学的专栏 目录 1.锁 1.1 概述 1.2 全局锁 1.2.1 语法 1.2.1.1 加全局锁 1.2.1.2 数据备份 1.2.1.3 释放锁 1.2.1.4 特点 1.2.1.5 演示 1.3 表级锁 1.3.1 介绍 …

spring-cloud微服务openfeign

Spring Cloud openfeign对Feign进行了增强&#xff0c;使其支持Spring MVC注解&#xff0c;另外还整合了Ribbon和Nacos&#xff0c;从而使得Feign的使用更加方便 优势&#xff0c;openfeign可以做到使用HTTP请求远程服务时就像洞用本地方法一样的体验&#xff0c;开发者完全感…

计算机视觉 | 基于 ORB 特征检测器和描述符的全景图像拼接算法

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本项目实现了基于 ORB 特征检测器和描述符的全景图像拼接算法&#xff0c;能够将两张部分重叠的图像拼接成一张无缝连接的全景图像。 文章目录 一、随机抽样一致算法二、功能实现三、代码解析四、效果展示五、完整代码 一、随机…

如何合理利用Vue 3中的ref和reactive

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

uni-app实现分页--(1)准备工作,首页下拉触底加载更多

实现流程如下: 分析&#xff1a;需要在滚动容器中添加滚动触底&#xff0c;在猜你喜欢中获取数据。难点&#xff1a;如何在父页面调用子组件内的方法。父组件中用ref&#xff0c;并定义组件实例类型&#xff0c;子组件中暴露方法 具体代码如下&#xff1a; 1.在父组件中添加…

去中心化社交媒体:分析 Facebook 在区块链平台上的角色

在当今数字时代&#xff0c;社交媒体已经成为人们日常生活中不可或缺的一部分。然而&#xff0c;随着人们对数据隐私和信息控制的关注不断增加&#xff0c;传统的中心化社交媒体平台也面临着越来越多的质疑和挑战。为了应对这些挑战&#xff0c;越来越多的人开始探索去中心化社…

关于Renesas R7 的选项字节开关看门狗

Renesas看门狗的模式是在选项字节中进行配置的&#xff0c;OPBT0的寄存器说明如下&#xff0c; 关于看门狗模式 &#xff1a; 和看门狗喂狗方式&#xff1a; 我们选择关闭看门狗&#xff08;也就是配置31位为软件触发看门狗开始&#xff0c;然后不启动就相当于关闭&#xff09…

【动手学深度学习】15_汉诺塔问题

注&#xff1a; 本系列仅为个人学习笔记&#xff0c;学习内容为《算法小讲堂》&#xff08;视频传送门&#xff09;&#xff0c;通俗易懂适合编程入门小白&#xff0c;需要具备python语言基础&#xff0c;本人小白&#xff0c;如内容有误感谢您的批评指正 汉诺塔&#xff08;To…

2024谷歌Google广告推广投放怎么做?如何收费?

当今全球市场&#xff0c;谷歌作为全球最大的搜索引擎&#xff0c;其广告服务——Google Ads&#xff0c;已成为企业触达全球消费者、提升品牌知名度、驱动业务增长的首选渠道之一。尤其是在2024年&#xff0c;随着数字营销环境的持续演进&#xff0c;精准、高效地运用Google A…

MySQL-创建和管理表:基础知识、创建和管理数据库、创建表、修改表、重命名表、删除表、清空表、拓展

创建和管理表 1. 基础知识1.1 一条数据存储的过程1.2 标识符命名规则1.3 MySQL中的数据类型 2. 创建和管理数据库2.1 创建数据库2.2 使用数据库2.3 修改数据库2.4 删除数据库 3. 创建表3.1 创建方式13.2 创建方式23.3 查看数据表结构 4. 修改表4.1 追加一个列4.2 修改一个列4.3…