SRIO系列-基本概念及IP核使用

参考:串行RapidIO: 高性能嵌入式互连技术 | 德州仪器

           SRIO协议技术分析 - 知乎

           PG007

目录

一、SRIO介绍

1.1 概要

1.2 SRIO与传统互联方式的比较

1.3 串行SRIO标准

1.4 SRIO层次结构:

1.4.1 逻辑层

1.4.2 传输层协议

1.4.3 物理层

二、Xilinx SRIO系统架构

1、速度等级支持

2、架构

2.2.1 逻辑层接口

2.2.1.1 I/O Port

2.2.1.2 Message Port:

2.2.1.3 Maintenance port:

2.2.1.4 User-Defined Port:

3、BUFFER

4、Physical Layer Interface

5、 Clocking

 三、SRIO传输包格式

3.1 HELLO 包格式

3.2 HELLO传输报文的大小要求

四、SRIO事务类型


一、SRIO介绍

1.1 概要

在嵌入式系统应用领域,DSP,FPGA,PowerPC等嵌入式处理器的出现后,工程师将多种处理器组合,形成模块。模块通过背板相连,形成整机,实现更大的系统应用。新的嵌入式系统互联结构必须具备以下特点:

  1. 架构独立,不依赖具体的硬件和软件。
  2. 灵活的拓扑结构,不局限于PC架构的星状结构。
  3. 传输速率高,并向下兼容。
  4. 具有流控功能,错误校验及广播功能。
  5. 具有分层结构,后续功能扩展不影响其他层次

针对以上需求,2000年,存储领域的OEM和FPGA/DSP/交换结构芯片制造商成立了RapidIO Trade Association 组织。提供了一种针对嵌入式运用的低延时的、基于包交换与分发结构的新型总线结构,被命名为RapidIO,又被成为SRIO。

SRIO支持3C连接:Chip-to-Chip、Card-to-Card、Chassis-to-Chassis。

(1)从灵活性的角度来说,SRIO协议可支持嵌入式系统的星状、网状、环状、树状及菊花链等多种拓扑结构。
(2)从架构独立性的角度来讲,SRIO协议是由硬件实现,所以对现存的操作系统和运用软件是透明的。它支持读、写、流、原子操作等及消息传递机制,应用层软件简单。
(3)从速率、带宽性能及可裁剪上讲,SRIO1.3版支持1.25、2.5、3.125Gbps。采用8B/10B编码,带宽利用率高。

1.2 SRIO与传统互联方式的比较

随着高性能嵌入式系统的不断发展,芯片间及板间互连对带宽、成本、灵活性及可靠性的要求越来越高,传统的互连方式,如处理器总线、PCI总线和以太网,都难以满足新的需求 。

1.3 串行SRIO标准

RapidIO行业协会成立于2000年,其宗旨是为嵌入式系统开发可靠的,高性能,基于包交换的互连技术。RapidIO协议的简要发展历史是:

  1. 2001年初,最初的标准被发布
  2. 2002年6月,1.2版标准发布
  3. 2005年6月,1.3版标注发布

串行RapidIO是物理层采用串行差分模拟信号传输的RapidIO标准。SRIO 1.x 标准支持的信号速度为1.25GHz、2.5GHz、3.125GHz;正在制定的RapidIO 2.0标准将支持5GHz、6.25GHz.

目前,几乎所有的嵌入式系统芯片及设备供应商都加入了RapidIO行业协会。

1.4 SRIO层次结构:

RapidIO标准被定义为三个层:逻辑层、传输层和物理层。

逻辑层定义了总体协议和数据包格式。这是端点启动和完成事务所必需的信息。

传输层提供了数据包从端点移动到端点所需的路由信息。

物理层描述了设备级的接口细节,如数据包传输机制、流量控制、电气特性和低级错误管理。此分区提供了向逻辑规范中添加新的事务类型的灵活性,而不需要对传输或物理层规范进行修改。

像以太网一样,RapidIO也是基于包交换的互连技术。RapidIO包由包头、可选的载荷数据和16bits CRC校验组成。包头的长度因为包类型不同可能是十几到二十几个字节。每包的载荷数据长度不超过256字节,这有利于减少传输时延,简化硬件实现。下图包格式定义兼顾了包效率及组包/解包的简单性。RapidIO交换器件仅需解析前后16bits,以及源/目地器件ID,这简化了交换器件的实现。

1.4.1 逻辑层

逻辑层定义了操作协议和相应的包格式。RapidIO支持的逻辑层业务主要是:直接IO/DMA (Direct IO/Direct Memory Access)和消息传递(Message Passing)。

直接IO/DMA模式是最简单实用的传输方式,其前提是主设备知道被访问端的存储器映射。在这种模式下,主设备可以直接读写从设备的存储器。直接IO/DMA在被访问端的功能往往完全由硬件实现,所以被访问的器件不会有任何软件负担。

对上层应用来说,发起直接IO/DMA传输主要需提供以下参数:目地器件ID、数据长度、数据在目地器件存储器中的地址。

直接IO/DMA模式又可进一步分为以下几种传输格式:

  1. NWRITE: 写操作,不要求接收端响应。
  2. NWRITE_R: 带响应的NWRITE(NWRITE with Response),要求接收端响应。
  3. SWRITE:流写(Stream Write),数据长度必须是8字节的整数倍,不要求接收端响应。
  4. NREAD: 读操作。

SWRITE是最高效的传输格式;带响应的写操作或读操作效率则较低,一般只能达到不带响应的传输的效率的一半。
消息传递(Message Passing)模式则类似于以太网的传输方式,它不要求主设备知道被访问设备的存储器状况。数据在被访问设备中的位置则由邮箱号(类似于以太网协议中的端口号)确定。从设备根据接收到的包的邮箱号把数据保存到对应的缓冲区,这一过程往往无法完全由硬件实现,而需要软件协助,所以会带来一些软件负担。

下表比较了直接IO/DMA和消息传递模式。

1.4.2 传输层协议

RapidIO是基于包交换的互连技术,传输层定义了包交换的路由和寻址机制。

RapidIO网络主要由两种器件,终端器件(End Point)和交换器件(Switch)组成。终端器件是数据包的源或目的地,不同的终端器件以器件ID来区分。RapidIO支持8 bits 或 16 bits器件ID,因此一个RapidIO网络最多可容纳256或65536个终端器件。与以太网类似,RapidIO也支持广播或组播,每个终端器件除了独有的器件ID外,还可配置广播或组播ID。交换器件根据包的目地器件ID进行包的转发,交换器件本身没有器件ID。

RapidIO的互连拓扑结构非常灵活,除了通过交换器件外,两个终端器件也可直接互连

1.4.3 物理层

为了支持全双工传输,串行RapidIO收发信号是独立的,所以每一个串行RapidIO口由4根信号线组成。标准的1x/4x 串行RapidIO接口,支持四个口,共16根信号线。这四个口可被用作独立的接口传输不同的数据;也可合并在一起当作一个接口使用,以提高单一接口的吞吐量。

下图为德州仪器TMS320C6455 DSP 1x/4x 串行RapidIO接口框图

发送时,逻辑层和传输层将组好的包经过CRC编码后被送到物理层的FIFO中,“8b/10b编码”模块将每8bit数据编码成10bits数据,“并/串转换”模块将10bits并行数据转换成串行bits,发送模块把数字bit转换成差分交流耦合信号在信号线上发送出去。这里的8b/10编码的主要作用是:

  1. 保证信号有足够的跳变,以便于接收方恢复时钟。串行RapidIO没有专门的时钟信号线,接收端靠数据信号的跳变恢复时钟。所以需要把信号跳变少的8bits数据(如全0或全1)编码成有一定跳变的10bits数据。另外,也使得总体数据中0和1的个数均衡,以消除直流分量,保证交流耦合特性;
  2. 8b/10编码可扩大符号空间,以承载带内控制符号。10bits能表示1024个符号,其中256个表示有效的8bits数据,剩下的符号中的几十个被用作控制符号。控制符号可被用作包分隔符,响应标志,或用于链路初始化,链路控制等功能;
  3. 8b/10编码能实现一定的检错功能。1024个符号中,除了256个有效数据符号和几十个控制符号外,其它符号都是非法的,接收方收到非法符号则表示链路传输出错。

接收的过程则正好相反,首先接收方需要根据数据信号的跳变恢复出时钟,用这个时钟采样串行信号,将串行信号转换为10bits的并行信号,再按8b/10b编码规则解码得到8bits数据,最后做CRC校验并送上层处理。

数据被正确的接收时,接收端会发送一个ACK响应包给发送端;如果数据不正确(CRC错或非法的10bits符号),则会送NACK包,要求发送方重传。这种重传纠错的功能由物理层完成,而物理层功能往往由硬件实现,所以不需要软件干预。

二、Xilinx SRIO系统架构

1、速度等级支持

SRIO IP核支持1x 2x 4x  Line Width,单个Lane的速度支持1.25Gbps、2.5Gbps、3.125Gbps、5.0Gbps、6.25Gbps。(所以用到的应该是CPLL)

2、架构

 主要包括:逻辑层(LOG)、共享BUFFER(BUF)、PHY层(PHY)

LOG:只要定义传输的事务,以及具体的帧结构。

BUF:共享BUFFER,主要用来进行跨时钟域,因为逻辑层和PHY层之间的时钟是不同的。

PHY:主要用来进行数据编码、流控、字节对齐等功能。

2.2.1 逻辑层接口

主要包括:

用户接口:用户接口主要包括I/O接口和三个可选的接口 (消息接口、维护接口、用户定义接口)。主要看一下I/O Port。

2.2.1.1 I/O Port

I/O接口所支持的基本操作如下:

操作使用的事务描述
NREAD、RESPONSE从目标器件中读数据
NWRITE向目标器件写数据
带响应的写NWRITE_R向目标器件写数据,目标器件执行完之后回复响应
流写SWIRTE大量数据写操作
门铃
DOORBELL

I/O Port支持的报文格式:HELLO 报文、SRIO Stream报文

I/O支持两种接口格式:

 Condensed I/O:Condensed I/O就是一种压缩的数据接口。一个AXI-Stream通道用来传输所有的与发送相关的所有包类型,一个AXI-Stream通道用来接收所有的与接收相关的所有包类型。

Initiator/Target Port:一种标准的接口,将不同的事务传输进行分离。主要分为4个接口,如下图

ireq:用来发送本地生成的请求。

iresp:用来接收对端发送过来的响应。

treq:用来接收对端的请求。

tresp:用来向对端发送响应。

2.2.1.2 Message Port:

Message Port主要用来传输消息事务,但消息事务也可以使用I/O端口。消息传递端口是一个可选的接口(消息也可以组合到I/O端口上,并使用Vivado集成设计环境(IDE)设置将其视为写入事务)。一个单独的消息传递端口遵循启动器/目标样式。启动器/目标端口样式允许将针对远程设备的事务与针对本地端点的事务分离。

2.2.1.3 Maintenance port:

用来传输维护数据包。如果启用了维护端口,则它将使用AXI4-Lite接口。AXI4-Lite界面允许用户应用程序定位本地或远程配置空间。

2.2.1.4 User-Defined Port:

如果是用户自定义的数据,则应该使用User-Defined Port,用户自定义的数据包传输到其它的接口会被丢弃。用户定义的端口是一个可选的端口,它有两个AXI4-流通道,其中一个通道用于传输方向,另一个通道用于接收方向。用户定义的端口仅使用SRIO流格式。

3、BUFFER

Buffer支持8、16、32个数据包的深度,可以tx缓冲区和rx缓冲区。

TX缓冲区是一个存储和转发缓冲区,旨在为低的包到包的延迟来最大限度地提高流吞吐量。传输缓冲区必须保存每个包,直到它被链路伙伴设备成功接收为止,此时包被释放,为额外的包腾出空间。在缓冲区中积累多个未发送包的情况下,通常发生在流控制时,BUF根据类型和优先级对包进行重新排序,首先发出响应包,然后发出请求。BUF还可以在必要时处理跨时钟与处理。在生成IP核时,可以添加或删除跨时钟域逻辑。(在多lane时,跨时钟域逻辑是非常推荐的)

接收缓冲区作为FIFO,用于将数据存储和转发到LOG接收路径中。接收缓冲区还具有跨时钟域逻辑,它允许逻辑层/用户设计和PHY以不同的时钟速率运行。与传输缓冲区设计一样,这种逻辑被推荐用于多lane。

4、Physical Layer Interface

 物理层(PHY)处理链路训练(链路建立)、初始化和协议。在这个工作中包括插入CRC和确认标识符到输出的数据包。PHY还可以与串行收发器进行接口。

5、 Clocking

 PHY可以在两个时钟域上运行: phy_clk,这是主核心时钟,和gt_pcs_clk,这是用于串行收发器接口。gt_clk不由PHY使用,但由串行收发器接口使用。gt_pcs_clk是gt_clk速率的一半。作为一般规则,phy_clk等于(gt_clk *操作链路宽度)/4。所以对于一个2x的核,phy_clk的频率是gt_clk的一半。如果核心列车下降到1x模式,phy_clk必须切换到gt_clk速率的四分之一。串行收发器还需要一个使用收发器的的参考时钟(refclk)。当生成核心时,参考时钟频率被选择(可用选项取决于体系结构和线路速率。

时钟频率关系
phy_clkphy_clk = (gt_clk * link width)/4主要的核时钟
gt_pcs_clkgt_pcs_clk = 1/2 * gt_clk主要终于Serial Transceiver interface
refclk见下表用于Serial Transceiver interface
log_clklog_clk >=phy_clk
cfg_clkcfg_clk = log_clk配置寄存器接口时钟

 不同lane下的时钟关系:

 对于7系列FPGAs,使用MMCM从串行收发器(GT)参考时钟生成时钟。时钟方案的方框图如下:

 三、SRIO传输包格式

3.1 HELLO 包格式

为了简化数据包的构造,可以将用户接口端口配置为使用Header Encoded Logical Layer Optimized (HELLO) 格式。这种格式允许数据包类型的报头字段放置位置的标准化。它还将报头和数据分割成接口上单独的传输。这导致了更简单的控制逻辑,并允许数据对齐以传输边界,以简化数据管理。

字段位置
TID[63:56]包的事务ID。SRIO规范只允许在给定的时间有一个给定TID和Source/Destination ID的未完成的数据包
FTYPE[55:52]对于数据包的事务分类。HELLO报文所支持的FTYPE主要有2,5,6,A,B,D。根据生成IP核的选择,IP核可能只支持一个子集。
TTYPE[51:48]数据包的事务类型。仅对FTYPE为2、5、13的数据包定义一些其它的功能。
priority[46:45]数据包的优先级。请求数据包必须仅使用优先级0-2。响应包优先级应该是请求优先级+1
CRF[44]数据包的关键请求流标志。
size[43:36]数据有效负载大小,以字节为单位,减去1
Error(E)[35]除了响应数据包之外,其他都是保留的。当此位被设置表示数据包错误。
address[33:0]事务的字节地址。
info[31:16]只用于DDRBELL数据包
msglen-1[63:60]构成消息序列的数据包数;仅适用于消息消息。
msgseg-1[59:56]此数据包所表示的消息段;仅适用于MESSAGEs。保留用于单段消息。

mailbox

[9:4]事务处理目标的邮箱;仅适用于消息包。除了单段消息外,还保留了上面的四个位。
letter[1:0]仅为消息包使用的字母字段。指示邮箱中的一个插槽
S、E、R、xh、O、P[63:56]

S-开始。如果设置,则该包是正在传输的新PDU的第一段。

E-结束。如果设置了,表示这一包是PDU的最后一段。如果S和E都设置了,则代表这一次PUD传输只有这一个数据包

R-保留

xh-不支持

O-奇数。如果设置了,负载的数量有奇数了半字。

P-Pad。如果设置了,那么Pad用于填充到半字节的边界。

cos[43:36]服务分类
streamID[31:16]端到端流量流标识符。
length[15:0]PDU的长度

3.2 HELLO传输报文的大小要求

HELLO数据包中的size字段是传输中的字节数减去一(有效范围为0到255,对应真实大小为1到256字节)。size和address字段必须与相应的RapidIO数据包类型的有效size、address和wdptr字段相对应。RapidIO核不能把Size域中的非法值修正为实际RapidIO包中Size域的有效值,所以需要对HELLO格式包的Size域提供一个正确的值。由于AXI4-Stream协议中tdata信号为8个字节,也就是一个双字(Double Word),所以Size域的值需要分两种情况讨论:传输的数据量小于8字节和传输的数据量大于8字节。

传输的数据量小于8字节(Sub-DWORD Accesses):

       对于传输的数据量小于8字节的情况,address字段和size字段用来决定有效的字节位置(tkeep信号必须为0xff),但是仅仅能导致RapidIO包中rdsize/wrsize和wdptr为有效值的address和size值组合才是被允许的,下图是HELLO格式中address和size两个字段与有效字节位置的对应关系示意图(图中灰色部分为有效字节位置)

例如,对size=2,address=34’h1_1234_5675这两个组合来说,由于size=2,所以往address中写入的数据个数为3(size+1)个字节,而address的最低3位为5(3’b101),通过上图可知,有效字节的位置是第7、6、5三个字节。对于size和address[2:0]值的组合不在上图中的情况都是非法的,这是应该避免的,比如,size=2, address=34’h1_1234_5673这种组合就属于非法的组合。

传输的数据量大于8字节(Large Accesses):

       对于传输的数据量大于8字节,并且地址的起始字节偏移不为0的情况必须把数据分成多次进行传输,其中未对齐的小于8字节的段就可以通过上图中size和address的有效组合来确定有效字节的位置。另一种解决办法是,读操作的数据量大小可以被增加到下一个支持的大小,然后从对应的响应中剥离出必要的数据。

       因此,对于数据量为1个双字(8个字节)或更大的情况,address的最低3位必须为0,RapidIO手册给读写事务定义了范围从1到256个字节的可支持的数据量。请求事务的数据量如果大于一个双字(8个字节),那么数据量应该通过四舍五入到最接近的支持的值。读写事务有效的HELLO格式的数据量为:7,15,31,63,95(仅支持读事务),127,159(仅支持读事务),191(仅支持读事务),223(仅支持读事务)和255。

       对于写事务的数据量介于以上这些支持的数据量中间的情况,在通道的tlast信号为1之前应该给RapidIO核提供必要的数据量,仅仅提供的数据才能被发送。同理,用户的设计提供的数据可能少于期望的数据量,那么实际的数据量应该被写入,传输应该假设完成。

       RapidIO协议不支持传输的数据量大于256字节的情况,并且逻辑层(Logical)也不能把大于256字节的数据量分割为小的数据量进行发送。如果不满足这个要求可能会导致致命的链路错误,在这种错误情况下,链路可能会不断重传数据量大于256字节的包。

       HELLO格式数据的包头(Header)在用户接口的第一个有效时钟上,如果发送的事务携带数据负载,那么数据负载紧接着包头(Header)后面进行连续发送。包的Source ID和Destination ID放在tuser信号中并与包头(Header)一样,在第一个有效时钟下进行发送,发送完毕以后,tuser信号的数据被忽略。

       下图是携带有数据负载HELLO格式包在用户接口上传输的时序图,这个传输有4个双字(32个字节)的数据负载,加上包头,整个传输一共花费了5个时钟周期。用户只需要把想要发送的数据按照下图的时序图送入RapidIO核的AXI4-Stream接口,RapidIO核就能把它转化为标准的RapidiO串行物理层的包发出去从而完成一次事务的交互。

       下图是一种更复杂的传输示意图。首先,有两个背靠背(back-to-back)单周期包(包不带数据负载,仅包含一个包头)。包的边界通过拉高tlast信号进行指示。在单周期包传输完毕以后,主机等待了一个时钟周期才开始发送下一个包。在发送第三个包的过程中,主机(Master)和从机(Slave)分别通过拉低tvalid和tready信号一个时钟周期来暂停数据的发送,由于第三个包的数据负载为2个双字,所以传输第三个包一共消耗了3个有效时钟,加上2个无效的时钟周期,一共消耗了5个时钟周期。

四、SRIO事务类型

SRIO(Serial Rapid IO)事务(transaction)类型有SRIO包(packet)中的Ftype和Ttype决定,其中比较重要的是:

Nread(Ftype = 2,Ttype = 4),功能是读制定的地址;

NWRITE(Ftype = 5,Ttype = 4)表示往指定的地址写数据;

NWRITE_R(Ftype = 5,Ttype = 5),表示往指定的地址写数据,写完之后接收目标期间的响应,即所谓的带响应的写;

SWRITE(Ftype = 6,Ttype 保留),表示以流写方式写指定的地址,与NWRITE以及NWRITE_R相比,这种方式效率最高;

DOOREBELL(Ftype = 10,Ttype 保留),这是一个门铃中断,具体什么用途,后面应该会总结。

当然事务类型不止这些,需要其他的话, 下面有一张表可以查询。

Ftype

(Format Type)

Ttype

(Transaction Type)

包类型

功能

0~1

——

Reserve

2

4’b0100

NREAD

读指定的地址

4’b1100

ATOMIC increment

先往指定的地址中传递数据,在把传递的数据加1,此操作为原子操作,不可打断

4’b1101

ATOMIC decrement

先往指定的地址中传递数据,在把传递的数据减1,此操作为原子操作,不可打断

4’b1110

ATOMIC set

把指定地址中的数据每个bit全部写1

4’b1111

ATOMIC clear

把指定地址中的数据清0(每个bit全部清零)

3~4

——

Reserve

5

4’b0100

NWRITE

往指定的地址写数据

4’b0101

NWRITE_R

往指定的地址写数据,写完成以后接收目标器件(Target)的响应

4’b1101

ATOMIC test/swap

对指定地址中的数据进行测试并交换,此操作为原子操作,不可打断

6

4’bxxxx

SWRITE

以流写方式写指定的地址,与NWRITE以及NWRITE_R相比,此方式效率最高

7

——

Reserve

8

4’b0000

MAINTENANCE read request

发起读配置,控制,状态寄存器请求

4’b0001

MAINTENANCE write request

发起写配置,控制,状态寄存器请求

4’b0010

MAINTENANCE read response

产生读配置,控制,状态寄存器响应

4’b0011

MAINTENANCE write response

产生写配置,控制,状态寄存器响应

4’b0100

MAINTENANCE write resquest

端口写请求

9

——

Reserve

10

4’bxxxx

DOORBELL

门铃

11

4’bxxxx

MESSAGE

消息

12

——

Reserve

13

4’b0000

RESPONSE

no data

不带有效数据的响应包

4’b1000

RESPONSE

with data

带有效数据的响应包

14~15

——

Reserve

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

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

相关文章

动手写sql 《牛客网80道sql》

第1章:SQL编写基础逻辑和常见问题 基础逻辑 SELECT语句: 选择数据表中的列。FROM语句: 指定查询将要从哪个表中检索数据。WHERE语句: 过滤条件,用于提取满足特定条件的记录。GROUP BY语句: 对结果进行分组。HAVING语句: 对分组后的结果进行条件过滤。O…

Springboot项目的测试类书写(速通)

目录 前言1. 单元测试的测试类2. 框架测试的测试类 前言 在实际开发中,如果只是做一个简单的单元测试(不涉及端到端、数据库交互、API调用、消息队列处理等),我为了方便一般都是找块儿地方写一个main方法来跑一下就行了&#xff…

支付系统核心逻辑 — — 状态机(JavaGolang版本)

支付系统核心逻辑 — — 状态机 代码地址:https://github.com/ziyifast/ziyifast-code_instruction/tree/main/state_machine_demo 1 概念:FSM(有限状态机),模式之间转换 状态机,也叫有限状态机&#xff08…

UE5 HLSL 详细学习笔记

这里的POSITION是变量Position的语义,告诉寄存器,此变量的保存位置,通常语义用于着色器的输入和输出,以冒号“:”的方式进一步说明此变量,COLOR也类似 还有什么语义呢? HLSL核心函数&#xff1a…

云服务器安装Mysql、MariaDB、Redis、tomcat、nginx

前置工作 进入根目录 cd / 都在/usr/local/src文件夹) 上传压缩包 rz 压缩包 Mysql 1.下载并安装MySQL官方的 Yum Repository wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release-el7-5.noarch.rpm yum…

每日算法4/17

1552. 两球之间的磁力 题目 在代号为 C-137 的地球上,Rick 发现如果他将两个球放在他新发明的篮子里,它们之间会形成特殊形式的磁力。Rick 有 n 个空的篮子,第 i 个篮子的位置在 position[i] ,Morty 想把 m 个球放到这些篮子里&…

工业数学模型——高炉煤气发生量预测(三)

1、工业场景 冶金过程中生产的各种煤气,例如高炉煤气、焦炉煤气、转炉煤气等。作为重要的副产品和二次能源,保证它们的梯级利用和减少放散是煤气能源平衡调控的一项紧迫任务,准确的预测煤气的发生量是实现煤气系统在线最优调控的前提。 2、…

A Geolocation Databases Study(2011年)第二部分:Geolocation Services

下载地址:A Geolocation Databases Study | IEEE Journals & Magazine | IEEE Xplore 被引次数:195 Shavitt Y, Zilberman N. A geolocation databases study[J]. IEEE Journal on Selected Areas in Communications, 2011, 29(10): 2044-2056. 2. Geolocation Services…

2024认证杯数学建模C题思路模型代码

目录 2024认证杯数学建模C题思路模型代码:4.11开赛后第一时间更新,获取见文末名片 以下为2023年认证杯C题: 2024年认证杯数学建模C题思路模型代码见此 2024认证杯数学建模C题思路模型代码:4.11开赛后第一时间更新,获…

一文掌握:图片转Base64编码的原理、实践(自定义图片本地缓存等)以及优化事项

图片转Base64是指将一幅图片(如PNG、JPEG、GIF等格式)的二进制数据编码为符合Base64规范的文本字符串的过程。图片Base64编码将图片数据转换为ASCII字符串,便于网络传输和存储。实现步骤包括读取图片文件、转换为字节数组,再通过编…

Windows 安装 A UDP/TCP Assistant 网络调试助手

Windows 安装 A UDP/TCP Assistant 网络调试助手 0. 引言1. 下载地址2. 安装和使用 0. 引言 需要调试一个实时在线聊天程序,安装一个UDP/TCP Assistant 网络调试助手,方便调试。 1. 下载地址 https://github.com/busyluo/NetAssistant/releases 2. 安…

Vue3项目 网易严选_学习笔记

Vue3项目 网易严选_第一天 主要内容 项目搭建vuex基础路由设计首页顶部和底部布局 学习目标 知识点要求项目搭建掌握vuex基础掌握路由设计掌握首页顶部和底部布局掌握 一、项目搭建 1.1 创建项目 vue create vue-wangyi选择vue3.0版本 1.2 目录调整 大致步骤&#xff…

美格智能出席紫光展锐第三届泛金融支付生态论坛,引领智慧金融变革向新

4月16日,以“融智创新,共塑支付产业新生态”为主题的紫光展锐第三届泛金融支付生态论坛在福州举办,来自金融服务机构、分析师机构、终端厂商、模组厂商等行业各领域生态伙伴汇聚一堂,探讨金融支付产业的机遇与挑战。作为紫光展锐重…

个人网站制作 Part 24 添加用户反馈功能[Userback] | Web开发项目添加页面缓存

文章目录 👩‍💻 基础Web开发练手项目系列:个人网站制作🚀 添加用户反馈功能🔨使用反馈工具🔧步骤 1: 选择反馈工具🔧步骤 2: 注册Userback账户🔧步骤 3: 获取反馈按钮代码 使用Vue.…

生成对抗网络GAN的扩展应用理解

注:本文仅个人学习理解,如需详细内容请看原论文! 一、cycleGAN 1.整体架构: 将图片A通过生成器生成图片B,然后通过判别器判别图片B的真假;并且图片B通过另一个生成器生成A‘,让A和A’近似。 2…

Linux 下的文件夹对比工具 vddiff 介绍

大家好,我是孔令飞,字节跳动云原生开发专家、前腾讯云原生技术专家;《企业级Go项目开发实战》作者,云原生实战营 知识星球星主。欢迎关注我的公众号【令飞编程】,干货不错过。 在大家的日常工作中有没有遇到以下场景&a…

初始Next.js

版本: 本系列next.js基于的是目前最新版本的 v14 版本,需要 Node.js 18.17 及以后版本 创建项目: 最快捷的创建 Next.js 项目的方式是使用 create-next-app脚手架,你只需要运行: npx create-next-applatest&&am…

FinalShell 远程连接 Linux(Ubuntu)系统

Linux 系列教程: VMware 安装配置 Ubuntu(最新版、超详细)FinalShell 远程连接 Linux(Ubuntu)系统Ubuntu 系统安装 VS Code 并配置 C 环境 ➡️➡️➡️提出一个问题:为什么使用 FinalShell 连接&#xff0…

Python-VBA函数之旅-filter函数

目录 一、filter函数的常见应用场景: 二、filter函数的使用注意事项: 1、filter函数: 1-1、Python: 1-2、VBA: 2、相关文章: 个人主页:非风V非雨-CSDN博客 一、filter函数的常见应用…

FY-SA-20237·8-ElectricHealing

Translated from the Scientific American, July/August 2023 issue. Electric Healing (电疗) New bandage zaps and medicates chronic wounds 新型创可贴治疗慢性伤口 Paragraph 1 Some wounds won’t heal by themselves. 翻译:一些伤口不会自愈。 解释&…