jjzjj

FPGA面试题目笔记(一)——FPGA开发流程、亚稳态和竞争冒险、建立保持时间、异步FIFO深度等

Fighting_XH 2023-04-13 原文

文章目录


本文针对Leetcode中 2021秋招数字IC设计岗面试题总结进行学习,很多知识点在 FPGA基础学习总结系列中已经学习过,因此遇到相同题目只简单描述。


点击2021 FPGA面试题总结进行题目查看

字节跳动 -FPGA 岗

1、掌握FPGA开发流程

下图为FPGA的开发流程。

1、功能定义/器件选型
简单来说,这部分是来确定所要实现的电路功能,同时在系统设计之前对电路功能进行方案验证、系统设计以及FPGA芯片等的选择。

选择设计方案以及器件类型的指标:根据任务要求(系统的指标以及复杂度),对工作速度和芯片自身的资源、成本等进行考量,从而作为指标进行设计方案和器件类型的选择。

设计方法:一般采用自顶向下的设计方案,将整个系统(top顶层)进行划分,分成若干个基本单元,再将每个基本单元划分成下一层的基本单元,不断划分,使得每个输入信号,都能利用EDA工具以及FPGA资源设计出所需要的输出逻辑。

2、设计输入
这部分是采用EDA工具设计出功能电路。一般有两种方式:原理图、HDL语言,IP核也可以作为一种设计输入方式。
原理图输入:最直接的描述方式,直接从元件库中调用所需要的器件,彼此连接形成原理图。设计直观但是设计效率不高且不便于维护,可移植性差。
HDL语言输入:采用硬件描述语言的方式(VHDL、Verilog)设计出功能电路。简单来说,就是各种逻辑门、寄存器等电路都用相应的硬件描述语言进行描述。优点:语言和芯片工艺无关,因此在任一FPGA芯片上,都可采用硬件描述语言进行设计,可移植性强。
3、功能仿真(前仿真)
功能仿真也称为综合前的仿真,该部分是对电路进行逻辑功能验证,无需考虑延迟等。方法:编写testbench测试文件,后采用EDA工具(modelsim)进行波形仿真并生成报告文件,根据波形来对电路功能进行验证。
4、综合优化
综合就是针对给定的电路功能以及实现该电路的约束条件(速度、功耗、成本和电路类型等),对设计出来的电路进行优化。综合后的结果就是硬件电路的设计方案,该方案要满足给定电路的预期设计要求。
5、综合后仿真(后仿真)
在quartus中完成硬件描述后进行综合,综合后生成功能网表,此时编写tb文件,将编写的功能电路加载到modelsim中进行仿真,这就称为后仿真,它将电路的门延迟参数和各种电路单元之间的连线情况考虑在内后进行仿真,主要用来检测综合结果与原电路设计是否一致。
6、布局布线
后仿真成功后,我们就需要在quartus中完成映射和布局布线,也就是将逻辑映射到FPGA器件结构的资源上,简言之,将综合后生成的网表配置到具体的FPGA芯片上,同时保证速度、面积最优的连接方式。该部分完成后我们可得到配置文件,并自动生成报告,得到FPGA资源的使用情况。
静态时序分析:对建立时间和保持时间进行分析。
7、时序仿真
也称为后仿真,将布局布线的延迟也考虑在内,从而来检查时序是否出现违规情况(主要是分析是否满足时序要求,如是否满足建立时间和保持时间)。【时序仿真包括了布局布线延迟,且波形中也加载了时延,但不同芯片内部延时不一样,因此不同的布局布线方案也会带来不同的延时效果,所以布局布线后,我们可以通过对整个系统或者各个模块进行时序仿真,来得到时序关系,估计系统的性能,还能检查和消除竞争冒险现象】
8、板级仿真与验证
板级仿真主要应用于高速电路设计中,对高速系统的信号完整性、电磁干扰等特征进行分析。
9、芯片烧录与调试
至此我们完成了逻辑电路设计,并生成了配置文件,将配置文件下载到FPGA开发板上,在开发板上进行功能的实现验证与调试。
综上,给出采用ZYNQ实现整个FPGA开发流程的步骤。

2、时序问题如何解决

1、采用静态或者动态时序分析,来计算各个路径的传播延迟,检查信号的建立时间和保持时间是否满足时序要求。通过对最大路径延时和最小路径延时的分析,找出违背时序约束的错误。还可根据时序报告对时序进行优化。
2、要掌握有哪些时序问题,如亚稳态情况等,针对问题进行解决。

2.1 时序逻辑电路中的亚稳态现象

需要掌握什么是亚稳态,以及亚稳态现象是如何产生的,通过什么方式可以解决亚稳态的出现。

亚稳态:输入信号在时钟有效沿的建立时间和保持时间之间变化,导致其不满足触发器建立保持时间的时序要求,使得输出有一段时间的不确定状态,这就是亚稳态。

亚稳态现象包括如下几种:
1、跨时钟域中的亚稳态:由于源信号时钟与目的信号时钟的相移未知,可能导致保持时间和建立时间条件不满足,从而产生亚稳态现象。——采用FIFO对跨时钟域数据通信进行缓冲设计。

2、异步信号中的亚稳态:由于异步信号不与触发器同步时钟同步,所以可能导致保持时间和建立时间条件不满足,产生亚稳态现象。—— 通过同步处理来解决。

3、异步复位检测中的亚稳态:复位信号的变化出现在建立或者保持时间内,也无法保证满足Tsu和Th的要求,出现亚稳态。——对复位电路采用异步复位、同步释放方式处理。

注意:对于单比特的数据传输,我们可以采用两级寄存器来同步,以消耗亚稳态,但是多比特数据需要采用异步FIFO来处理,因为同步器输出只能保证最后的输出是一个稳态,0或者1,但是不能保证是一个确定值。故多比特数据如果使用同步的方式来消除亚稳态的话,会出现乱码的情况。

具体掌握查看亚稳态部分即可。
时序收敛方法
时钟穿越问题

2.2 组合逻辑延迟太大导致时序不满足要求

插寄存器来缩短组合逻辑的延时。流水线技术、并行化设计

2.3 组合逻辑中的竞争和冒险问题

参考

2.3.1 什么是竞争和冒险

竞争(Competition): 在组合逻辑电路中,某个输入变量通过多条(两条及以上)途径传到输出端,由于每条途径延迟时间不同,到达输出门的时间就有先有后,这种现象称为竞争。竞争又分为临界和非临界竞争,不会产生错误输出的竞争为非临界竞争。产生暂时性或永久性错误的竞争为临界竞争。

冒险(risk):信号在器件内部通过连线和逻辑单元时,都有一定延时。延时的时间与连线的长短和逻辑单元数目有关,同时还受器件的制造工艺、电压、温度等影响;

多路信号在电平值变化时也都存在不同的延迟,对应的组合逻辑的输出也就有了先后顺序,因此就产生了冒险。

冒险现象中会出现一些不正确的尖峰信号,称为"毛刺"。如果一个组合逻辑电路中有"毛刺"出现,就说明该电路存在冒险。也可以说由于竞争引起电路输出发生瞬间错误,该现象为冒险。

2.3.2 产生原因

总结:竞争和冒险都是由于存在电路延迟引起的,同时冒险是由竞争造成的,而竞争是因为电路中的时延不同,但是有竞争的时候不一定会出现冒险。


题目:(大疆2020芯片工程师校招)组合逻辑电路中的冒险是由于( D)引起的。

A、电路有多个输出

B.、电路未达到最简

C、逻辑门类型不同

D、电路中的时延

再下面给出一个例子进行解释:

上图可看出,实现的功能 out = a & (~a);该设计出现了1冒险,也就是本身结果应该为0,但是却出现了为1的毛刺,因此为1冒险。

2.3.3 判断方法

代数法
逻辑函数表达式中,若某个变量同时以原变量和反变量两种形式出现。
如表达式为:Y=A+A’,就会产生“0”冒险;F=A*A’,就会产生“1”冒险。(结果该为1出现0的错误为0冒险,反之为1冒险)

卡诺图法
若输入变量是在相邻卡诺圈的相邻处发生变化,并且是从一个卡诺圈进入另一个卡诺圈,则有可能产生逻辑冒险。(卡诺图相切

上图可看出,卡诺图中存在两个相切但不相交的圈,那么输出的时候就会出现冒险现象。

2.3.4 解决方法

(1)增加冗余项
根据卡诺图可看到,我们增加了一个圈,逻辑表示式不是最简,但是可以消除冒险情况。

(2)增加选通信号(高电平)

输入端加入选通信号,针对 A+(~A) 的 1 型冒险,避开毛刺。

(3)引入封锁脉冲(低电平)

输入端加入封锁脉冲信号,针对 A·(~A) 的 0 型冒险,避开毛刺。

(4)增加滤波电容

由于冒险输出的是一个很窄的毛刺,因此可以在输出端接滤波电容将其滤除。

(5)采用可靠性编码

比如采用格雷码的编码方式,每次变化的时候只变化1位。

3、建立时间Tsu和保持时间Th

在静态时序分析部分对建立时间和保持时间进行了讲解。
建立时间和保持时间是在时序逻辑电路中讨论的,二者用来测试输入信号和时钟信号之间的时间要求是否满足。
根据下图清楚的理解建立和保持时间:
Tsu为建立时间:触发器上升沿到来之前,输入端数据保持不变的最小时间为Tsu。若Tsu不满足要求,那么输入信号data无法在这一时钟正确打入触发器,需要等待下一时钟上升沿到来。
Th为保持时间:时钟上升沿出现后,数据继续保持稳定的最小时间为保持时间,若保持时间不够,那么数据同样不能正确被打入触发器。

因此D触发器输入的数据必须在建立时间前达到,且要持续到保持时间后。

3.1 有效 / 固有建立时间和保持时间

假设有效保持时间为Tsetup_valid。
对于D触发器,其本身的建立时间Tsu = 2ns,也就是数据在时钟有效沿来之前保持2ns的稳定,这样才能保证来自输入datatin的数据稳定地到达D端。
由于时钟来自于clock,也有着时钟延迟,且clk要早于触发器Toffest=1ns到达。

因此,考虑时钟延迟,得到有效保持时间:Tsetup_valid = Tsu - Toffest = 1ns
.
考虑数据路径延迟,得到 Tsetup_valid = Tsu - Toffest +Tcmob

有效保持时间Thold_valid也是同样的分析。

考虑时钟延迟的影响:

考虑到电路时钟对于触发器时钟早到Toffest = 1ns,所以电路有效保持时间Thold_valid = Thold + Toffest ;
.
考虑路径延迟影响:

数据需要经过一段组合逻辑之后才能保持稳定,因此电路的有效保持时间为:

Thold_valid = Thold + Toffest - Tcmob

3.2时序设计的实质

满足每一个触发器建立时间和保持时间的要求

3.3 建立时间裕量和保持时间裕量的公式

建立时间裕量公式:

T slack = Tclk + Tskew - Tsu - Tco - Tcomb;

保持时间裕量公式:

T slack = Tco + Tcomb - Tskw - Th

具体推导

4、时钟偏移和时钟抖动

4.1 概念

掌握时钟偏移(Tskew)和时钟抖动(Tjitter)分别是什么,并且应该如何减少这两种情况出现。
时钟偏移是同一时钟到达两个不同触发器的时钟差值。Tskew = Tclk2 - Tclk1

时钟抖动是两个时钟周期之间的差值。Tjitter=T2 - T1

4.2 如果减少时钟偏移和时钟抖动

减小时钟抖动的方法:

受时钟自身的影响,不受布线的影响,因此通过控制系统温度变化、减少机械振动、减少电源、地等来减少,选用好的时钟源。

减小时钟偏移的方法:

时钟偏移是由于布线长度或者不同负载(组合逻辑)引起的,因此可使用低输出阻抗的时钟驱动,如果驱动能力不够可用同型号电源并联、采用树形结构、低阻抗时钟分布线、远程匹配多驱动来解决。——采用全局时钟

补充:

一般地,我们在进行分频操作的时候,采用PLL来完成,尽量避免对时钟进行逻辑操作,否则容易出现时钟偏移、抖动,甚至出现时钟毛刺的情况。

5、最小工作周期和最大工作频率的计算方式

最小工作周期Tmin=Tco+Tcomb+Tsu-Tskew+ Tjitter //寄存器内部延迟+组合逻辑延迟+建立时间延迟-时钟偏移 + 时钟抖动
最大工作频率1/Tmin
注意:在求解Tcmob的时候 ,找到两个触发器间的关键路径

为了更好第理解,给如下例题:
如图所示,寄存器和逻辑块都是单位延迟,Tr = Tf = 1;寄存器是上升沿触发,建立时间为Tsu = 1,多路选择器MUX的延时为Tmux = 2。

(1)不考虑时钟偏差,计算最小的时钟周期
首先我们选择最长的路径计算可得到最小的时钟周期:

Tmin = Tco+Tcomb+Tsu = 1+ 1*5 + 2 + 1 = 9

(2)考虑时钟偏移且Tskew = t2 - t1 = 1的时候,最小时钟周期:

Tmin = Tco+Tcomb+Tsu-Tskew =  1+ 1*5 + 2 + 1 -1 = 8

(3)考虑时钟偏移且Tskew = t2 - t1 = 4的时候,最小时钟周期 :

Tmin = Tco+Tcomb+Tsu-Tskew =  1+ 1*5 + 2 + 1 -4 = 5

(4)假设时钟周期T,推导出能保证电路正常运行所允许的时钟偏差范围(要考虑正负时钟偏差)

Tskew = t2 -t1 ;
正偏差的时候:要想R2正确采样到数据,那么时钟偏差必须小于R1到R2的最小延时,则 Tskew < 1+1*3+2 = 6 (不包含建立时间)
负偏差的时候:T - |Tskew| ≥ R1到R2的最大延时 因此,T - |Tskew|9 
于是得到:
(9-T) ≤ T_skew < 6

6、简述触发器和锁存器的差别

触发器:时钟边沿触发,在时钟边沿时触发输出状态改变。
锁存器:电平触发,在输入电平作用下触发输出状态改变。
详细讲述二者之间的差别

7、同步和异步逻辑、电路

7.1 同步异步逻辑电路

一、同步逻辑:时钟之间有着固定的因果关系,且触发只和时钟有关,只要在时钟沿处才能触发。

二、同步电路: 同步电路中所有触发器的时钟端连接在同一时钟源上,所有触发器状态的改变都与时钟信号同步。因此当时钟沿到来则输出变化,否则保持,直到下一时钟脉沿到来才发生变化。

图解1:两个触发器都连接在同一时钟clk上。

图解2:触发器俩个时钟之间有着因果关系,都是由clk得到的。

三、异步逻辑:时钟之间没有固定的因果关系,其触发和多种控制因素有关,当任何一个因素发生变化,那么都能实现触发。

四、异步电路中没有统一的时钟。有些触发器的时钟输入端与时钟源相连,只有这些触发器的状态变化与时钟脉冲同步,而其他的触发器的状态变化不与时钟脉冲同步。

图解1:两个触发器采用不同的时钟

图解2:与门的输入来自不同时钟的触发器

图解3:
与门的逻辑一个来自时钟驱动的触发器,另一个来自纯组合的输入端口。

总结:同步逻辑和异步逻辑不是完全割裂的,异步逻辑中肯定有同步逻辑的成分在,但同步逻辑中不可能有异步逻辑的成分。

7.2 同步复位和异步复位的区别

1、同步复位
复位信号与clk有效,当clk有效的时候,复位才有效。
优点:有利于进行时序分析;由于只在clk有效的时候有效,因此能防止毛刺现象的出现。
缺点:复位信号必须大于时钟周期,才能被系统真正识别;大部分逻辑器件中的D触发器都只有异步复位端口,因此采用同步复位的话,需要在寄存器的数据输入端插入组合逻辑,此时我们就需要考虑组合逻辑延迟等因素。

module test(clk,rst,q,d);

 
	 input           clk    ;
	 input           rst    ;
	 input           d      ;
	 output  reg     q      ;
	 

always @ (posedge clk  )
    if(rst)
	     q <= 0;

    else
	     q <= d;
		  
endmodule

2、异步复位
复位信号与clk无关,只和自身输入的复位信号有关。
优点:大部分逻辑器件中的D触发器都只有异步复位端口,无需再插入组合逻辑,省资源;设计相对简单;
缺点:复位信号可能不满足建立和保持时间要求,因此容易出现亚稳态;容易受毛刺影响;

module test(clk,rst,q,d);

 
	 input           clk    ;
	 input           rst    ;
	 input           d      ;
	 output  reg     q      ;
	 

always @ (posedge clk or posedge rst )
    if(rst)
	     q <= 0;

    else
	     q <= d;
		  
endmodule


可看到
复位变成低电平的时候,输出直接发生变化,无需等待clk上升沿的到来。

补充:如果电路采用同一时钟源,但子模块中采用了由PLL分频出来的时钟进行驱动,这种仍然为同步电路,因此整个的电路还是由一个统一的时钟源驱动的。而异步电路没有统一的时钟源。

异步复位,同步释放


verilog实现异步复位,同步释放:



module design_rst(

    input clk,
	 input rst_n,
	 input in,
	 output reg out


);
//异步复位,同步释放
reg rst_n1;
reg rst_n2;

always @ (posedge clk or negedge rst_n)
    if(!rst_n)begin
	     rst_n1 <= 0;
		  rst_n2 <= 0;
		  end
	 else begin
	     rst_n1 <= rst_n;
		  rst_n2 <= rst_n1;
	 end
		  

always @ (posedge clk or negedge rst_n2)
    if(!rst_n2)
	     out <= 0;
	 else
	     out <= in;
		  
		  
endmodule 

tb测试:

`timescale 1ns/1ps

module tb( ); //对同步fifo仿真

   reg	  clk;
	reg     rst_n;
	reg	  in;

	
	wire	  out;



design_rst design_rst (
    
	 .clk(clk),
	 .rst_n(rst_n),
	 .in(in),
	 .out(out)
);


//产生时钟激励

initial begin
    clk =   0;
	 in =    1;
	 rst_n = 0;
	 
	 #80;
    rst_n  = 1;
	 #120;
	 rst_n  = 0;
	 #100;
	 rst_n  = 1;
	 $stop;
end	 
always #40 in = ~in;
always #10 clk = ~clk;

endmodule

可看到复位信号撤销(释放)后,被同步到时钟域下,然后在输入高电平和时钟上升沿的时候,才能输出高电平。

带有同步、异步的触发器参考。

8、异步FIFO深度计算

FIFO题目合集


9、摩尔和米利状态机

二者都是时序逻辑电路。

1、Moore 状态机的输出仅与当前状态值有关, 且只在时钟边沿到来时才会有状态变化。

2、Mealy 状态机的输出不仅与当前状态值有关, 且与当前输入值有关。

3、什么是状态图?
状态图是以几何图形的方式来描述时序逻辑电路的状态转移规律以及输出与输入的关系。

掌握两种状态机的区别
掌握一段、二段及三段式状态机的写法

10、FPGA内部结构资源

FPGA主要由可编程单元、可编程I/O单元及布线资源构成。

11、对于IC设计前端、后端的理解

设计前端也称逻辑设计,后端设计也称物理设计。
前端设计:需求分析与架构设计、将HDL语言–>网表,RTL设计、仿真验证、逻辑综合
后端设计:网表–>芯片版图。布局布线以及板级物理验证。

继续学习FPGA面试题目笔记(二)

参考

有关FPGA面试题目笔记(一)——FPGA开发流程、亚稳态和竞争冒险、建立保持时间、异步FIFO深度等的更多相关文章

  1. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  2. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  3. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  4. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  5. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  6. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  7. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  8. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  9. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  10. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

随机推荐