11 PLL IP核

PLL IP 核简介

锁相环(PLL)作为一种反馈控制电路,其特点是利用外部输入的参考信号来控制环路内部震荡信号的频率和相位。因为锁相环可以实现输出信号频率对输入信号频率的自动跟踪,所以锁相环通常用于闭环跟踪电路。锁相环在工作的过程中,当输出信号的频率与输入信号的频率相等时,输出电压与输入电压保持固定的相位差值,即输出电压与输入电压的相位被锁住,这就是锁相环名称的由来。
锁相环拥有强大的性能,可以对输入到 FPGA 的时钟信号进行任意分频、倍频、相位调整、占空比调整,从而输出一个期望时钟;除此之外,在一些复杂的设计中,哪怕不需要修改任何时钟参数,也常会使用 PLL 来优化时钟抖动,以此得到一个更为稳定的时钟信号。正是因为 PLL 的这些性能都是在实际设计中所需要的,并且是通过编写代码无法实现的,所以 PLL IP 核才会成为程序设计中最常用 IP 核之一。需要注意的是 Xilinx 中的 PLL 是模拟锁相环,其优点是输出的稳定度高、锁定时间较短,相位连续可调;缺点是在极端环境(例如极端高/低温环境,高磁场强度等)下容易失锁。
Xilinx7 系列器件中的时钟资源包含有多个时钟管理单元 CMT(Clock Management Tile),每个 CMT 由一个 MMCM(全称 Mixed-Mode Clock Manager,即混合模式时钟管理)和一个 PLL(全称 Phase Locked Loop,即锁相环)组成, MMCM 和 PLL 各自的含义以及区别如下:

  • PLL(锁相环):用来统一整合时钟信号,使高频器件正常工作,如内存的存取数据等。
  • MMCM(混合模式时钟管理):是基于 PLL 的新型混合模式时钟管理器,实现了最低的抖动和抖动滤波,为高性能的 FPGA 设计提供更高性能的时钟管理功能。
  • MMCM 是在一个 PLL 的基础上加入 DCM 的以进行精细相移,也就是说 MMCM 在 PLL 的基础上加上了相位动态调整功能,又因为 PLL 是模拟电路,而动态调相是数字电路,所以 MMCM 被称为混合模式,MMCM 相对 PLL 的优势就是相位可以动态调整,但 PLL 占用的面积更小,在大部分的设计中使用 MMCM 或者 PLL 来对系统时钟进行分频、倍频和相位偏移都是可以满足设计需求的。

PLL 工作原理

PLL 大致的结构模型如下:
在这里插入图片描述
由上图可以看出 PLL 的工作流程如下:

  1. 通过 PFD(全称:Phase-Frequency Detector,即鉴频鉴相器)对参考时钟(ref_clk)频率和需要比较的时钟频率(即上图中的输出时钟:pll_out)进行对比。
  2. PFD 的输出连接到 LF(全称:Loop Filter,即环路滤波器)上,用于控制噪声带宽,滤掉高频噪声,使之趋于一个稳定的值,起到将带有噪声的波形变平滑的作用。如果 PFD 之前的波形抖动比较大,经过环路滤波器后抖动就会变小,趋近于信号的平均值。
  3. 经过 LF 的输出连接到 VCO(全称:Voltage Controlled Oscillator,即压控振荡器)上,LF 输出的电压可以控制 VCO 输出频率的大小,LF 输出的电压越大 VCO 输出的频率越高,然后将这个频率信号连接到 PFD 作为需要比较的频率。
    如果参考时钟输入的频率和需要比较的时钟频率不相等,该系统最终实现的就是让它们逐渐相等并稳定下来。例如参考时钟的频率是 50MHz,经过整个闭环反馈系统后,锁相环对外输出的时钟频率也是50MHz。

PLL 分频原理图

PLL 分频原理图如下图所示:
在这里插入图片描述
分频是在参考时钟与 PFD 之间加入一级分频器(可称为前置分频器),通过前置分频器 N(N 表示数字)分频后得到一个新的参考时钟,因此需要比较的时钟频率(即 pll_out)就始终是和新的参考时钟频率进行对比的,pll_out 的输出结果也会逐渐与新的参考时钟(ref_clk/N)相等,从而实现了分频的功能。

PLL 倍频原理

PLL 倍频原理图如下图所示:
在这里插入图片描述
倍频是在 VCO 与 PFD 之间加入一级分频器(可称为后置分频器),通过后置分频器 M(M 表示数字)分频后得到一个新的需要比较的时钟频率(即 pll_out 分频后的时钟),因为此时与参考时钟频率进行对比的是分频后的输出时钟(pll_out/M),所以此时的输出时钟是参考时钟的 M 倍(pll_out = ref_clk * M),从而实现了倍频的功能。

常用芯片的PLL IP核重要参数

在这里插入图片描述

PLL IP 核的使用

打开 PLL IP 核“Customize IP”窗口

  1. 后点击 Vivado 软件左侧“Flow Navigator”栏中的“IP Catalog”
    在这里插入图片描述
    点击“IP Catalog”后弹出的“IP Catalog”窗口如下图所示
    在这里插入图片描述
  2. 在开“IP Catalog”窗口的搜索栏中输入“clock”关键字
    在这里插入图片描述
  3. 们双击“FPGA Features and Design”→“Clocking”下的“Clocking Wizard”,弹出“Clocking Wizard” IP核的“Customize IP”
    窗口
    在这里插入图片描述

PLL IP 核的配置

PLL IP核配置界面如下,注意包括工具栏、IP核名称设置、“Clocking Options”选项卡、“Output Clocks”选项卡、“Port Renaming”选项卡、“MMCM Setting”选项卡、“Summary”选项卡
在这里插入图片描述

  1. 工具栏提供了一些IP核的通用操作,如查看手册、查看 版本更新记录、打开 IP 介绍的网页、打开 IP 答疑网页、设置 IP 存储路径、分为 IP 核配置等操作。
  2. 设置 IP 名称
    可以在的“Component Name”一栏可以设置该 IP 元件的名称
  3. “Clocking Options”选项卡
    在这里插入图片描述
  • “Clock Monitor”用来监控时钟是否停止、故障和频率变化,一般不用,
  • “Primitive”选项用于选择是使用 MMCM 还是 PLL 来完成时钟需求,对于大多数设计来说 MMCM 和 PLL 都可以满足设计需求
  • “Clocking Featurs”用来设置时钟的特征,包括 Frequency Synthesis(频率合成)、Minimize Power(最小化功率)、Phase Alignment(相位校准)、Dynamic Reconfig(动态重配置)、Safe Clock Startup(安全时钟启动)等,其中 Spread Spectrum(扩频)和 Dynamic Phase Shift(动态相移)是使用 MMCM 时才能够设置的特征
  • “Jitter Optimization”用于抖动优化,可选 Balanced(平衡)、Minimize Output Jitter(最小化输出抖动)或 Maximize Input Jitter filtering(最大化输入抖动滤波)等优化方式。
  • “Dynamic Reconfig Interface Options”用于选择动态重构接口,只有在设置时钟的特征时勾选Dynamic Reconfig(动态重配置)选项后方可进行配置
  • “Input Clock Information”下的表格用于设置输入时钟的信息,各列的含义如下
      第一列:“Input Clock(输入时钟)”中 Primary(主要,即主时钟)是必要的,Secondary(次要,即副时钟)是可选是否使用的,若使用了副时钟则会引入一个时钟选择信号(clk_in_sel),需要注意的是主副时钟不是同时生效的,我们可以通过控制 clk_in_sel 的高低电平来选择使用哪一个时钟,当 clk_in_sel 为 1时选择主时钟,当 clk_in_sel 为 0 时选择副时钟。
      第二列:“Port Name(端口名称)”可以对输入时钟的端口进行命名
      第三列:“lnput Frequency(输入频率)”可以设置输入信号的时钟频率,单位为 MHz,主时钟可配置的输入时钟范围(10MHz~800MHz)可以在其后面的方块中进行查看;副时钟可配置的时钟输入范围会随着主时钟的频率而有所改变,具体范围同样可以在其后面的方块中进行查看。
      第四列:“Jitter Options(抖动选项)”有 UI(百分比)和 PS(皮秒)两种表示单位可选。
      第五列:“lnput Jitter(输入抖动)”设置时钟上升沿和下降沿的时间。
      第六列:“Source(来源)”中有四种选项,“Single ended clock capable pin(单端时钟引脚),当输入的时钟来自于单端时钟引脚时需要选择这个;“Differential clock capable pin(差分时钟引脚)”,当输入的时钟来自于差分时钟引脚时,需要选择这个;“Global buffer(全局缓冲器)”,输入时钟只要在全局时钟网络上,就需要选择这个;“No buffer(无缓冲器)”,输入时钟必须经过全局时钟缓冲器(BUFG),才可以选择这个。
  1. “Output Clocks”选项卡
    在这里插入图片描述
  • “The phase is calculated relative to the active input clock” 表格用于设置输出时钟的路数(一个 PLL IP 核最多可输出六路不同频率的时钟信号)及参数,各列含义如下
      第一列:“Output Clock”为设置输出时钟的路数,因为我们需要输出四路时钟,所以勾选前 4 个时钟。
      第二列:“Port Name”为设置时钟的名字 。
      第三列:“Output Freq(MHz)”为设置输出时钟的频率,这里对“Requested”进行设置,设置完理想值后,就可以在“Actual”下看到其对应的实际输出频率。
      第四列:“Phase (degrees)”为设置时钟的相位偏移,,这里对“Requested”进行设置,设置完理想值后,就可以在“Actual”下看到其对应的相位偏移。
      第五列:“Duty cycle”为占空比,正常情况下如果没有特殊要求的话,占空比一般都是设置为 50%。
      第六列:“Drives”为驱动器类型,有五种驱动器类型可选,BUFG 是全局缓冲器,如果时钟信号要走全局时钟网络,必须通过 BUFG 来驱动,BUFG 可以驱动所有的 CLB,RAM,IOB;BUFH 是区域水平缓冲器,BUFH 可以驱动其水平区域内的所有 CLB,RAM,IOB;BUFGCE 是带有时钟使能端的全局缓冲器,它有一个输入端 I、一个使能端 CE 和一个输出端 O。只有当 BUFGCE 的使能端 CE 有效(高电平)时,BUFGCE 才有输出;BUFHCE 是带有时钟使能端的区域水平缓冲器,用法与 BUFGCE 类似;No buffer 即无缓冲器,当输出时钟无需挂在全局时钟网络上时,可以选择无缓冲区。
      第七列:“Max Freq of buffer”为缓冲器的最大频率,例如选取的 BUFG 缓冲器时支持的最大输出频率为 628.141MHz。
  • USE CLOCK SEQUENCING(使用时钟排序),当在“Clocking Options”选项卡中启用Safe Clock Startup(安全时钟启动)时,Use Clock Sequence 表处于活动状态,可用于配置每个已启用时钟的序列号。在启用Safe Clock Startup(安全时钟启动)后只允许BUFGCE 作为为驱动器输出时钟。
  • Clocking Feedback(时钟反馈),用于设置时钟信号的来源是片上还是片外,是自动控制还是用户控制,当选择自动控制片外的时钟时,还需要配置时钟信号的传递方式是单端还是差分。
  • Enable Optional lnputs/Outputs for MMCM/PLL(启用 MMCM/PLL 的可选输入/输出),其中reset(复位)和 power_down(休眠)为输入信号,locked(锁定)、clkfbstopped(指示信号,指示反馈时钟是否丢失)和 input_clk_stopped(指示信号,指示所选输入时钟不再切换)为输出信号
  • Reset Type(复位类型),用于设置复位信号是高电平有效还是低电平有效
  1. “Port Renaming”选项卡
    在这里插入图片描述
    “Port Renaming”选项卡主要是对一些控制信号(复位信号以外的信号)进行重命名
  2. “MMCM Setting”选项卡
    在这里插入图片描述
    “MMCM Setting”选项卡展示了对整个 PLL 的最终配置参数,这些参数都是由 Vivado 根据之前用户输入的时钟需求来自动配置的,Vivado 已经对参数进行了最优的配置,在绝大多数情况下都不需要用户对它们进行更改,也不建议更改,所以这一步保持默认即可
  3. “Summary”选项卡
    在这里插入图片描述
    最后的“Summary”选项卡是对前面所有配置的一个总结,在检查没问题后点击“OK”按钮,然后在弹出了“Generate Output Products”窗口,直接点击“Generate”即可完成IP核的生成(对于IP核一般选 OOC 编译方式,这样可以避免修改其他代码后重复编译 IP 核)。

模块设计

本次实验的目的是通过 PLL IP 核输出四路不同频率和相位的时钟,系统框图如下:
在这里插入图片描述
开发板的系统时钟为 50MHz,即一个时钟周期为 20ns。100MHz 的时钟一个时钟周期为 10ns;100MHz 相位偏移 180°的时钟就相当于将 100MHz 的时钟的高低电平变化做了一个反相处理;50MHz 的时钟和系统时钟相同;25MHz 的时钟一个时钟周期为 40ns,此外,PLL IP 核还会输出一个时钟锁定信号(locked),所以波形图如下所示:
在这里插入图片描述

编写代码

生成 PLL IP 核

PLL IP 核的配置如下:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在检查没问题后点击“OK”按钮,然后在弹出了“Generate Output Products”窗口,直接点击“Generate”即可完成IP核的生成。

编写代码

代码的主要功能就是例化一个 PLL IP 核,其源码如下:

module ip_clk_wiz(input sys_clk,				//系统时钟input sys_rst_n,			//系统复位,低电平有效output locked,				//锁定标志output clk_100m,			//100Mhz 时钟频率output clk_100m_180deg,		//100Mhz 时钟频率,相位偏移 180 度output clk_50m,				//50Mhz 时钟频率output clk_25m				//25Mhz 时钟频率
);//例化PLL IP核
clk_wiz_0 u_clk_wiz_0_inst0 (.clk_out1(clk_100m),.clk_out2(clk_100m_180deg),.clk_out3(clk_50m),.clk_out4(clk_25m),.reset(~sys_rst_n),.locked(locked),.clk_in1(sys_clk));endmodule

使用 Vivado 自带仿真器进行仿真

在代码中用到了赛灵思提供的IP核,所以不能直接使用Modelsim进行仿真,需要先导入赛灵思IP核的库以后才能仿真,关于Modelsim仿真的内容后面在介绍。

  1. 创建仿真测试激励文件tb_ip_clk_wiz.v,文件内容如下:
`timescale 1ns / 1ps //仿真单位/仿真精度module tb_ip_clk_wiz();reg sys_clk;				//系统时钟
reg sys_rst_n;				//系统复位,低电平有效wire locked;				//锁定标志
wire clk_100m;				//100Mhz 时钟频率
wire clk_100m_180deg;		//100Mhz 时钟频率,相位偏移 180 度
wire clk_50m;				//50Mhz 时钟频率
wire clk_25m;				//25Mhz 时钟频率//信号初始化
initial beginsys_clk = 1'b0;sys_rst_n = 1'b0;#200sys_rst_n = 1'b1;
end//产生时钟
always #20 sys_clk = ~sys_clk;//例化需要仿真的IP核
ip_clk_wiz tb_u_ip_clk_wiz_inst0(.sys_clk(sys_clk),				//系统时钟.sys_rst_n(sys_rst_n),			//系统复位,低电平有效.locked(locked),				//锁定标志.clk_100m(clk_100m),			//100Mhz 时钟频率.clk_100m_180deg(clk_100m_180deg),		//100Mhz 时钟频率,相位偏移 180 度.clk_50m(clk_50m),				//50Mhz 时钟频率.clk_25m(clk_25m)				//25Mhz 时钟频率
);
endmodule
  1. 点击“Sources”窗口中的“+”号(Add Sources 命令),在弹出的窗口中选择“Add or Create Simulation Sources”,然后点击 next。
    在这里插入图片描述

  2. 再弹出的界面中点击“Add Files”来将编写好的仿真源文件添加到工程中,步骤如下图所示:
    在这里插入图片描述

  3. 完成后点击“Finish”,注意,不要勾选“Scan and add RTL include files into Project”和“Copy sources into Project”两个选项
    在这里插入图片描述

  4. 在“Flow Navigator”窗口中点击“Run Simulation”并选择“Run Behavioral Simulation”
    在这里插入图片描述

  5. 经过稍许时间的等待,就进入了 Vivado 自带的仿真器界面。
    在这里插入图片描述
    整个界面分4个部分
    (1)“Scope”窗口:HDL 设计的层次划分,在“Scope”窗口中可以看到设计的层次结构,当选择了一个“Scope”层次结构中的作用域时,该作用域内的所有 HDL 对象,包括 reg、wire 等都会出现在“Objects”窗口中,然后可以在“Objects”窗口中选择 HDL 对象,并将它们添加到波形查看器中。
    (2)“Object”窗口:“Objects”窗口会显示在“Scopes”窗口中选择的范围内的所有 HDL 仿真对象.
    (3)波形窗口:用于显示所要观察信号的波形。若要向波形窗口添加单个 HDL 对象或多个 HDL 对象,可以在“Objects”窗口中,右键单击一个或多个对象,然后从下拉菜单中选择“Add to Wave Window”选项。
    (4)仿真工具栏:仿真工具栏包含运行各个仿真动作的命令按钮,从左至右依次是 “Restart”将仿真时间重置为零、“Run all”运行仿真、 “Run For”运行特定的一段时间、“Step”按步运行仿真、“Break”暂停当前仿真、 “Relaunch”重新编译仿真源并重新启动仿真。

  6. Vivado 自带的仿真器界面中即可完成仿真操作
    在这里插入图片描述

Vivado 几种仿真模式的差异

Vivado 有如下五种仿真模式:

  1. “run behavioral simulation”行为级仿真,也是通常说的功能仿真。
  2. “post-synthesis function simulation”综合后的功能仿真。
  3. “post-synthesis timing simulation”综合后的时序仿真,和真实运行的时序就相差不远了。
  4. “post-implementation function simulation”实现后的功能仿真。
  5. “post-implementation timing simulation”实现后的时序仿真,最接近真实的时序波形。

数字电路设计中一般包括 3 个大的阶段:源代码输入、综合、实现,而电路仿真的切入点也基本与这些阶段相吻合,根据不同的设计阶段,仿真可以分为 RTL 行为级仿真、综合后门级功能仿真、时序仿真,具体描述如下:

  1. RTL 行为级仿真;在大部分设计中执行的第一个仿真都是 RTL 行为级仿真,这个阶段的仿真可以用来检查代码中的语法
    错误以及代码行为的正确性,需要注意是该阶段的仿真是不包含延时信息的,如果没有实例化一些与器件相关的特殊底层元件的话,这个阶段的仿真也可以做到与器件无关。
  2. 综合后门级功能仿真 (前仿真);一般在设计流程中的第二个仿真是综合后门级功能仿真,绝大多数的综合工具都可以输出标准网表文件和 Verilog 或者 VHDL 网表文件,其中标准网表文件是用来在各个工具之间传递设计数据的,并不能用来做仿真使用,Verilog 或者 VHDL 网表文件是可以用来仿真的,之所以叫门级仿真是因为综合工具给出的仿真网表与生产厂家的器件的底层元件模型对应起来了。
  3. 时序仿真 (后仿真);在设计流程中的最后一个仿真是时序仿真,布局布线完成以后可以提供一个时序仿真模型,这个模型中除了包含一些器件信息外还会提供了一个 SDF 时序标注文件。

Modelsim 联合仿真

生成 Modelsim 编译仿真库

  1. 在 Modelsim 安装路径下新建一个文件夹来存放仿真库,这里将其命名为 vivado2020.2_lib
    在这里插入图片描述

  2. 打开 Vivado(切记不要开任何工程),点击 Tools 下的 Compile Simulation Libraries(编译仿真库)选项,打开Compile Simulation Libraries 窗口
    在这里插入图片描述

  3. Simulator(仿真器)选择 ModelSim Simulator;Language(语言)可以保持默认选项 all(即 Verilog 与 VHDL 都可以);Library(库)可以保持默认选项 all(即包含 unisim(功能仿真)和 simprim(时序仿真)的库);Famliy(芯片族)默认为 all,选 all 的话编译时间会很长,而且编译出来会很大,所以这里按需勾选即可;在这里插入图片描述

  4. Compiled library location(汇编库地址)和 GCC executable path(GCC 可执行路径)都选择我们一开始创建好的 vivado2020.2_lib 文件夹; Simulator executable path(仿真器可执行路径)选到 Modelsim 安装路径下的 win64 文件夹(一般 Vivado 会自动识);完成后点击“Compile”进行编译。
    在这里插入图片描述

  5. 编译仿真库的时间较长,需要耐心等待,编译完成后会出现下图所示的信息列表
    在这里插入图片描述

在 Vivado 中关联 Modelsim

  1. 点击 Tools 下的 Settings(设置)选项
    在这里插入图片描述
  2. 在弹出的“Settings”窗口进行如下设置
    在这里插入图片描述
    切换到“3rd Party Simulators(第三方仿真器)”页面,指定 Modelsim 的 lnstall Paths(软件路径)和 GCC Install Paths(仿真库路径)即可,设置完成后点击“OK”。

联合仿真

  1. 打开需要仿真的工程,然后点击 Tools 下的 Settings(设置)选项,在 Settings 窗口中选择 Simulation(仿真器)页面,然后在该页面中指定该工程使用什么仿真器进行仿真
    在这里插入图片描述
    Target simulator(目标仿真器)选项中选择 Modelsim Simulation(默认为 Vivado 自带仿真器:Vivado Simulation)
    compiled library location(仿真库地址)指定之前创建的 vivado2020.2_lib 文件夹
    其余选项保持不变,点击“OK”。
  2. 在“Flow Navigator”窗口中点击“Run Simulation”并选择“Run Behavioral Simulation”,此时时 Vivado 会自动打开 Modelsim 软件并编译运行
    在这里插入图片描述

提示
联合仿真时 Vivado 默认的库是 xli_defaultlib,如果联合仿真时修改了代码,可以在 Modelsim 工程对应的 library 下找到 xli_defaultlib 来进行编译。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

36.云原生之SpringCloud+k8s实践

云原生专栏大纲 文章目录 SpringCloudk8s介绍spring-cloud-kubernetes服务发现配置管理负载均衡选主 spring-cloud-bookinfo案例构建项目环境配置namespace部署与验证productpagegatewaybookinfo-admindetailsratingsreviewsreviews-v1reviews-v2 总结 SpringCloudk8s介绍 ht…

React UI框架Antd 以及 如何按需引入css样式配置(以及过程中各种错误处理方案)

一、react UI框架Antd使用 1.下载模块 npm install antd -S 2.引入antd的样式 import ../node_modules/antd/dist/reset.css; 3.局部使用antd组件 import {Button, Calendar} from antd; import {PieChartTwoTone} from ant-design/icons; {/* 组件汉化配置 */} import l…

SORA 到底是什么?如何用bitget wallet购买?

什么是SORA? SORA 是一种模因币,灵感来自 OpenAI 最新的人工智能模型 Sora,它巧妙地根据文本输入生成视频。 SORA 诞生于加密社区内人工智能项目的热潮中,利用 OpenAI 的公告推出了一种独特且时尚的数字资产。正如 memecoin 网站…

【管理咨询宝藏资料28】某信息技术有限公司战略规划报告

本报告首发于公号“管理咨询宝藏”,如需阅读完整版报告内容,请查阅公号“管理咨询宝藏”。 【管理咨询宝藏资料28】某信息技术有限公司战略规划报告 【关键词】战略规划、对标研究、管理咨询 【文件核心观点】 - 使企业实现商业流程整合,构…

宏集小型PLC应用于浮动封盖机

导言 仅通过1个控制面板和1个紧凑型PLC控制自动化设备中来自不同制造商的13种不同电机,听起来难以置信!但这是宏集科技已经落地的合作项目! 案例概况 客户:TREPAK 合作伙伴:SDT 应用:封盖机 应用产品&…

UE5 UE4 自定义插件自动开启关联插件(plugin enable)

在我们自己编写UE4、UE5的插件时,常常需要开启相关联的插件进行功能编写。 例如:UE4/5 批量进行贴图Texture压缩、修改饱和度_ue4批量修改纹理大小-CSDN博客 而让插件使用者每次使用时,依次进行开启其他相关联插件确实有些麻烦。 如何只需要…

【数据结构】数组

第一章、为什么数组的下标一般从0开始编号 提到数组,读者肯定不陌生,甚至还会很自信地说,数组很简单。编程语言中一般会有数组这种数据类型。不过,它不仅是编程语言中的一种数据类型,还是基础的数据结构。尽管数组看起…

js 面试 http 与 https, 长连接,http状态码,哪三次握手,在浏览器地址栏键入URL回车之后过程?

1 概念 http是超文本传输协议,信息明文传输。 https是安全超文本传输协议, 以安全为目标的HTTP通道,在HTTP的基础上通过身份认证和传输加密阶段保证了传输过程的安全性. https:主要是增加了TLS(Transport Layer Security 安全传输层协议)/…

超声波清洗机对眼镜有伤害吗?警惕清洗眼镜禁忌!

近年来,随着人们对健康生活要求的提升,超声波清洗机在市场上的受欢迎程度逐渐攀升,产品的多样性也让人眼花缭乱。近期收到了大量读者的一些私信,其中很多人询问使用超声波清洗机会对眼镜有伤害吗、超声波清洗机是不是智商税、超声…

如何使用Docker部署WBO容器并实现固定公网地址访问本地白板界面

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默&…

【Git教程】(六)分支合并 —— 合并过程,各类合并冲突及解决思路 ~

Git教程 分支 1️⃣ 合并过程中发生的事2️⃣ 冲突3️⃣ 编辑冲突4️⃣ 冲突标志5️⃣ 解决编辑冲突6️⃣ 内容冲突7️⃣ 快进合并8️⃣ 第一父级提交历史9️⃣ 棘手的合并冲突🌾 总结 使用 merge 命令来进行分支合并是 Git 中最重要的操作之一。虽然这一操作的底层…

Window10安装ruby

最好的方法,使用rubyinstaller,即在Downloads。 这是官方推荐的安装方式 通常来说我们会下载64位的 下载完后执行下载的exe即可。在最后一步会提示让安装gem,选则安装即可。 然后就可以在控制台进行测试了。

UE蓝图 宏(Macro)节点和源码

系列文章目录 UE蓝图 Get节点和源码 UE蓝图 Set节点和源码 UE蓝图 Cast节点和源码 UE蓝图 分支(Branch)节点和源码 UE蓝图 入口(FunctionEntry)节点和源码 UE蓝图 返回结果(FunctionResult)节点和源码 UE蓝图 函数调用(CallFunction)节点和源码 UE蓝图 序列(Sequence)节点和源…

JWT基于Cookie的会话保持,并解决CSRF问题的方案

使用JWT进行浏览器接口请求,在使用Cookie进行会话保持传递Token时,可能会存在 CSRF 漏洞问题,同时也要避免在产生XSS漏洞时泄漏Token问题,如下图在尽可能避免CSRF和保护Token方面设计了方案。 要点解释如下: 将JWT存入…

PclSharp--计算AABB包围盒体积2

一、AABB包围盒 AABB包围盒即轴对齐包围盒,就是包围盒对齐坐标轴。计算相对简单,在要求不精细的情况下,这种包围盒是够用的。 MomentOfInertiaEstimation 是 PCL中的一个类,用于计算点云中物体的矩。它可以提供点云物体的三个主…

【HarmonyOS】鸿蒙开发之Video组件——第3.7章

Video组件内VideoOptions属性简介 src:设置视频地址。currentProgressRate:设置视频播放倍速,参数说明如下: number|string:只支持 0.75 , 1.0 , 1.25 , 1.75 , 2.0 。P…

IDEA利用鼠标调整字体大小

就可以按住ctrl和鼠标调节代码字体的大小啦! 如果有用,记得给我来个赞~ 谢啦!

Flutter中高级JSON处理:使用json_serializable进行深入定制

Flutter中高级JSON处理 使用json_serializable库进行深入定制 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/article/details/1363…

小红书母婴博主推广方式汇总,投放总结

母婴博主有区别于其他博主,她需要一定的行业知识,需要取得粉丝的一定信任,才能顺利传播进而一步一步成长。今天和大家分享下小红书母婴博主推广方式汇总,投放总结! 1、小红书母婴博主有哪些领域 母婴博主不同于育儿博主…

windows定时备份日志文件

前言 之前项目因为各种原因没有上 CI/CD,也没有部署什么 nginx 管理工具,再加上 nginx 部署在 windows server 上,面对日积月累不停膨胀的日志文件,需要一个定时脚本处理自动分割日志文件。 本篇文章主要讲解如何在 windows 上创…