ARM架构(三)——AMBA和总线②

本文参考
ARM文档“Introduction to AMBA AXI4 - Arm Developer”
手册可以在ARM官方文档中下载ARM.con,也可以访问我的百度网盘资源 提取码:1234

1. AXI协议概述

1.1 多主系统中的AXI

1、下图显示了一个SoC系统的简化示例,它由主、从和连接它们的互连组成。
在这里插入图片描述
上图显示,每个AXI主接口连接到单个AXI从接口。当涉及多个主从时,需要一个互连结构(如上图中的深蓝色Inter-connection archtecture)。这种互连结构还实现了从接口和主接口,其中实现了AXI协议。AXI协议定义了主从之间点对点连接的信号和定时。
AXI协议是点对点规范,而不是总线规范。因此,它只描述接口之间的信号和时序。

2、多Master多Slave的Sample总线传输模型
下图显示的是一个较为复杂的互连,它需要自己的AXI主接口和从接口与外部功能块通信:
在这里插入图片描述
下图显示了一个具有各种处理器和功能块的SoC示例(是【ARM架构(三)——AMBA和总线①】2.1中的那个示例图):
在这里插入图片描述
这个图显示了使用AXI的所有连接。在同一个SoC中使用了AXI3和AXI4,这是比较常见的做法。在这种情况下,互连执行不同AXI接口之间的协议转换。

1.2 AXI通道

AXI规范描述了两个接口之间的点对点协议:主接口和从接口。下图显示了每个AXI接口用于通信的五个主要通道:
在这里插入图片描述

  • 写操作使用以下通道:
    (1)主设备在写地址(Write address, AW)通道上发送一个地址
    (2)地址发送之后,主设备在写数据(Write data, W)通道上向从服务器传输数据。
    (3)slave将接收到的数据写到指定的地址。一旦从服务器完成了写操作,它就在写响应(write Response, B)通道上用一条消息响应主服务器。
  • 读操作使用以下通道:
    (1)主设备在读地址(AR)通道上发送它想要读取的地址。
    (2)从设备通过读取数据( R )通道将数据从请求地址发送到主设备。 从设备也可以在读数据( R )通道上返回一个错误消息。例如,如果地址无效,或数据损坏,或访问没有正确的安全权限,则会发生错误。

每个通道都是单向的,因此需要一个单独的写响应通道来将响应传递回主机。但是,不需要读取响应通道,因为读取响应是作为读取数据通道的一部分传递的。

使用单独的地址和数据通道进行读写传输有助于最大限度地利用接口带宽。读写通道组之间没有时序关系。这意味着读序列可以与写序列同时发生。
这五个通道中的每一个都包含几个信号,每个通道中所有这些信号的前缀如下:

前缀含义
AW表示 Write Address写地址通道的信号;
AR表示 Read Address读地址通道的信号;
W表示 Write Data写数据通道的信号;
R表示Read Data 读数据通道的信号;
B表示Write Response写响应通道的信号
B代表缓冲的,因为从服务器的响应发生在所有写操作完成之后

1.3 AXI的主要特点

AXI协议有几个关键特性,旨在改善数据传输和事务的带宽和延迟,如下所示:

  1. 独立的读写通道。 AXI支持两组不同的通道,一组用于写操作,另一组用于读操作。拥有两组独立的信道有助于提高接口的带宽性能。读和写操作可以同时发生。
  2. 多个未完成地址。 AXI允许存在多个未完成地址。主设备可以在不等待先前事务完成的情况下发出事务。这可以提高系统性能,支持并行处理事务。
  3. 地址和数据操作之间没有严格的定时关系。 使用AXI,地址和数据操作之间没有严格的时间关系。例如,主设备可以在写地址通道上发出写地址,但是对于主设备何时必须提供相应的数据以在写数据通道上写入没有时间要求。
  4. 支持不对齐数据传输。 对于任何由大于一个字节的数据传输组成的突发,访问的第一个字节可以与自然地址边界不对齐。例如,从字节地址0x1002开始的32位数据包不与自然32位地址边界对齐。
  5. 乱序事务完成。 AXI可以实现乱序事务完成。AXI协议包括事务标识符,并且对使用不同ID值完成事务没有限制。这意味着单个物理端口可以通过充当多个逻辑端口来支持乱序事务,每个逻辑端口按顺序处理其事务。
  6. 基于起始地址的突发事务。 AXI主设备只会为第一次传输发出起始地址。对于任何后续传输,slave将根据突发类型计算下一个传输地址。

2. 通道传输和事务( transfers and transactions)

transfer对应一次传输,transaction是对应一次或多次传输操作,或者说一个传输包。通常一个transaction由一个或者多个transfer组成。

2.1 Channel handshake(通道握手)

AXI4协议定义了五个不同的通道,AXI总线的五个通道各自独立,每个通道都有自己的双向握手机制。所有这些通道都共享基于VALID和READY信号的相同握手机制,如下图所示。
在这里插入图片描述

VALID信号 从【源】发送到【目的】,【源】使用VALID信号来指示信息有效。VALID信号必须保持断言状态,即设置为高电平,直到【目的】接收该信息。以这种方式保持断言的信号称为sticky signals(粘性信号)。
READY信号 从【目的】发送到【源】。 【目的】指示何时可以使用READY信号接受信息。

源端或目的端是主端还是从端取决于使用的是哪个通道。例如,主机是读地址通道的源端,但却是读数据通道的目的端。
用Valid信号表示主设备准备好发送,用Ready信号表示从设备准备好接收。一般Valid信号拉高时表示要发送数据的那一方当前的地址或者数据通道里对应的信息有效,接收的那一方拉高Ready表示已经准备好接收相应的信号。读写通道传输数据结束时,会拉高last信号以表示该数据是最后一个数据。

2.2 transfers和transactions的区别

  1. transfers通道传输是一次信息交换,只有一次VALID和READY握手。下图显示了一个传输transfers:
    在这里插入图片描述

2.事务transactions是一连串的传输,包括一次地址传输、一次或多次数据传输,对于写序列,还包括一次响应传输。下图显示了一个事务transactions:
在这里插入图片描述
一个transactions是一个完整的突发传输

2.3 通道传输示例(Channel transfer examples)

例子都是先是一个时钟信号,然后是一个信息总线,然后是VALID和READY信号

例1
在这里插入图片描述
(1)在时钟周期2中,VALID信号上升高电平,表明信息通道上的数据是有效的。
(2)在时钟周期3中,READY信号上身高电平,表明READY信号有效。
(3)握手在时钟周期4的上升沿完成,因为READY和VALID信号都被断言。
文档中总是提到这个断言,我目前理解的断言就是上升高电平

例2
在这里插入图片描述
(1)在时钟周期1,READY信号被断言。
(2)在时钟周期3,VALID信号被断言。
(3)当VALID和READY都被断言时,在时钟周期4的上升沿完成握手。

例3
在这里插入图片描述
(1)在时钟周期3,READY信号被断言。
(2)在时钟周期3,VALID信号被断言。
(3)当VALID和READY都被断言时,在时钟周期4的上升沿完成握手。

小结:在所有三个示例中,当时钟信号的上升沿上断言READY和VALID时,信息将沿着通道传递
READY可以在VALID之前或之后断言,并且可以同时断言

2.4 写传输:单数据项(Write transaction: single data item)

本小节描述:单个数据项的写事务的过程,以及用于完成该事务的不同通道。
此写事务涉及以下通道:写地址(AW)、写(W)、写响应(B)

  1. 首先,在写地址(AW)通道上有一个握手,如下图所示:
    在这里插入图片描述
    这个握手是主向从发送写地址。握手的事件顺序如下:
    主将地址发送在AWADDR上,并在时钟周期2中断言AWVALID,从在时钟周期3中断言AWREADY,表示它有能力接收地址值。 握手在时钟周期4的上升沿完成。
  1. 其次,在第一次握手之后,主通过写(W)通道将数据传输到从,如下图所示:
    在这里插入图片描述
    数据传输的事件顺序如下:从在时钟周期n中等待WREADY设置为高电平的数据。 主将数据放在WDATA总线上,并在时钟周期n+2中断言WVALID。 握手在时钟周期n+3的上升沿完成
  1. 最后,从使用写响应(Write Response, B)通道,在接收到所有WDATA后确认写事务已经完成。该响应如下图所示:
    在这里插入图片描述
    写响应的事件顺序如下:主断言BREADY。 从驱动BRESP来指示写事务的成功或失败,并断言BVALID。在时钟周期n+3的上升沿完成握手。

2.5 写事务:多数据项(Write transaction: multiple data item)

AXI是一种基于突发的协议,这意味着可以在单个事务中传输多个数据。我们可以在AW信道上传输一个地址,然后在这个地址传输多个数据,并带有相关的突发宽度和长度信息。

一个多数据传输的例子如下所示:
在这里插入图片描述
(1)AW通道传输一个地址,但是会在这个地址上进行三次数据传输。
(2)W通道上,我们可以看到有三个数据传输。从端驱动WLAST信号为高电平来表示最后的WDATA信号。所以从端可以计算数据传输次数,或者说可以监视WLAST信号(就是通过监视到WLAST信号为高的时候,表明是最后一个数据传输)。
(3)B通道上,一旦从端接收到所有WDATA传输,从端给出一个BRESP值(图中是Okey)。这一个单一的BRESP值覆盖了整个突发传输。如果从端发现传输中包含错误,它也必须等到整个突发事件完成后才能通知主端发生了传输错误。

2.6 读事务:单个数据项(Read transaction: single data item)

本小节将详细介绍单个数据项的读事务处理过程。此写事务涉及以下通道:读地址(AR)和读( R )

  1. 首先,在读地址(AR)通道上进行握手,如下图所示:
    在这里插入图片描述
    握手的事件顺序如下:(1)在时钟周期2中,主通过ARADDR向从服务器发送读数据的地址并断言ARVALID。(2) 在时钟周期3中,从断言ARREADY,表示它已准备好接收地址值。(3)在时钟周期4的上升沿完成握手。
  1. 接下来,在读( R )通道上,从将数据传输到主。数据传输过程如下图所示:
    在这里插入图片描述
    数据传输握手的事件顺序如下:
    (1)在时钟周期n中,主断言RREADY信号,表示它准备好了,正在等待接收数据。
    (2)在时钟周期n+2,从断言RVALID(表示我将发送有效数据),同时将要发送的数据放在RDATA上。由于这是单个数据事务,所以从也将RLAST信号设置为高(第一个数据就是最后一个数据)。并使用RRESP信号向主端表明读事务的成功或失败(图中是Okey)
    (3)在时钟周期n+3的上升沿完成握手。

2.7 读事务:多数据项(Read transaction: multiple data item)

AXI协议允许在同一事务中读取多个数据传输。这类似于写事务中描述的写突发。

下图显示了一个突发读传输的例子:
在这里插入图片描述

  1. AR通道上传输一个地址,在这个地址传输3个数据项,并附带相关的突发宽度和长度信息。
  2. 在R通道上,从向主传输三个数据。
    (1)主将RREADY信号设置为高电平,表示主准备好了,正在等待接收从的数据。
    (2)从在每次传输数据之前断言RVALID(表示我接下来要传输数据了),之后通过RDATA通道将数据传输给主,且在每次数据传输完的同时通过RRESP通道将Okay信息传回给主,在第三次数据传输时候断言RLAST信号表示这是最后一次数据传输,完成三次数据传输。
    图中是在第一次传输前两个Data之前断言一次RVALID,然后在第二次传输Data之前断言了一次RVALID,并且每次数据传输完成之后会跟上一个Okay

小结:
1. 读事务和写事务之间区别:对于读事务,事务中的每个传输都带有一个RRESP响应。在读事务中,从服务器使用相同的通道将数据发送回主服务器,并指示读操作的状态。在写事务中,从服务器必须在B通道上作为单独的传输发送响应。
2. 如果事务中的任何传输显示错误,必须完成事务的全部指定长度之后才能反馈,并不能提前终止信号传输。

3.通道信号Channel signals

AXI协议定义了五个通道:三个用于写信号,两个用于读信号。

3.1 写通道信号(Write channel signals)

用于写事务的通道有:写地址、写数据、写响应

3.1.1 写地址(Write Address)通道信号

下表显示了写地址通道信号:

Write Address (AW) channel signalsAXI version
AWVALIDAXI3 and AXI4
AWREADYAXI3 and AXI4
AWADDR[31:0]AXI3 and AXI4
AWSIZE[2:0]AXI3 and AXI4
AWBURST[1:0]AXI3 and AXI4
AWCACHE[3:0]AXI3 and AXI4
AWPROT[2:0]AXI3 and AXI4
AWID[x:0]AXI3 and AXI4
AWLEN[3:0] - AWLEN[7:0]AXI3 only - AXI4 only
AWLOCK[1:0] - AWLOCKAXI3 only - AXI4 only
AWQOS[3:0]AXI4 only
AWREGION[3:0]AXI4 only
AWUSER[x:0]AXI4 only

3.1.2 写数据(Write Data)通道信号

Write Data通道信号如下表所示:

Write Data (W) channel signalsAXI version
WVALIDAXI3 and AXI4
WREADYAXI3 and AXI4
WLASTAXI3 and AXI4
WDATA[x:0]AXI3 and AXI4
WSTRB[x:0]AXI3 and AXI4
WID[x:0]AXI3 only
WUSER[x:0]AXI4 only

3.1.3 写回应(Write Response)通道信号

下表显示了Write Response通道信号:

Write Response (B) channel signalsAXI version
BVALIDAXI3 and AXI4
BREADYAXI3 and AXI4
BRESP[1:0]AXI3 and AXI4
BID[x:0]AXI3 and AXI4
BUSER[x:0]AXI4 only

3.1.4 小结

  1. 每个通道中的所有信号都有相同的前缀:
    •AW表示写地址通道
    •W表示写数据通道
    •B表示写响应通道
  2. AXI3协议和AXI4协议中写通道的差异:
    (1)AWLEN信号对于AXI4协议来说更宽。因此,AXI4能够生成比AXI3更长的突发。
    (2)由于不支持锁定传输,因此AXI4将AWLOCK信号减少到单个bit位。
    (3)AXI4将AWQOS信号添加到AW通道。该信号支持AXI4协议中的服务质量(QoS)概念。
    (4)AXI4将AWREGION信号添加到AW通道。这个信号支持从区,它允许从一个物理从接口有多个逻辑接口。
    (5)AXI4从W通道移除WID信号。这是因为写入数据重新排序不再被允许。
    (6)AXI4向每个通道添加用户定义的信号。

3.2 Read channel signals

用于读事务的通道有:读地址和读数据

3.2.1 读地址通道信号

读地址通道信号如下表所示:

Read Address (AR) channel signalsAXI version
ARVALIDAXI3 and AXI4
AREADYAXI3 and AXI4
ARADDR[31:0]AXI3 and AXI4
ARSIZE[2:0]AXI3 and AXI4
ARBURST[1:0]AXI3 and AXI4
ARCACHE[3:0]AXI3 and AXI4
ARPROT[2:0]AXI3 and AXI4
ARID[x:0]AXI3 and AXI4
ARLEN[3:0] - ARLEN[7:0]AXI3 only - AXI4 only
RLOCK[1:0] - ARLOCKAXI3 only - AXI4 only
ARQOS[3:0]AXI4 only
ARREGION[3:0]AXI4 only
ARUSER[x:0]AXI4 only

3.2.2 读数据通道信号

读数据通道信号如下表所示:

Read Data ( R) channel signalsAXI version
RVALIDAXI3 and AXI4
READYAXI3 and AXI4
RLASTAXI3 and AXI4
RDATA[x:0]AXI3 and AXI4
RRESP[1:0]AXI3 and AXI4
RID[x:0]AXI3 and AXI4
RUSER[x:0]AXI4 only

3.2.3 小结

  1. 每个通道中的所有信号都具有相同的前缀:AR表示读地址通道、R表示读数据通道
  2. AXI3协议和AXI4协议中读通道的差异:
    (1)对于AXI4协议,读地址长度信号ARLEN更宽。因此,AXI4能够生成比AXI3更长的读突发。
    (2)由于不支持锁定传输,AXI4将ARLOCK信号减少到单个bit位。
    (3)与写通道信号一样,服务质量和从区的概念也适用于读事务。它们使用AR通道中的ARQOS和ARREGION信号。
    (4)AXI4向两个读通道添加用户定义的信号。

3.3 Data size, length, and burst type

每个读写事务都可以指定该事务的数据长度、大小和突发信号属性。在下面的属性列表中,x代表写和读,它们既适用于写地址通道,也适用于读地址通道:

  1. AxLEN
    AxLEN用传输数描述事务的长度。表示在一次transation中,有多少次transfers。
    对于AXI3,AxLEN[3:0]有4bit位,它指定了一个事务中可以传输1-16次数据传输。
    对于AXI4,AxLEN[7:0]有8bit位,它指定了一个事务中可以传输1-256次数据传输。

  2. AxSize
    AxSize[2:0] 描述每次数据传输中要传输的最大字节数。
    3个bit位可以表示每次传输1、2、4、8、16、32、64或128字节。

  3. AXI突发传输AxBURST
    在 AXI 总线中的突发传输是指,在地址总线上进行一次地址传输后,在这个地址进行多次数据传输。
    AXBURST[1:0]描述事务的突发类型 fixed, incrementing, wrapping
    下表显示了这些突发类型的不同属性:

突发类型使用说明长度(传输次数)对齐
0x00FIXED重复读取相同的地址。对fifo很有用。1-16固定字节通道仅由起始地址和大小定义
0x01INCRIncrementing burst.。前一次传输的地址为每次传输增加地址。增量值取决于传输的大小,由AxSIZE属性定义。用于块传输AXI3: 1-16/AXI4: 1-256支持未对齐传输。
0x10WRAPWrapping burst.类似于一个递增的突发,如果达到一个上限地址限制,地址包装到一个较低的地址。通常用于缓存线路访问2, 4, 8, or 16起始地址必须与传输大小对齐
0x11RESERVEDNot for use.--

3.4 支持访问权限信号

AXI提供访问权限信号,AWPROT和ARPROT,可以防止系统非法访问。例如,如果事务没有正确的保护级别,内存控制器可以通过使用这些信号拒绝读或写访问。
这对于像Arm TrustZone这样的安全解决方案很有用,其中处理器有两个独立的状态,安全和非安全。
AxPROT定义了三个级别的访问保护,如下图所示:
在这里插入图片描述
AxPROT位属性如下表所示:

AxPROTFunction
[0]AxPROT[0] (P )将访问标识为非特权或特权:1 indicates privileged access;0表示非特权访问
[1]AxPROT[1] (NS)将访问标识为安全或非安全:1表示非安全事务;0表示安全事务。
[2]AxPROT[2] (I)表示该事务是指令访问还是数据访问:1表示指令访问;0表示数据访问

3.5 Cache support

现代SoC系统通常包含放置在系统几个点上的缓存。例如,2级缓存可能位于处理器外部,或者3级缓存可能位于内存控制器里面。为了支持使用不同缓存策略的系统AWCACHE和ARCACHE信号指示事务如何在系统中进行。
下图显示了AxCACHE位分配:
在这里插入图片描述
AxCACHE位属性如下表所示:

AxCACHEFunction
AxCACHE [0]AxCACHE [0] (B)是可缓冲位。 表示这是可以delay的transaction,transaction可能是没有到达最终的目的地的。
AxCACHE [1]AxCACHE[1]是AX13中的可缓存位,或者是AX14中的可修改位modifiable。如果是modifiable,那么表示多个不同的写可以合并到同一个transactions中,读也是如此。
AxCACHE [2]AxCACHE[2]是RA位 。 读分配cache
AxCACHE [3]AxCACHE[3]是WA位。写分配cache

小结:如果没有断言可缓存位AxCACHE[1],则不能断言AxCACHE[2]和AxCACHE [3]

3.6 Response signaling

AXI为读和写事务提供响应信号。
对于读事务,从的响应信息使用RRESP在读数据通道上发出信号。
对于写事务,响应信息使用BRESP在写响应通道上发出信号。
RRESP和BRESP都是由两位组成的,对这两种信号的编码可以传递四种响应,如下表所示:

响应码说明
00 - OKAY正常访问成功或独占访问失败。
01 - EXOKAYOKAY是用于大多数事务的响应。OKAY表示正常访问已经成功 ;此响应还可以指示排他性访问失败。独占访问是指多个主服务器可以同时访问一个从服务器,但这些主服务器不能访问相同的内存范围。
10 - SLVERR独占访问,成功;EXOKAY表示独占访问的读或写部分已经成功。当访问成功到达从,但从想要返回一个错误条件给始发主时,使用SLVERR。这表示一个不成功的事务。例如,当尝试不支持的传输大小时,或者尝试对只读位置进行写访问时。
11 - DECERR解码错误。DECERR通常由互连组件生成,表示在事务地址处没有找到从。

OKEY: 表示访问成功,或表示独占访问失败。
EXOKEY: 表示独占访问成功
SLVERR: 表示slave返回了错误,如错误的transfer size或去写了一个只读的地址。
DECERR:去访问了一个不存在的slave

3.7 Write data strobes写数据频闪信号

WSTRB表示写的哪些字节是有效的。 例如,考虑一个64位写数据总线。WSTRB信号有8位,每个字节一个。下图显示了示例WSTRB值如何指定哪些字节通道是有效的:
在这里插入图片描述
假设有效数据仅位于数据总线的前六个有效字节中,从字节7到字节2。主需要用十六进制值0xFC来控制WSTRB信号。
eg:
仅在数据总线的字节2,3,4,5中有效的数据需要WSTRB信号值为0x3C。
仅在数据总线的字节0和7中的有效数据需要WSTRB信号值为0x81。
仅在数据总线的字节3,5,6,7中有效的数据需要WSTRB信号值0xE8。

3.8 带有锁信号的原子访问( Atomic accesses with the lock signal)

AxLOCK信号用于指示何时执行原子访问。
AXI协议提供了两种机制来支持原子性:

  1. 锁定访问
    锁定的传输将通道锁定,该通道将保持锁定状态,直到生成未锁定的传输。
    锁定事务应该只用于遗留设备。只有AXI3支持锁定访问。AXI4不支持锁定访问。

  2. 独占访问
    独占访问比锁定事务更有效,并且它们允许多个主服务器同时访问一个从服务器

  3. 在AXI3中,AxLOCK信号由两个位组成,其值如下
    0b00 - Normal
    0b01 - Exclusive
    0b10 - Locked
    0b11 - Reserved

  4. 在 AXI4中,AxLOCK信号由1位组成,其值如下:
    0b0 - Normal
    0b1 - Exclusive

3.9 服务质量Quality of service

服务质量就是对优先级进行排序,通过确保更重要的事务得到更高的优先级来提高系统性能
服务质量信号有两种:

  1. AWQOS在每个写事务的写地址通道上发送。
  2. ARQOS在每个读事务的读地址通道上发送。

两个信号都是4位宽,其中0x0表示最低优先级,0xF表示最高优先级。

下图显示了一个带有直接内存控制器(DMC)的示例系统,下图是DMC-400。这个控制器管理到DRAM的事务:
在这里插入图片描述
实际应用中,CPU需要内存访问远比其他组件(如GPU或VPU)多,DMC重新排序事务以确保给出正确的优先级。

3.10 区域信号(Region signaling)

这个是AXI4中的新特性。
使用区域标识符时,表示从端上的单个物理接口可以提供多个逻辑接口。每个逻辑接口在系统地址映射中可以有不同的位置。
当使用区域标识符时,从端可以不支持不同逻辑接口之间的地址解码。
区域信号使用两个4位区域标识符,AWREGIONARREGION。这些区域标识符可以唯一地标识最多16个不同的区域。

3.11 User signals

AXI4接口信号集可以选择包含一组用户定义的信号,称为User信号。用户信号可以在每个通道上用于在主从组件之间传输额外的自定义控制信息。这些信号是可选的,不必在所有通道上都支持。如果使用它们,则User信号的宽度由用户自己实现定义。

3.12 AXI协议不同通道的依赖关系(AXI channel dependencies)

AXI协议定义了不同通道之间的依赖关系。
三个主要依赖项如下:

  1. WLAST传输必须在断言BVALID之前完成。
    在主服务器可以看到写响应之前,主服务器必须发送所有的写数据。AXI3中不存在这个依赖项,在AXI4中新引入的。
    (1)在AXI3中,在发送写响应之前不必看到地址。
    (2)在AXI4中,所有的数据和地址必须在主看到写响应之前被传输。
  2. 在ARADDR被传输之前不能断言RVALID。
    从端在没有看到地址的情况下不能传输任何读数据。(从服务器不知道读取数据的地址,它就不能将数据取出用于读或写。)
  3. WVALID可以在AWVALID之前断言。
    在发送地址之前,slave应该把数据先发出数据。
  • 26
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值