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

以太网详解(五)GMII、RGMII、SGMII 接口时序约束(Quartus 平台)

文章目录

  • 接口时序
    • Avalon Streaming 接口时序
      • Receive Timing
      • Transmit Timing
    • GMII 接口时序
      • Receive Timing
      • Transmit Timing
    • RGMII 接口时序
      • Receive Timing
      • Transmit Timing
  • 如何创建 .sdc 约束文件
    • 三速以太网系统时钟信号
    • 创建 set_input_delay,set_output_delay 约束
      • set_input_delay,set_output_delay
      • GMII 接口时序约束
        • GMII 接口 set_input_delay 约束
        • GMII 接口 set_output_delay 约束
      • RGMII 接口时序约束
        • RGMII 接口 set_input_delay 约束
        • RGMII 接口 set_output_delay 约束
      • 到此就结束了吗?

接口时序

Avalon Streaming 接口时序

Receive Timing

在这里插入图片描述
接收操作出现长度错误时的时序图:
在这里插入图片描述
rx_err[5:0]:接收错误。在帧中的最后一个字节拉高,以指示在接收帧时检测到错误。具体错误信息如下表所示:

BitDescription
5冲突(collision)错误。在半双工链路上,发送数据帧之前会先探测链路是否空闲。但是,有可能两个不同的终端都检测到了链路空闲,而后都开始发送数据帧。这样,两个数据帧就会在链路上发生冲突。严格来讲, collision 并不是错误帧,而是 CSMA/CD 机制必然导致的事件。半双工以太网中,出现 collision 错误通常是正常现象。
4由于 PHY 或 PCS 错误导致的接收帧损坏。当在 MII/GMII/RGMII 上检测到错误时拉高。
3截断的接收帧。当接收帧由于接收 FIFO 缓冲区溢出而被截断时拉高。
2CRC 错误。当收到带有 CRC-32 错误的帧时拉高。此错误位仅适用于具有有效长度的帧。
1无效长度错误。当接收帧的长度不符合 IEEE 标准 802.3 的规定时拉高。帧长度必须至少为 64(0x40)字节,并且不超过不同帧类型的最大值。
0接收帧错误。表示发生了错误。它是 rx_err[5:1] 的逻辑或。

Transmit Timing

在这里插入图片描述

GMII 接口时序

Receive Timing

在接收时,所有信号都在 rx_clk 的上升沿上采样。GMII 数据使能信号 gm_rx_dv 由 PHY 断拉高,表示新帧的开始,并保持高状态,直到帧的最后一个字节出现在 gm_rx_d[7:0] 总线上。帧之间,gm_rx_dv 保持拉低。

如果 PHY 检测到从线路接收到的帧有错误,则 PHY 在帧传输期间的任何时间拉高 GMII 错误信号 gm_rx_err 至少一个时钟周期。

在 GMII 接口上接收到的带有 PHY 错误指示的帧随后在 Avalon streaming 接口上传输,错误信号 rx_err[0] 拉高。

Transmit Timing

在传输时,所有数据传输都与 tx_clk 的上升沿同步。GMII 数据使能信号 gm_tx_en 被拉高来指示新帧的开始,并保持高状态,直到该帧的最后一个字节出现在 gm_tx_d[7:0] 总线上。帧之间,gm_tx_en 保持拉低状态。

如果在 Avalon streaming 接口上接收到一个带有错误的帧(ff_tx_eop 拉高),则在帧传输期间的任何时间,GMII gm_tx_err 信号将拉高。

RGMII 接口时序

Receive Timing

在接收时,在 rx_clk 的双沿采样所有信号。RGMII 控制信号 rx_control 由 PHY 拉高,以指示新帧的开始,并保持高状态,直到帧的最后一个字节在 rgmii_in[3:0] 总线上出现。帧之间,rx_control 保持拉低状态。
在这里插入图片描述
在 RGMII 接口上接收到带有 PHY 错误指示的帧,随后在 Avalon streaming 接口上传输错误信号 rx err[0]。
在这里插入图片描述
注意,rx_clk 的上升沿会延后与数据 90° 以确保数据被正确采样。

Transmit Timing

在传输时,所有数据传输都同步到 tx_clk 的双沿。RGMII 控制信号 tx_control 被拉高来指示新帧的开始,并保持高状态,直到 rgmii_out[3:0] 总线上出现帧的最后一个字节。帧之间,tx_control 保持拉低状态。
在这里插入图片描述
如果在 Avalon streaming 接口上接收到一个错误的帧(ff_tx_err 在 ff_tx_eop 拉高),则该帧随后在帧传输期间的任何时间与 RGMII tx_control 信号(在 tx_clk 的下降沿)一起传输。如下图所示:
在这里插入图片描述

如何创建 .sdc 约束文件

三速以太网系统时钟信号

在生成三速以太网 Intel FPGA IP 并将其集成到系统中之后,您需要创建一个时序约束文件来指定时钟约束需求。

一个简单的三速以太网系统如下图所示:
在这里插入图片描述
整个三速以太网系统主要有以下四组时钟:

  • clk:MAC 配置时钟,一般由 PLL 产生,接到 PLL 输出。
  • ff_tx_clk,ff_rx_clk:Avalon streaming 时钟,MAC 传输接口的数据同步时钟,一般由 PLL 产生,接到 PLL 输出。
  • tx_clk,rx_clk:GMII、RGMII 模式下收发器参考时钟,与 gm_tx_c,gm_rx_c 连接。其中,gm_rx_c 由外部 PHY 芯片提供,接到 FPGA 专用参考时钟引脚。时钟由 PLL 产生,既给 tx_clk 提供时钟,又给外部 PHY 芯片提供时钟 gm_tx_c,如下图所示。
  • ref_clk:SGMII 模式下收发器参考时钟,必须接到 FPGA 专用参考时钟引脚,且必须与 SGMII 的 TX、RX 位于同一个 bank,不可以接到 PLL 输出。SGMII without CLK 模式下,接的是外部 125Mhz 晶振。

在这里插入图片描述
需要注意的是,由于 RGMII 1000 Mbps 采用 DDR 模式传输数据,所以 PLL 需要输出两个不同的时钟,一个既给 tx_clk 提供时钟,一个给外部 PHY 芯片提供时钟 rgmii_txc。这两个时钟的关系为:

  • 核心 TX 时钟(英特尔® FPGA):125 MHz、25 MHz 和 2.5 MHz。
  • RGMII_TX_Clock(外部 PHY):125 MHz +90º、25 MHz +90º 和 2.5 MHz +90º。

GMII、RGMII 模式下各时钟频率范围如下表所示
在这里插入图片描述
SGMII 模式下各时钟频率范围如下表所示
在这里插入图片描述
需要注意的是,不同的 FIFO 位宽需要匹配不同的 ff_tx_clk,ff_rx_clk 时钟频率

创建 set_input_delay,set_output_delay 约束

由于 GMII、RGMII 接口为并行接口,所以需要创建 set_input_delay,set_output_delay 约束。SGMII 接口为串行接口,使用 CDR 技术从链路中恢复时钟,所以不需要创建 set_input_delay,set_output_delay 约束。

set_input_delay,set_output_delay

在这里插入图片描述
对于一个芯片设计来说,芯片的外部都会有一些器件和芯片进行数据的交换,简单的示意图如上所示。虚线框是 FPGA 芯片,外部的器件从 STA 的角度被简化为两个寄存器 Device A 和 Device B,在本文案例中,Device A 和 Device B 是同一个,即网口 PHY 芯片。

如上图所示,如果在设计上没有对 dina,douta 的数据进行约束,那么 STA 工具并不能够得到由外部寄存器经过组合逻辑到达 rega 的时间,同时也不知道 dina 信号和输入的 clk 是什么关系(如果有多个时钟,到底和哪个时钟是有关的??)和内部采样 rega 的关系。

input delay 和 output delay 就是告诉 STA 工具芯片外部的信号的 delay 信息。如果知道芯片外部器件的 datasheet,那么 input delay 和 output delay 要严格按照 datasheet 的要求去设置。

如果不设置 input delay 和 output delay,那么工具并不知道上述信息,也就是说工具并不会分析这条 path。由于大多数信号进入芯片内部都是需要和芯片内部进行数据传递的,所以必须通过约束 input delay 和 output delay 的方式告诉工具此处的 timing 信息,这样才能保证输入的信号能够被芯片内部正确的采样,从而保证芯片工作正常。

反之,如果某些信号是一些在芯片正常工作之前就稳定的常值信号(bist en 等),那么实际上是没有必要对这些信号进行 timing 分析的,所以这些信号可以不用约束 input delay 来简化时序约束。

如何设置设置 input delay 和 output delay?

对于 input delay 和 output delay 关键是理解下面两句话的含义

  • set_input_delay 是说该输入信号是在时钟沿后多长时间到达模块的 port 上的。
  • set_output_delay 是说该输出信号在后级模块中需要在时钟沿之前提前多长时间准备好。

设置输入延时(Input Delay)

由下图可以看出 Input Delay 是以上游芯片的时钟发送沿为参考,上游的输出数据到达 FPGA 的外部输入端口之间的延迟。
在这里插入图片描述
输入延迟(input delay)包括 Tco 和 Trace Delay(板间延迟),其中 Trace delay 又叫 Board delay。

Tco 需要去查找上游芯片的 datasheet,TD 需要去查看 PCB 走线。
在这里插入图片描述
其中,DDR 模式传输和 SDC 模式传输的约束方式有区别,需要添加 -clock_fall 指令额外约束下降沿,如下图所示:
在这里插入图片描述
设置输出延时(Output Delay)

输出延时指的是从 FPGA 输出数据后到达外部器件时钟沿的延时时间,包括 PCB 板上的走线延时以及外部器件的数据建立和保持时间。也可以理解为在捕获沿到来时,数据已经存在的时间,如下图所示。
在这里插入图片描述
因为是以下游芯片的捕获沿为参考点,所以建立时间为正,保持时间为负。
在这里插入图片描述
其中,DDR 模式传输和 SDC 模式传输的约束方式有区别,需要添加 -clock_fall 指令额外约束下降沿,如下图所示:
在这里插入图片描述
注意,一般 GMII、RGMII 都会采用等长方式走线,所以从 PCB 走线数据可以看出,clk 和 data 的走线延时 TD 差异很小,可以忽略不计。
TD 计算公式:1ps 对应 6mil 走线长度。

GMII 接口时序约束

下面查看网口 PHY 芯片 M88E1111 的 datasheet。

125 MHz 时,周期为 8ns,T = 8ns。

由下图可知,Tco max = T - setup time = 8 - 2.5 = 5.5ns,Tco min = hold time = 0.5ns

所以设置 input delay max = 5.5ns,input delay min = 0.5ns。

Intel® 建议从任意方向上接收器的 DATA 开始延迟 CLK 最短 1.5 ns 到最长 2.0 ns,以确保足够的时序裕量。所以对时序约束进行修正,这里延时 1.5ns,所以设置 input delay max = 4ns,input delay min = -1ns
在这里插入图片描述
由下图可知,output delay max = TD max + Tsu = 0 + 2.0 = 2ns,output delay min = TD min – Thd = 0 – 0 = 0ns。

Intel® 建议从任意方向上接收器的 DATA 开始延迟 CLK 最短 1.5 ns 到最长 2.0 ns,以确保足够的时序裕量。所以对时序约束进行修正,这里延时 1.5ns,所以设置 output delay max = 0.5ns,output delay min = -1.5ns
在这里插入图片描述

GMII 接口 set_input_delay 约束
  1. 创建输入时钟。
create_clock -name {gm_rx_c} -period 8.000 -waveform { 0.000 4.000 } [get_ports {gm_rx_c}]
  1. 约束输入延迟。
set_input_delay -clock  [get_clocks  {gm_rx_c}] -max 4.000 [get_ports {{gm_rx_d[*]} gm_rx_dv gm_rx_err}] -add_delay
set_input_delay -clock  [get_clocks  {gm_rx_c}] -min -1.000 [get_ports {{gm_rx_d[*]} gm_rx_dv gm_rx_err}] -add_delay
GMII 接口 set_output_delay 约束
  1. 创建发送时钟。这里,由锁相环产生一个 125MHz 的时钟,由 c1 输出。锁相环输入 i_clk 为外部 100M 晶振。
create_generated_clock -name {gm_tx_c} -source [get_pins {clk_pll_inst|iopll_0|altera_iopll_i|twentynm_pll|iopll_inst|refclk[0]}] -duty_cycle 50/1 -multiply_by 10 -divide_by 8 -master_clock {i_clk} [get_pins {clk_pll_inst|iopll_0|altera_iopll_i|twentynm_pll|iopll_inst|outclk[1]}] 
  1. 约束输出延迟。
set_output_delay -clock  [get_clocks  {gm_tx_c}] -max 0.500 [get_ports {{gm_tx_d[*]} gm_tx_engm_tx_err}] -add_delay
set_output_delay -clock  [get_clocks  {gm_tx_c}] -min -1.500 [get_ports {{gm_tx_d[*]} gm_tx_en gm_tx_err}] -add_delay

RGMII 接口时序约束

本小节从满足 1000 Mbps 模式下各种要求的角度出发,解决 RGMII 接口时序相关问题。1000 Mbps 模式下,需要最多接口时序裕量,因而这是此处唯一需要考虑的情况。

125 MHz 时,周期为 8ns,但由于 RGMII 1000 Mbps 采用 DDR 模式传输数据,两个沿都已使用,因而有效沿周期仅为 4ns。TX 和 RX 总线完全独立但时钟源同步,从而简化了时序。RGMII 规定要求从任意方向上接收器的 DATA 开始延迟 CLK 最短 1.0 ns 到最长 2.6 ns。

换言之,必须延迟从 MAC 输出到 PHY 输入 TX_CLK,并延迟从 PHY 输出到 MAC 输入的 RX_CLK。输出管脚处测得每个方向上,信号在规定的 +/- 500 ps RGMII 偏斜规范内同步传输。每个方向所需的最小延迟为 1ns,但 Intel® 建议将延迟目标定为 1.5 ns 到 2.0 ns,以确保足够的时序裕量。

Intel FPGA官方的RGMII约束指南:
https://www.intel.cn/content/www/cn/zh/support/programmable/support-resources/design-examples/horizontal/exm-tse-rgmii-phy.html

由官方约束指南可知,由于外部 PHY 的 TX 和 RX 延迟特性开启(90 度偏移),所以导致:
RGMII_RX_Clock(英特尔® FPGA):125 MHz +90º、25 MHz +90º 和 2.5 MHz +90º
所以需要创建一个虚拟时钟:
RGMII_RX_Virtual_Clock(外部 PHY):125 MHz、25 MHz 和 2.5 MHz
来更方便的进行时序约束。

下面查看网口 PHY 芯片 M88E1111 的 datasheet。
在这里插入图片描述
在这里插入图片描述
注意:这里的 Register 20.1 和 20.7 置 1 时,外部 PHY 的 TX 和 RX 延迟特性开启(90 度偏移)。默认值为 0,需要软件配置!!

因此,

125 MHz 时,周期为 8ns,RGMII 采用 DDR 模式,T = 4ns。

由下图可知,Tco max = T - setup time = 4 - 1.2 = 2.8ns,Tco min = hold time = 1.2ns

所以设置 input delay max = 2.8ns,input delay min = 1.2ns。

Intel® 建议从任意方向上接收器的 DATA 开始延迟 CLK 最短 1.5 ns 到最长 2.0 ns,以确保足够的时序裕量。所以对时序约束进行修正,这里延时 1.5ns,所以设置 input delay max = 1.3ns,input delay min = -0.3ns
在这里插入图片描述
由下图可知,output delay max = TD max + Tsu = 0 - 0.9 = -0.9ns,output delay min = TD min – Thd = 0 - 2.7 = -2.7ns。

Intel® 建议从任意方向上接收器的 DATA 开始延迟 CLK 最短 1.5 ns 到最长 2.0 ns,以确保足够的时序裕量。所以对时序约束进行修正,这里延时 1.5ns,所以设置 output delay max = -2.4ns,output delay min = -4.2ns
在这里插入图片描述

RGMII 接口 set_input_delay 约束
  1. 创建输入时钟和虚拟时钟。其中,虚拟时钟用以描述输入延时。
create_clock -name {rgmii_rxc} -period 8.000 -waveform { 2.000 6.000 } [get_ports {rgmii_rxc}]
create_clock -name {rgmii_rxc_virtual} -period 8.000 -waveform { 0.000 4.000 }
  1. 约束输入延迟。
set_input_delay -clock  [get_clocks {rgmii_rxc_virtual}] -max 1.300 [get_ports {{rgmii_rxd[*]} rgmii_rx_ctl}] -add_delay
set_input_delay -clock  [get_clocks {rgmii_rxc_virtual}] -min -0.300 [get_ports {{rgmii_rxd[*]} rgmii_rx_ctl}] -add_delay
set_input_delay -clock  [get_clocks {rgmii_rxc_virtual}] -max 1.300 [get_ports {{rgmii_rxd[*]} rgmii_rx_ctl}] -clock_fall -add_delay
set_input_delay -clock  [get_clocks {rgmii_rxc_virtual}] -min -0.300 [get_ports {{rgmii_rxd[*]} rgmii_rx_ctl}] -clock_fall -add_delay
  1. 设置非关联路径。
set_false_path -fall_from [get_clocks {rgmii_rxc_virtual}] -rise_to [get_clocks {rgmii_rxc}] -setup
set_false_path -rise_from [get_clocks {rgmii_rxc_virtual}] -fall_to [get_clocks {rgmii_rxc}] -setup
set_false_path -rise_from [get_clocks {rgmii_rxc_virtual}] -rise_to [get_clocks {rgmii_rxc}] -hold
set_false_path -fall_from [get_clocks {rgmii_rxc_virtual}] -fall_to [get_clocks {rgmii_rxc}] -hold
RGMII 接口 set_output_delay 约束
  1. 创建发送时钟。这里,由锁相环产生两个 125MHz 的时钟,由 c1,c2 输出。锁相环输入 i_clk 为外部 100M 晶振。

这里的 gm_tx_c 为核心 TX 时钟(英特尔® FPGA):125 MHz、25 MHz 和 2.5 MHz。
这里的 rgmii_txc 为RGMII_TX_Clock(外部 PHY):125 MHz +90º、25 MHz +90º 和 2.5 MHz +90º。

为什么用 gm_tx_c 来命名核心 TX 时钟?主要是为了后面 DEMO 的 GMII、RGMII 模式兼容,以及从英特尔 Quartus Prime 软件版本 17.1 起,在英特尔 Stratix 10、英特尔 Arria 10和英特尔 Cyclone 10 GX设备中不支持 RGMII 接口。所以外部用了 gmii_rgmii_bridge 模块,三速以太网 IP 接的仍是 GMII 接口。

create_generated_clock -name {gm_tx_c} -source [get_pins {clk_pll_inst|iopll_0|altera_iopll_i|twentynm_pll|iopll_inst|refclk[0]}] -duty_cycle 50/1 -multiply_by 10 -divide_by 8 -master_clock {i_clk} [get_pins {clk_pll_inst|iopll_0|altera_iopll_i|twentynm_pll|iopll_inst|outclk[1]}] 
create_generated_clock -name {rgmii_txc} -source [get_pins {clk_pll_inst|iopll_0|altera_iopll_i|twentynm_pll|iopll_inst|refclk[0]}] -duty_cycle 50/1 -multiply_by 10 -divide_by 8 -phase 90/1 -master_clock {i_clk} [get_pins {clk_pll_inst|iopll_0|altera_iopll_i|twentynm_pll|iopll_inst|outclk[2]}] 
  1. 约束输出延迟。
set_output_delay -clock  [get_clocks {rgmii_txc}] -max -2.400 [get_ports {{rgmii_txd[*]} rgmii_tx_ctl}] -add_delay
set_output_delay -clock  [get_clocks {rgmii_txc}] -min -4.200 [get_ports {{rgmii_txd[*]} rgmii_tx_ctl}] -add_delay
set_output_delay -clock  [get_clocks {rgmii_txc}] -max -2.400 [get_ports {{rgmii_txd[*]} rgmii_tx_ctl}] -clock_fall -add_delay
set_output_delay -clock  [get_clocks {rgmii_txc}] -min -4.200 [get_ports {{rgmii_txd[*]} rgmii_tx_ctl}] -clock_fall -add_delay
  1. 设置非关联路径。
set_false_path -fall_from [get_clocks {gm_tx_c}] -rise_to [get_clocks {rgmii_txc}] -setup
set_false_path -rise_from [get_clocks {gm_tx_c}] -fall_to [get_clocks {rgmii_txc}] -setup
set_false_path -rise_from [get_clocks {gm_tx_c}] -rise_to [get_clocks {rgmii_txc}] -hold
set_false_path -fall_from [get_clocks {gm_tx_c}] -fall_to [get_clocks {rgmii_txc}] -hold
  1. 时钟输出最好用 DDIO 或 DDR 输出。

到此就结束了吗?

并没有结束,如果按上述约束编译工程,编译结束后,会发现时序报告有时序违例。这是因为,FPGA 内部的时钟和数据并不是完全同步的,FPGA 内部的时钟和数据到外部引脚的端口上也有延迟。需要略微调整 input delay 和 output delay,来使 slack 满足要求。

相关文章:

以太网详解(五)GMII、RGMII、SGMII 接口时序约束(Quartus 平台)

文章目录 接口时序Avalon Streaming 接口时序Receive TimingTransmit Timing GMII 接口时序Receive TimingTransmit Timing RGMII 接口时序Receive TimingTransmit Timing 如何创建 .sdc 约束文件三速以太网系统时钟信号创建 set_input_delay,set_output_delay 约束…...

Java中的错误与异常详解

Java中的错误与异常详解 Java提供了一种机制来捕获和处理程序中的异常和错误。异常和错误都继承自 Throwable 类,但它们有着不同的用途和处理方式。 1. Error(错误) Error 是程序无法处理的严重问题,通常由 JVM(Java…...

使用 HTML 开发 Portal 页全解析

前言 在当今数字化时代,网站作为企业和个人展示信息、提供服务的重要窗口,其重要性不言而喻。而 Portal 页,作为网站的核心页面之一,承担着引导用户、整合信息等关键任务。那么,如何使用 HTML 开发一个功能齐全、界面…...

高并发内存池_CentralCache(中心缓存)和PageCache(页缓存)申请内存的设计

三、CentralCache(中心缓存)_内存设计 (一)Span的创建 // 页编号类型,32位下是4byte类型,64位下是8byte类型 // #ifdef _WIN64 typedef unsigned long long PageID; #else _WIN32 typedef size_t PageI…...

Js:DOM中的样式(包含行内样式、滚动样式、可见区域样式等)

这部分还在更新 1、 获取行内样式:元素.style.样式名称 2、 获取当前正在显示的样式(只能读,不能修改,想要修改要使用style): ① 只有ie支持:元素.currentStyle.样式名称 ② 其他浏览器&…...

【leetcode 26】28.找出字符串中第一个匹配项的下标 | 实现 strStr()==❗不会❗==

在一个串中查找是否出现过另一个串&#xff0c;这是KMP的看家本领。 // 方法一 class Solution {public void getNext(int[] next, String s){int j -1;next[0] j;for (int i 1; i < s.length(); i){while(j > 0 && s.charAt(i) ! s.charAt(j1)){jnext[j];}if…...

Unity自学之旅04

Unity自学之旅04 Unity自学之旅④&#x1f4dd; 跳跃&#x1f42f; 攻击&#x1f984; GUIGUI前置&#xff0c;显示收集物品数量和角色HpUGUI游戏暂停和重新开始 &#x1f917; 总结归纳 Unity自学之旅④ &#x1f4dd; 跳跃 public class PlayerBehaviorRigid : MonoBehavio…...

Unreal Engine 5 C++ Advanced Action RPG 十章笔记

第十章 Survival Game Mode 2-Game Mode Test Map 设置游戏规则进行游戏玩法 生成敌人玩家是否死亡敌人死亡是否需要刷出更多 肯定:难度增加否定:玩家胜利 流程 新的游戏模式类游戏状态新的数据表来指定总共有多少波敌人生成逻辑UI告诉当前玩家的敌人波数 3-Survival Game M…...

[Unity 热更方案] 使用Addressable进行打包管理, 使用AssetBundle进行包的加载管理.70%跟练

在正常的开发过程中我们经常遇到一些关于热更的方案,有一些已有的方案供我们选择,但是实机情况往往不尽如人意,各有优缺点. 现在我们同样有一个热更的需求,但是要求打包简单,加载过程可查,防止出现一些资源和流程的问题. 下面介绍我在项目中使用的方案. 打包方面使用Addressabl…...

人工智能领域单词:英文解释

目录 1、前言2、单词组1&#xff1a;15个3、单词组2&#xff1a;15个4、单词组3&#xff1a;15个5、单词组4&#xff1a;15个6、单词组5&#xff1a;15个 1、前言 亲爱的家人们&#xff0c;创作很不容易&#xff0c;若对您有帮助的话&#xff0c;请点赞收藏加关注哦&#xff0…...

工业网口相机:如何通过调整网口参数设置,优化图像传输和网络性能,达到最大帧率

项目场景 工业相机是常用与工业视觉领域的常用专业视觉核心部件&#xff0c;拥有多种属性&#xff0c;是机器视觉系统中的核心部件&#xff0c;具有不可替代的重要功能。 工业相机已经被广泛应用于工业生产线在线检测、智能交通,机器视觉,科研,军事科学,航天航空等众多领域 …...

NextJs - ServerAction获取文件并处理Excel

NextJs - ServerAction获取文件并处理Excel 一. 客户端二. ServerAction 处理 一. 客户端 use client; import { uploadExcel } from actions/batchInquirySystem/api; import type { UploadProps } from antd; import { Upload } from antd;/*** 创建问询内容*/ const Page …...

【深度学习项目】语义分割-FCN网络(原理、网络架构、基于Pytorch实现FCN网络)

文章目录 介绍深度学习语义分割的关键特点主要架构和技术数据集和评价指标总结 FCN网络FCN 的特点FCN 的工作原理FCN 的变体和发展FCN 的网络结构FCN 的实现&#xff08;基于Pytorch&#xff09;1. 环境配置2. 文件结构3. 预训练权重下载地址4. 数据集&#xff0c;本例程使用的…...

集群、分布式及微服务间的区别与联系

目录 单体架构介绍集群和分布式架构集群和分布式集群和分布式区别和联系 微服务架构的引入微服务带来的挑战 总结 单体架构介绍 早期很多创业公司或者传统企业会把业务的所有功能实现都打包在一个项目中&#xff0c;这种方式就称为单体架构 以我们都很熟悉的电商系统为例&…...

ConvBERT:通过基于跨度的动态卷积改进BERT

摘要 像BERT及其变体这样的预训练语言模型最近在各种自然语言理解任务中取得了令人印象深刻的性能。然而&#xff0c;BERT严重依赖于全局自注意力机制&#xff0c;因此存在较大的内存占用和计算成本。尽管所有的注意力头都从全局角度查询整个输入序列以生成注意力图&#xff0…...

C# 网络协议第三方库Protobuf的使用

为什么要使用二进制数据 通常我们写一个简单的网络通讯软件可能使用的最多的是字符串类型&#xff0c;比较简单&#xff0c;例如发送格式为(head)19|Msg:Heart|100,x,y,z…&#xff0c;在接收端会解析收到的socket数据。 这样通常是完全可行的&#xff0c;但是随着数据量变大&…...

「2024 博客之星」自研Java框架 Sunrays-Framework 使用教程

文章目录 0.序言我的成长历程遇到挫折&#xff0c;陷入低谷重拾信心&#xff0c;迎接未来开源与分享我为何如此看重这次评选最后的心声 1.概述1.主要功能2.相关链接 2.系统要求构建工具框架和语言数据库与缓存消息队列与对象存储 3.快速入门0.配置Maven中央仓库1.打开settings.…...

【Elasticsearch】Springboot编写Elasticsearch的RestAPI

RestAPI 初始化RestClient创建索引库Mapping映射 判断索引库是否存在删除索引库总结 ES官方提供了各种不同语言的客户端&#xff0c;用来操作ES。这些客户端的本质就是组装DSL语句&#xff0c;通过http请求发送给ES。 官方文档地址 由于ES目前最新版本是8.8&#xff0c;提供了全…...

Swift语言的学习路线

Swift语言的学习路线 引言 在现代程序开发中&#xff0c;Swift语言逐渐成为了移动应用程序开发的重要工具&#xff0c;尤其是在iOS和macOS平台上。自2014年发布以来&#xff0c;Swift以其易读性和强大的功能&#xff0c;受到越来越多开发者的青睐。对于初学者而言&#xff0c…...

63,【3】buuctf web Upload-Labs-Linux 1

进入靶场 点击pass1 查看提示 既然是上传文件&#xff0c;先构造一句话木马&#xff0c;便于用蚁剑连接 <?php eval($_POST[123])?> 将这两处的检查函数删掉 再上传木马 文件后缀写为.php 右键复制图片地址 打开蚁剑连接 先点击测试连接&#xff0c;显示成功后&…...

Leetcode:2239

1&#xff0c;题目 2&#xff0c;思路 循环遍历满足条件就记录&#xff0c;最后返回结果值 3&#xff0c;代码 public class Leetcode2239 {public static void main(String[] args) {System.out.println(new Solution2239().findClosestNumber(new int[]{-4, -2, 1, 4, 8})…...

自然语言处理与NLTK环境配置

自然语言处理(Natural Language Processing, NLP)是人工智能的重要分支,专注于计算机如何理解、分析和生成自然语言。自然语言是人类用于交流的语言,如中文、英文等,这使得自然语言处理成为沟通人与计算机的桥梁。近年来,NLP在诸多领域得到广泛应用,包括文本分析、语言翻…...

分布式搜索引擎02

1. DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1. DSL查询分类 Elasticsearch提供了基于JSON的DSL&#xff08;Domain Specific Language&#xff09;来定义查询。常见的查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有数据&#xff0c…...

使用 Logback 的最佳实践:`logback.xml` 与 `logback-spring.xml` 的区别与用法

在开发 Spring Boot 项目时&#xff0c;日志是调试和监控的重要工具。Spring Boot 默认支持 Logback 作为日志系统&#xff0c;并提供了 logback.xml 和 logback-spring.xml 两种配置方式。这篇文章将详细介绍这两者的区别、各自的优缺点以及最佳实践。 目录 一、什么是 Logbac…...

【爬虫开发】爬虫开发从0到1全知识教程第12篇:scrapy爬虫框架,介绍【附代码文档】

本教程的知识点为&#xff1a;爬虫概要 爬虫基础 爬虫概述 知识点&#xff1a; 1. 爬虫的概念 requests模块 requests模块 知识点&#xff1a; 1. requests模块介绍 1.1 requests模块的作用&#xff1a; 数据提取概要 数据提取概述 知识点 1. 响应内容的分类 知识点&#xff1a…...

鸿蒙UI(ArkUI-方舟UI框架)-开发布局

文章目录 开发布局1、布局概述1&#xff09;布局结构2&#xff09;布局元素组成3&#xff09;如何选择布局4&#xff09;布局位置5&#xff09;对子元素的约束 2、构建布局1&#xff09;线性布局 (Row/Column)概述布局子元素在排列方向上的间距布局子元素在交叉轴上的对齐方式(…...

代码随想录_字符串

字符串 344.反转字符串 344. 反转字符串 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须**原地修改输入数组**、使用 O(1) 的额外空间解决这一问题。 思路: 双指针 代…...

2025年1月17日(点亮三色LED)

系统信息&#xff1a; Raspberry Pi Zero 2W 系统版本&#xff1a; 2024-10-22-raspios-bullseye-armhf Python 版本&#xff1a;Python 3.9.2 已安装 pip3 支持拍摄 1080p 30 (1092*1080), 720p 60 (1280*720), 60/90 (640*480) 已安装 vim 已安装 git 学习目标&#xff1a;…...

Spring Boot自动配置原理:如何实现零配置启动

引言 在现代软件开发中&#xff0c;Spring 框架已经成为 Java 开发领域不可或缺的一部分。而 Spring Boot 的出现&#xff0c;更是为 Spring 应用的开发带来了革命性的变化。Spring Boot 的核心优势之一就是它的“自动配置”能力&#xff0c;它极大地简化了 Spring 应用的配置…...

React技术栈搭配(全栈)(MERN栈、PERN栈)

文章目录 1. MERN 栈2. PERN 栈3. React Next.js Node.js4. JAMstack (JavaScript&#xff0c; APIs&#xff0c; Markup)5. React GraphQL Node.js6. React Native Node.js结论 React作为前端框架已经成为了现代web开发的重要组成部分。在全栈开发中&#xff0c;React通常…...

Linux - 线程池

线程池 什么是池? 池化技术的核心就是"提前准备并重复利用资源". 减少资源创建和销毁的成本. 那么线程池就是提前准备好一些线程, 当有任务来临时, 就可以直接交给这些线程运行, 当线程完成这些任务后, 并不会被销毁, 而是继续等待任务. 那么这些线程在程序运行过程…...

以Python构建ONE FACE管理界面:从基础至进阶的实战探索

一、引言 1.1 研究背景与意义 在人工智能技术蓬勃发展的当下,面部识别技术凭借其独特优势,于安防、金融、智能终端等众多领域广泛应用。在安防领域,可助力监控系统精准识别潜在威胁人员,提升公共安全保障水平;金融行业中,实现刷脸支付、远程开户等便捷服务,优化用户体…...

使用Sum计算Loss和解决梯度累积(Gradient Accumulation)的Bug

使用Sum计算Loss和解决梯度累积的Bug 学习 https://unsloth.ai/blog/gradient&#xff1a;Bugs in LLM Training - Gradient Accumulation Fix 这篇文章的记录。 在深度学习训练过程中&#xff0c;尤其是在大批量&#xff08;large batch&#xff09;训练中&#xff0c;如何高…...

mfc操作json示例

首先下载cJSON,加入项目; 构建工程,如果出现, fatal error C1010: unexpected end of file while looking for precompiled head 在cJSON.c文件的头部加入#include "stdafx.h"; 看情况,可能是加到.h或者是.cpp文件的头部,它如果有包含头文件, #include &…...

C语言练习(18)

一个班10个学生的成绩&#xff0c;存放在一个一维数组中&#xff0c;要求找出其中成绩最高的学生成绩和该生的序号。 #include <stdio.h>#define STUDENT_NUM 10 // 定义学生数量int main() {int scores[STUDENT_NUM]; // 定义存储学生成绩的一维数组int i;// 输入10个…...

LeetCode 热题 100_全排列(55_46_中等_C++)(递归(回溯))

LeetCode 热题 100_两数之和&#xff08;55_46&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;递归&#xff08;回溯&#xff09;&#xff09;&#xff1a; 代码实现代码实现&#xff08;思路一&#xff08…...

编译chromium笔记

编译环境&#xff1a; windows10 powershell7.2.24 git 2.47.1 https://storage.googleapis.com/chrome-infra/depot_tools.zip 配置git git config --global user.name "John Doe" git config --global user.email "jdoegmail.com" git config --global …...

PHP语言的数据库编程

PHP语言的数据库编程 引言 随着互联网的发展&#xff0c;动态网站已成为主流&#xff0c;而动态网站的核心就是与数据库进行交互。PHP&#xff08;超文本预处理器&#xff09;是一种流行的开源服务器端脚本语言&#xff0c;被广泛用于Web开发。它以其简单易学和功能强大而受到…...

【PGCCC】PostgreSQL 中表级锁的剖析

本博客解释了 PostgreSQL 中的锁定机制&#xff0c;重点关注数据定义语言 (DDL) 操作所需的表级锁定。 锁定还是解锁的艺术&#xff1f; 人们通常将数据库锁与物理锁进行比较&#xff0c;这甚至可能导致您订购有关锁的历史、波斯锁和撬锁技术的书籍。我们大多数人可能都是通过…...

1.10 自洽性(Self-Consistency):多路径推理的核心力量

自洽性(Self-Consistency):多路径推理的核心力量 随着人工智能尤其是大规模语言模型的不断进化,如何提升其推理能力和决策准确性成为了研究的重点。在这一背景下,**自洽性(Self-Consistency)**作为一种新的推理方法,逐渐展现出其强大的潜力。自洽性方法通过多路径推理…...

【24】Word:小郑-准考证❗

目录 题目 准考证.docx 邮件合并-指定考生生成准考证 Word.docx 表格内容居中表格整体相较于页面居中 考试时一定要做一问保存一问❗ 题目 准考证.docx 插入→表格→将文本转换成表格→✔制表符→确定选中第一列→单击右键→在第一列的右侧插入列→布局→合并单元格&#…...

Linux 信号(Signal)详解

信号&#xff08;Signal&#xff09;是 Linux 系统中用于进程间通信的一种机制。它是一种异步通知&#xff0c;用于通知进程发生了某个事件。信号可以来自内核、其他进程或进程自身。 信号的基本概念 信号的作用&#xff1a; 通知进程发生了某个事件&#xff08;如用户按下 Ct…...

【数据分享】1929-2024年全球站点的逐年最低气温数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff01;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2024年全球气象站点…...

app版本控制java后端接口版本管理

java api version 版本控制 java接口版本管理 1 自定义 AppVersionHandleMapping 自定义AppVersionHandleMapping实现RequestMappingHandlerMapping里面的方法 public class AppVersionHandleMapping extends RequestMappingHandlerMapping {Overrideprotected RequestCondit…...

2024年度总结-CSDN

2024年CSDN年度总结 Author&#xff1a;OnceDay Date&#xff1a;2025年1月21日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 文章目录 2024年CSDN年度总结1. 整体回顾2…...

基于python的博客系统设计与实现

摘要&#xff1a;目前&#xff0c;对于信息的获取是十分的重要&#xff0c;我们要做到的不是裹足不前&#xff0c;而是应该主动获取和共享给所有人。博客系统就能够实现信息获取与分享的功能&#xff0c;博主在发表文章后&#xff0c;互联网上的其他用户便可以看到&#xff0c;…...

服务器日志自动上传到阿里云OSS备份

背景 公司服务器磁盘空间有限&#xff0c;只能存近15天日志&#xff0c;但是有时需要查看几个月前的日志&#xff0c;需要将服务器日志定时备份到某个地方&#xff0c;需要查询的时候有地方可查。 针对这个问题&#xff0c;想到3个解决方法&#xff1a; 1、买一个配置比较低…...

优化使用 Flask 构建视频转 GIF 工具

优化使用 Flask 构建视频转 GIF 工具 优化后的项目概述 在优化后的版本中&#xff0c;我们将实现以下功能&#xff1a; 可设置每个 GIF 的帧率和大小&#xff1a;用户可以选择 GIF 的帧率和输出大小。改进的用户界面&#xff1a;使用更现代的设计使界面更美观、整洁。自定义…...

leetcode:511. 游戏玩法分析 I

难度&#xff1a;简单 SQL Schema > Pandas Schema > 活动表 Activity&#xff1a; ----------------------- | Column Name | Type | ----------------------- | player_id | int | | device_id | int | | event_date | date | | games_playe…...

windows git bash 使用zsh 并集成 oh my zsh

参考了 这篇文章 进行配置&#xff0c;记录了自己的踩坑过程&#xff0c;并增加了 zsh-autosuggestions 插件的集成。 主要步骤&#xff1a; 1. git bash 这个就不说了&#xff0c;自己去网上下&#xff0c;windows 使用git时候 命令行基本都有它。 主要也是用它不方便&…...