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

FPGA - 7系列 FPGA内部结构之CLB -03- CLB相关原语以及应用

前言

本文节选UG474的第二章,进行整理翻译。CLB资源被FPGA综合工具自动有效地使用,不需要任何特殊的FPGA专用编码。一些HDL编码建议和技术可以帮助优化设计以获得最大效率。

设计检查清单

这些指南是为有效使用7系列CLB的设计建议提供的快速核对表。7系列CLB的设计建议:

  • 资源利用

  • 使用通用的HDL代码,让综合和映射工具选择特定的FPGA CLB资源。

  • 只有在需要满足密度或性能要求时,才考虑实例化特定资源。或性能要求时才考虑实例化特定的资源。

  • 将结果与估计的片数相比较,以验证设计效率。

  • 如果一个设计在目标器件中的资源用完了,请检查哪种资源是限制因素,并考虑将其作为设计的一部分。资源是限制因素,并考虑使用替代资源,例如 将寄存器移至SRL或分布式RAM,或将分布式RAM移至块RAM、 或进位逻辑到DSP片上。

  • 管道化

    • 设计者应该使用顺序设计技术和流水线来利用丰富的触发器来提高性能。
  • 控制信号

    • 只在必要时使用控制信号。
    • 避免使用路由全局复位信号,尽量减少使用局部复位,以最大限度地利用FPGA资源。
    • 使用高电平的控制信号。
    • 避免在同一个触发器上同时使用设置和复位。
    • 避免在小型移位寄存器和存储阵列上使用控制信号,以便使用LUT而不是触发器,从而最大限度地提高利用率和减少功耗。
  • 软件选项

    • 为了自动提高性能,使用时序约束,并通过软件选项换取更长的执行运行时间。

使用CLB资源

赛灵思建议使用通用HDL代码,并允许工具推断CLB资源的使用情况。使用为7系列FPGA设计的IP解决方案可以帮助充分利用CLB资源尽管CLB中的任何功能都可以直接实例化,包括LUT、进位逻辑和顺序元素,但实例化应主要用于指定何时应使用CLB以外的资源,如DSP片。如果综合工具没有推断出所需的特殊CLB资源,如宽多路复用器、分布式RAM或SRL功能,也可能需要实例化。

原语

本节概述了最常用的CLB原语。

多路复用器

多路复用器原语为每个片中的专用多路复用器提供直接实例化,允许构建更宽的多路复用器。下表描述了这两个原语。

PrimitiveInputsResourceOutput Function
MUXF7LUT outputs (4:1 multiplexer)F7AMUX or F7BMUX8:1 multiplexer
MUXF8F7AMUX and F7BMUX outputs (8:1 multiplexer)F8MUX16:1 multiplexer

两个多路复用器原语的端口信号是相同的。下图显示了MUXF7。

MUXF7

端口信号

  • 数据输入 - I0, I1:数据输入提供由选择信号(S)选择的数据。
  • 控制输入 - S:选择输入信号决定了要连接到输出O的数据输入信号。逻辑0选择I0输入,而逻辑1选择I1输入。
  • 数据输出 - O:数据输出O提供由控制输入选择的数据值(一个比特)。

进位链

CARRY4原语实例化了每个slice中可用的快速进位逻辑。这个基元与LUT一起工作,构建加法器和乘法器。下图显示了CARRY4基元。综合工具通常从算术HDL代码中推断出这个逻辑,自动正确连接这个功能。

CARRY4

端口信号

  • 总和输出 - O[3:0]:总和输出提供加/减法的最终结果。它们连接到slice 的AMUX/BMUX/CMUX/DMUX输出。

  • 进位输出 - CO[3:0]:进位输出为每个位提供进位。CO[3]等同于COUT。如果CO[3]通过COUT连接到另一个CARRY4原语的CI输入,并通过专用路由将进位链连接到一列slice上,就可以创建一个较长的进位链。进位输出还可选择连接到slice的AMUX/BMUX/CMUX/DMUX输出。

  • 进位输入 - CI:进位输入,也叫CIN,用于级联片,形成更长的进位链。

  • 数据输入 - DI [3:0]:数据输入被用作 "生成 "信号,用于前级进位逻辑。产生信号的来源是LUT输出。

  • 选择输入 - S [3:0]:选择输入作为 "传播 "信号,用于前级进位逻辑。传播信号的来源是LUT输出。、

  • 进位初始化 - CYINIT:进位初始化输入用于选择进位链中的第一个位。这个引脚的值是0(用于加法)、1(用于减法)或AX输入(用于动态的第一个进位)。

SLICEM分布式RAM

下表中显示了八个原语。三个原语是单端口RAM,三个原语是双端口RAM,还有两个原语是四端口RAM。

PrimitiveRAM SizeTypeAddress Inputs
RAM32X1S32-bitSingle-portA[4:0] (read/write)
RAM32M32-bitQuad-portADDRA[4:0] (read)
ADDRB[4:0] (read)
ADDRC[4:0] (read)
ADDRD[4:0] (read/write)
RAM64X1S64-bitSingle-portA[5:0] (read/write)
RAM64X1D64-bitDual-portA[5:0] (read/write)
DPRA[5:0] (read)
RAM64M64-bitQuad-portADDRA[5:0] (read)
ADDRB[5:0] (read)
ADDRC[5:0] (read)
ADDRD[5:0] (read/write)
RAM128X1S128-bitSingle-portA[6:0] (read/write)
RAM128X1D128-bitDual-portA[6:0], (read/write)
DPRA[6:0] (read)
RAM256X1S256-bitSingle-portA[7:0] (read/write)

输入和输出数据的宽度为1位(四端口RAM除外)。

下图显示了通用的单端口、双端口和四端口分布式RAM原语。A、ADDR和DPRA信号是地址总线。

实例化几个分布式RAM基元可用于实现宽内存块。

端口信号

每个分布式RAM端口在读取同一组内存单元时都是独立运行的。

时钟 - WCLK

该时钟用于同步写入。数据和地址输入引脚的设置时间与WCLK有关。
设置时间参照WCLK引脚。时钟引脚(WCLK)在slice级有一个反转选项。时钟信号可以在时钟的负边沿或时钟的正边沿有效,而不需要其他逻辑资源。默认是在时钟的正边沿。

使能 - WE/WED

使能引脚影响端口的写入功能。一个非活动的写入使能可以防止对存储单元的任何写入。一个有效的写入使能会使时钟沿将数据输入信号写入地址输入所指向的内存位置。

地址 - A[#:0], DPRA[#:0], 和 ADDRA[#:0] - ADDRD[#:0]

地址输入A[#:0](用于单端口和双端口)、DPRA[#:0](用于双端口)和ADDRA[#:0]-ADDRD[#:0](用于四端口)选择用于读取或写入的存储单元。端口的宽度决定了所需的地址输入。有些地址输入在VHDL或Verilog实例中不是总线。

数据输入 - D, DID[#:0]

数据输入D(对于单端口和双端口)和DID[#:0](对于四端口)提供要写入RAM的新数据值。

数据输出 - O、SPO、DPO和DOA[#:0] - DOD[#:0]

数据输出O(单端口)、DPO(双端口)和DOA[#:0] - DOD[#:0](四端口)反映了地址输入所引用的存储单元的内容。在一个有效的写时钟边沿之后,数据输出(O、SPO或DOD[#:0])反映新写入的数据。

SLICEM SRL移位寄存器

32位移位寄存器(SRLC32E)有一个原语,它在一个SLICEM中使用一个LUT。下图显示了32位移位寄存器结构。

SRLC32E

端口信号

时钟 - CLK

时钟的上升沿或下降沿都用于同步移位操作。数据和时钟使能输入引脚的设置时间参照CLK的选定边缘。时钟引脚(CLK)在片级有一个反转选项。时钟信号可以在负边或正边激活,而不需要其他逻辑资源。默认的是正的时钟边缘。

数据输入 - D

数据输入提供新的数据(一个比特),以移入移位寄存器。

时钟使能 - CE

时钟使能引脚会影响移位功能。一个未激活的时钟使能引脚不会将数据移入移位寄存器,也不会写入新数据。激活时钟使能允许(D)中的数据被写入第一个位置,所有数据被移位一个位置。当可用时,新的数据会出现在输出引脚(Q)和可级联的输出引脚(Q31)上。

地址 - A[4:0]

地址输入选择要读的位(范围0到31)。第n个位可以在输出引脚(Q)上使用。地址输入对可级联的输出引脚(Q31)没有影响。Q31总是移位寄存器的最后一位(位31)。

数据输出 - Q

数据输出Q提供由地址输入选择的数据值(1位)。

触发器

CLB存储元件有几个基元,包括触发器和锁存器,有不同的控制信号组合可用。下图中显示了FDRE的例子。

FDRE

端口信号

数据输入 - D

数据输入提供新的数据(一个比特),并将其作为时钟输入触发器。

数据输出 - Q

Q是来自触发器的一位寄存数据输出。

时钟 - C

时钟的上升沿或下降沿都用于捕获数据和切换输出。数据和时钟使能输入引脚的设置时间参照所选择的时钟边缘。时钟引脚(C)在片级有一个反转选项。时钟信号可以在时钟的负边或正边激活而不需要其他逻辑资源。默认的是时钟的正边。一个片中的所有触发器必须使用相同的时钟和相同的时钟极性。

时钟使能 - CE

当CE为低电平时,相对于D输入,时钟转换被忽略。设置和复位输入的优先级高于时钟使能。

同步复位 - R

当R为高电平时,所有其他输入被覆盖,数据输出(Q)在有效时钟转换时被驱动为低电平。这个信号在FDRE组件中可用。FDRE触发器在上电时也被默认清零。

同步设置 - S

当S为高电平时,所有其他输入被覆盖,数据输出(Q)在有效时钟转换时被驱动为高电平。这个信号在FDSE组件中可用。FDSE触发器在上电时也被默认为预置。

异步清除 - CLR

当CLR为高电平时,所有其他输入被覆盖,数据输出(Q)被驱动为低电平。这个信号在FDCE组件中可用。FDCE触发器在上电时也被默认为清零。

异步预置 - PRE

当PRE为高电平时,所有其他输入被覆盖,数据输出(Q)被驱动为高电平。这个信号在FDPE组件中可用。FDPE触发器在上电时也被默认预置。

在同一个触发器上同时使用异步清零和预置,需要额外的资源和定时路径。

应用实例

本节提供了关于使用CLB资源作为大型功能的一部分的指导。描述了实现这些功能的替代方法之间的权衡。

分布式RAM的应用

分布式RAM提供了一种权衡,即使用存储元素来处理非常小的阵列和使用块状RAM来处理较大的阵列。建议在可能的情况下推断内存,以提供最大的灵活性。分布式RAM也可以通过实例化或通过使用Xilinx LogiCORE™ IP来实现。

一般来说,分布式RAM应该用于所有由64位或更少组成的存储器,除非目标器件的SLICEM或逻辑资源短缺。分布式RAM在资源、性能和功率方面更有效率。

对于深度大于64位但小于或等于128位的存储器,决定使用哪种最佳资源取决于这些因素:

  1. 额外块RAM的可用性:如果没有,应该使用分布式RAM。
  2. 延迟的要求:如果需要异步读取能力,必须使用分布式RAM。
  3. 数据宽度:宽度大于16位的应使用块状RAM,如果有的话。
  4. 必要的性能要求:与块RAM相比,分布式RAM通常具有更短的时钟到输出时间和更少的放置限制。

移位寄存器的应用

同步移位寄存器

移位寄存器原语不使用同一个slice中的可用寄存器。为了实现一个完全同步的读写移位寄存器,输出引脚Q必须连接到一个触发器。如下图所示,移位寄存器和触发器都共享同一个时钟。

静态长度移位寄存器

可级联的32位移位寄存器实现了任何静态长度模式的移位寄存器,不需要专用的多路复用器(F7AMUX、F7BMUX和F8MUX)。下图展示了一个72位移位寄存器。

只有最后一个SRLC32E基元需要将其地址输入与0b00111绑定。另外,移位寄存器的长度可以限制为71位(地址与0b00110绑定),并且可以使用一个触发器作为最后一个寄存器。(在SRLC32E基元中,移位寄存器的长度是地址输入+1)。

进位逻辑应用

CLB中的专用进位逻辑改善了算术功能的性能,如加法器、计数器和比较器。包括简单的计数器或加/减法器的设计会自动推断出进位逻辑。包括乘法器在内的更复杂的功能可以用单独的DSP48E1片来实现。

每个器件中的DSP48E1片都支持许多独立的功能,包括乘法、乘法累加、乘法加法、三输入加法、桶式移位、宽总线复用、幅度比较器、位逻辑功能、模式检测和宽计数器。该架构还支持级联多个DSP48E1片,以形成宽数学功能、DSP滤波器和复杂算术。

在使用CLB进位逻辑和DSP48E1片之间的选择取决于应用。一个小的算术函数使用CLB携带逻辑而不是使用整个DSP48E1片,可以更快、更低功率。当DSP48E1片被完全利用时,CLB片和携带逻辑提供了一个有效的替代方案。

高级专题

将锁存器功能作为逻辑使用

因为锁存器函数是电平敏感的,所以它可以被用作等同于逻辑门的功能。如下图所示,指定这个函数的基元是AND2B1L(一个有一个输入反相的2输入AND门)和OR2L(一个2输入的OR门)。

如下图所示,当AND2B1L和OR2L基元实例化时,锁存器的数据和SR输入以及Q输出被使用,并且CK门和CE门使能被保持为高电平。AND2B1L将锁存器的数据输入(门上的反相输入,DI)与异步清零输入(SRI)相结合。OR2L将锁存数据输入与异步预置相结合。一般来说,锁存器的数据输入来自同一片内的LUT的输出,将逻辑能力扩展到另一个外部输入。因为每个片只有一个SR输入,所以每个片断使用一个以上的AND2B1L或OR2L需要一个共享的公共外部输入。

设备模型将这些功能显示为存储元件的AND2L和OR2L配置。

AND2B1L和OR2L两输入门节省了LUT资源,并在上电和GSR断言(全局设置/复位)时被初始化为已知状态。通过用寄存器/锁存器资源换取逻辑,使用这些基元可以降低逻辑电平,提高器件的逻辑密度。然而,由于时钟和时钟使能输入需要静态输入,指定一个或多个AND2B1L或OR2L基元可能导致片中的寄存器包装和密度问题,不允许使用其余的寄存器和锁存器。

互连资源

互连是FPGA内功能元素的输入和输出之间的可编程信号通路网络,如IOB、CLB、DSP片和块RAM。互连,也称为路由,是为了实现最佳的连接性而划分的。赛灵思的布局和布线工具利用丰富的互连阵列来提供最佳的系统性能和最快的编译时间。

7系列CLB在FPGA内排列成一个规则的阵列。每个CLB连接到一个开关矩阵,用于访问一般的布线资源,这些资源在CLB的行和列之间垂直和水平地运行。一个类似的开关矩阵连接其他资源,如DSP片和块RAM资源。

大多数互连功能对FPGA设计者来说是透明的。对互连细节的了解可以用来指导设计技术,但对于高效的FPGA设计来说并不是必须的。只有选定的互连类型是由用户控制的。其中包括时钟路由资源,它是通过使用时钟缓冲器来选择的。两个全局控制信号,即GSR和GTS,通过使用STARTUPE2基元选择。

全局控制信号GSR和GTS

除了通用互连外,7系列FPGA还有两个全局逻辑控制信号,如下表所述。

Global Control InputDescription
GSRGlobal Set/Reset:高电平时,异步地将所有寄存器和触发器置于初始状态。
GTSGlobal 3-State: 高电平时,异步迫使所有I/O引脚进入高阻抗状态(高Z,3态)。

如果设计中的每个触发器都需要一个共同的初始化信号,那么在设计中使用GSR控制,而不是单独路由的全局复位信号,以使CLB输入可用,这将使设计更小更有效。GSR信号必须总是重新初始化每个触发器。使用GSR和GTS并不使用任何通用的路由资源。在FPGA配置过程中,GSR信号被自动断定,保证了FPGA在已知状态下启动。在配置时,由于触发器是由配置时钟启用的,然后由用户时钟时钟化,建议在配置后在用户时钟上启用关键触发器或关键时钟信号。

STARTUPE2

GSR 和 GTS 信号源是使用 STARTUPE2 原理定义和连接的。此基元允许用户定义这些专用网路的源。配置期间,GSR 和 GTS 始终处于活动状态,在 STARTUPE2 基元上将信号连接到它们,定义了配置后如何控制它们。默认情况下,它们在启动阶段的选定时钟周期配置后被禁用,启用器件中的触发器和I/O。STARTUPE2基元还包括配置期间专门使用的其他信号。

互连优化

互连延迟根据设计中的具体实现和负载而变化。互连的类型、在设备中所需要的距离以及需要穿越的开关矩阵的数量都是影响总延迟的因素。大多数时序问题是通过检查块的延迟和确定使用更少的层次或更快的路径的影响来解决的。如果互连延迟看起来太长,增加实施工作水平或迭代,以改善性能,同时确保所需的时序在约束文件中。

具有关键时序的网络或负载较重的网络通常可以通过复制网络的源头来改善。切片的双5输入LUT配置简化了同一切片中的逻辑复制,这使源函数的输入上的任何额外负载最小化。在多个片断中复制逻辑使软件有更大的灵活性来独立放置源。

平面规划是指定用户放置限制的过程。地面规划可以在自动放置和布线之前或之后进行,但在指定用户地面规划之前,总是建议先进行自动放置和布线。赛灵思的实现工具提供了一个图形化的放置视图。它帮助设计者在RTL编码和综合实现之间进行选择,并具有广泛的设计探索和分析功能。

reference

  1. UG474

相关文章:

FPGA - 7系列 FPGA内部结构之CLB -03- CLB相关原语以及应用

前言 本文节选UG474的第二章,进行整理翻译。CLB资源被FPGA综合工具自动有效地使用,不需要任何特殊的FPGA专用编码。一些HDL编码建议和技术可以帮助优化设计以获得最大效率。 设计检查清单 这些指南是为有效使用7系列CLB的设计建议提供的快速核对表。7…...

什么是日志关联

什么是日志关联 日志关联是一种分析来自不同源的日志数据以识别事件模式的技术。它用于更好地了解网络的活动,从而有效地保护网络免受漏洞和威胁。 日志关联是日志管理过程的关键部分。收集和存储日志后,集中式日志服务器将执行分析以检测特定事件。日…...

打家劫舍问题 Python题解

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…...

【JavaSE】Java基础语法(十八):接口

文章目录 1. 接口的概述2. 接口的特点3. 接口的成员特点4. 类和接口的关系5. 抽象类和接口的关系 1. 接口的概述 接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。Java中接口存在的两个意义 用来定义规范用来做功能的拓展 2. 接口的特点…...

SVD求解两组多维点之间的欧式变换矩阵,及halcon代码实现

之前研究了二维点的仿射变换,用解矩阵的方式求解了两组二维点之间的变换矩阵。 学习了下SVD,看到可以用SVD求解两组多维点之间的欧式变换矩阵,当然也是个最优化问题。 这里的变换只有平移和旋转,没有缩放。 一、先说结论&#…...

常用监控方案 Prometheus + Grafana 简单使用小结

文章目录 前言一、概念1.1 发展1.2 时序数据1.3 Metric 二、Prometheus2.1 架构2.2 配置2.3 查询语言PromQL2.4 Exporter 三、Grafana3.1 数据源3.2 权限3.3 面板可视化3.4 仪表盘 四、实战4.1 监控 Windows/Linux4.2 监控 JVM4.3 监控 MySQL4.4 监控 Springboot API 参考 前言…...

基于长短期神经网络LSTM的飞行轨迹跟踪预测,基于长短期神经网络LSTM的三维路径预测

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 基于长短期神经网络LSTM的飞行轨迹跟踪 完整代码: https://download.csdn.net/download/abc991835105/87705046 效果图 结果分析 展望 参考论文 背影 路径追踪预测,对实现自动飞行驾驶拥有重要意义,长短期神经网络是一种改进…...

计算机组成原理-指令系统-指令格式及寻址方式

目录 一、指令的定义 1.1 扩展操作码指令格式 二、指令寻址方式 2.1 顺序寻址 2.2 跳跃寻址 三、 数据寻址 3.1 直接寻址 3.2 间接寻址 3.3 寄存器寻址 ​ 3.4 寄存器间接寻址 3.5 隐含寻址 3.6 立即寻址 3.7 偏移地址 3.7.1 基址寻址 3.7.2 变址寻址 3.7.3 相对寻址…...

【满分】【华为OD机试真题2023B卷 JAVAJS】经典屏保

华为OD2023(B卷)机试题库全覆盖,刷题指南点这里 经典屏保 知识点循环迭代编程基础 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: DVD机在视频输出时,为了保护电视显像管,在待机状态会显示“屏保动画”,如下图所示,DVD Logo在屏幕内来回运动,碰到边缘会反弹…...

Apache 网页与安全优化

目录 一:Apache网页优化概述 1、概述 2、优化内容 3、gzip介绍 4、Apache的压缩模块 5、mod_ gzip 模块与mod_ deflate 模块 二: 网页压缩 1.检查是否安装 mod_deflate 模块 2. 如果没有安装mod_deflate 模块,重新编译安装 Apache 添…...

Unity的IFilterBuildAssemblies:深入解析与实用案例

Unity IFilterBuildAssemblies Unity IFilterBuildAssemblies是Unity引擎中的一个非常有用的功能,它可以让开发者在构建项目时自定义哪些程序集需要被包含在构建中,哪些程序集需要被排除在建之外。这个功能可以帮助开发者更好地控制项目的构建过程&…...

分片架构,Redis Cluster 分析

分片架构解决的问题 通过堆机器,提升读写性能,与存储性能 分片架构设计要点 分片规则 选择Cardinality大的作为分片键,尽可能保证数据分布均匀 常见分片键: 基于主键(业务型数据),基于时间…...

Linux-0.11 文件系统bitmap.c详解

Linux-0.11 文件系统bitmap.c详解 模块简介 该模块包含了两对函数,第一对是和i节点相关的free_inode()和new_inode()。第二对是和逻辑块相关的free_block()和new_block()。 函数详解 free_block void free_block(int dev, int block)该函数的作用是释放设备dev…...

【Linux】基本指令,拥抱Linux的第一步

[Linux]常见指令 Linux基本指令指令的本质ls指令pwd指令cd指令touch指令mkdir指令(重要)rmdir&&rm指令(重要)man指令(重要)cp指令(重要)mv指令(重要)重定向cat指令more指令less指令(重要…...

CTF 2015: Search Engine-fastbin_dup_into_stack

参考: [1]https://gsgx.me/posts/9447-ctf-2015-search-engine-writeup/ [2]https://blog.csdn.net/weixin_38419913/article/details/103238963(掌握利用点,省略各种逆向细节) [3]https://bbs.kanxue.com/thread-267876.htm(逆向调试详解&am…...

DRF之全局异常处理

一、REST framework 提供了异常处理,我们可以自定义异常处理函数 使用方式: from rest_framewoork.views import exception_handerdef custom_exception_handler(exc,context):# 先调用REST framework默认的异常处理方法获得标准错误响应对象response …...

AI创作工具的使用体验报告

下面是AI创作工具的使用体验报告,围绕以下三点展开: 一、工具的使用体验如何? CSDN博客AI创作工具是一款非常易用的工具,操作简单,可以很快地开始创建内容。在使用过程中,我发现它的语言模型很智能&#…...

C++算法模板(转自acwing)

快速排序算法模板 —— 模板题 AcWing 785. 快速排序 void quick_sort(int q[], int l, int r) {if (l > r) return;int i l - 1, j r 1, x q[l r >> 1];while (i < j){do i ; while (q[i] < x);do j -- ; while (q[j] > x);if (i < j) swap(q[i],…...

阿里云服务器最新优惠价格及最新收费标准(2023更新)

阿里云服务器收费标准分为包年包月和按量付费两种模式&#xff0c;包年包月是一种先付费后使用的计费方式&#xff0c;按量付费是一种先使用后付费的计费方式。选择包年包月的收费模式&#xff0c;用户可以提前预留资源&#xff0c;同时享受更大的价格优惠&#xff0c;帮您更大…...

React实现监听粘贴事件并获取粘贴板中的截图

目录 监听粘贴事件并获取粘贴板中的截图 TSX中给组件添加监听粘贴事件从粘贴板获取截图文件React监听事件 事件监听绑定的事件函数相关扩展 监听粘贴事件并获取粘贴板中的截图 TSX中给组件添加监听粘贴事件 ? 1 2 3 4 5 6 7 8 9 10 11 const pasteImageRef useRef<HTML…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...