FPGA学习笔记

《基于verilog语言的使用FPGA设计》

我并不在乎工作中能有多少乐趣,我建议在没有搞清楚你所想要的设计结果之前不要轻易地开始编程。

——K.科夫曼

为了不被淘汰,从现在起我们不得不做两件事:

  1. 掌握那些永远不会过期的技能,其中包括物理知识(数字电路设计中的模拟技术、传输线理论、能量守恒理论、天线理论电源管理理论)和诸如同步、亚稳态和传输时延的设计概念。
  2. 与时俱进。多参加学术讨论,多读一些有关的杂志,多买一些你认为很有用的书,多关注人们都在谈论什么。

 

关于工程进度表:

工程师们虽然都有着丰富的经验,但在制定工作进度时依然会表现的过分乐观,所以他们常常会造成进度延后。

对这个问题,我们需要更加成熟的来看待。如果没有最后期限,什么工作都完不成。所以大多数工作在超时很少的情况下能够完成是正常的。

 

设计者做出的设计必须遵循以下要求:

  1. 清晰并易于理解。
  2. 逻辑的正确性。用户需求、器件参数、输入准则
  3. 适应最恶劣的环境温度和工艺变化。元器件老化、温度变化、元器件个体差异(与时序相关的变量,包括时钟偏移、寄存器建立和保持时间、传输时延和输出上升/下降时间)
  4. 可靠性。功耗,产生的热量限制
  5. EMI/RFI限制。电磁干扰、射频干扰
  6. 能耗限制。电池

 

为什么学习Verilog:Verilog更容易学,并且Verilog比VHDL更贴近数字电路本身。

综合:是高级设计描述向目标硬件的转换过程。

 

Verilog是一种大型的、完整的仿真语言,其很多要素都无需转换到硬件中,只有10%可以综合。

Verilog和c语言很像,但c语言定义的是顺序过程,而verilog则定义了顺序过程和并行过程。

always、if、case属于编译指令,除此外都用";"作为分隔符

 

modulehello(/*端口列表*/in1,in2,in3,out1,out2,clk,rst,bidir_signal,output_enable);

//注释

/*注释

注释*/

 

//端口方向列表(输入、输出、双向),其中所有的信号都是线网型

//线网相当于电路板上的内部连线。

inputin1,in2,in3,clk,rst,output_enable;

outputout1,out2;

inoutbidir_signal;

 

//信号分为两类,线网型和寄存器型(相当于存储于锁存器或触发器中的信号)

//线网型信号可被寄存器组合赋值(类似与或非门)所驱动

//不可以直接连接一个模块中的两个寄存器

//未定义的信号默认为1bit的线网型信号

regout2;    //out2的类型?

wireout1;

 

assignout=in1&in2;    //强制赋值语句必须是连续的(组合的)逻辑语句

assignbidir_dignal=output_enable?out2:1'bz;    //条件赋值,1'bz表示三态z

 

always@(/*事件灵敏度列表*/posedgeclkorposedgerst)

//always程序块是按顺序执行的

//灵敏度表的出现源于Verilog语言仿真的需要

begin    //用来分离代码片段

if(rst)out2<=1'b0;

elseout2<=(in3&bidir_signal);

//<=和=的区别

end

endmodule

 

if-then语句将产生优先级编码式逻辑结构,case语句则会产生MUX逻辑结构

 

一些设计规范:

  1. 每个文件只包含一个模块,模块名称与文件名(*.v文件)相同
  2. Verilog对大小写敏感,对空格使用比较随意
  3. 要注意程序的可移植性(不可移植的语句包括结构化和编译器特定的指令)
  4. 用圆括号区分不同的优先级,以便读者能直接读出优先级
  5. 不要用复杂的结构,尽量用简单清晰的编码风格
  6. 高性能(系统可以高速运行)高效率(相同功能所需硬件资源最少)

 

在Verilog中,寄存器是一种存储设备,它可以被综合为一个触发器(数字构建)、一个锁存器(模拟构建)或一根导线,甚至可能在优化时被去掉。

 

Verilog的层次:一个高层模块和一个或多个低层模块。

高层模块可被仿真模块调用,将测试激励用于器件的引脚,通常包括与外界相连的端口列表低层模块之间的内部联结、控制双向IO引脚和三态引脚的多态逻辑

 

位置赋值?信号按原始模块端口列表中的顺序进行连接。

原始端口列表的要求是先列输出,再列输入。

命名赋值,端口列表中信号顺序是随机的,格式是:较低等级的信号名称(较高等级的信号名称)。

 

内建逻辑原语:

and与门

nand与非门

or或门

nor或非门

xor异或们

xnor同或门

not非门

buf缓冲门

bufif0低电平使能三态缓冲器

bufif1高电平使能三态缓冲器

NOTif0低电平使能三态非门

NOTif0高电平使能三态非门

 

对于使能逻辑门,规律如下(x表示不确定,z表示高阻态)

不使能时均输出z

除此外,输入端为x或z时均输出x

除此外,使能端为x或z时均输出z或使能时的输出(其中bufif0例外,输出x)

 

锁存器和触发器

触发器被定义为双稳态(0和1二进制)的多谐振荡器(具有两个或多个输出的模拟电路,且输出一次只能打开一路)。

现在已经逐步扩展为三态,加高阻态。

通常讨论的是D触发器。

 

边沿D触发器:触发器仅在时钟上升沿或下降沿到达时刻根据输入状态D进行翻转,其他时刻,触发器维持状态不变。时钟边沿时间极短,因此具有极强的抗干扰能力。

锁存:反馈信号使得触发器可以保持其状态。

 

如果你牢记一点,所有组成数字逻辑的底层电路都是模拟(线性)电路,那么你就有可能成为最优秀的数字电路设计者。

 

非阻塞性赋值<=与阻塞性赋值=

对于阻塞性赋值,变量在always语句外定义时,当前的赋值必须在上一条赋值完成之后才能进行。而硬件是通过对原数值的锁存来延迟赋值的。表示它是有顺序的。

对于非阻塞性,那么指令的顺序就不重要,所有的赋值语句的右侧都在同一边沿进行计算,赋值都在同一时间进行。赋值相当于无延时的导线

 

Verilog语法

 

 

 

———————————————————————————————————————

1、基于FPGA的数字系统设计

欧洲用Xilinx多,日本和亚太用Altera多,美国平分秋色

 

FPGA和ASIC对比

NRE:非经常性工程

注意:FPGA只适用于数字电路,如需模拟电路需要外加

FPGA学习笔记

 

FPGA的典型应用之一:

高速数字信号处理(DSP)——提供前所未有的计算能力

医疗——软件无线电,电疗,生命科学

 

———————————————————————————————————————

名词:RTL——寄存器传输级

在集成电路设计中,register-transferlevel(RTL)是用于描述同步数字电路操作的抽象级。

在RTL级,IC是由一组寄存器以及寄存器之间的逻辑操作构成。之所以如此,是因为绝大多数的电路可以被看成由寄存器来存储二进制数据、由寄存器之间的逻辑操作来完成数据的处理,数据处理的流程由时序状态机来控制,这些处理和控制可以用硬件描述语言来描述。

RTL级和门级简单的区别在于,RTL是用硬件描述语言(Verilog或VHDL)描述你想达到的功能,门级则是用具体的逻辑单元(依赖厂家的库)来实现你的功能,门级最终可以在半导体厂加工成实际的硬件,一句话,RTL和门级是设计实现上的不同阶段,RTL经过逻辑综合后,就得到门级

RTL描述是可以表示为一个有限状态机,或是一个可以在一个预定的时钟周期边界上进行寄存器传输的更一般的时序状态机,通常VHDL/verilog两种语言进行描述。

图中,上面是门级,下面是RTL级

FPGA学习笔记

———————————————————————————————————————

FPGA设计流程

设计和编程

功能仿真(ModelSim,QuartusII):验证逻辑模型和数据流,无时延

综合(Spectrum,Synplify,QuartusII):把RTL级描述转换为门级网表

布局&布线:把门级网表映射到目标器件

时序分析:验证是否满足性能要求,静态时序分析STA?

门级仿真:时序仿真,功能是否正确

板级测试:编程&测试板上器件,使用SignalTapII辅助调试?

 

数字电子器件包括:存储器、处理器、逻辑器件(特殊功能,通信等)

逻辑器件分两类:固定的ASIC,可编程的

 

CPLD:复杂可编程逻辑器件

FPGA:现场可编程门阵列

硬核:ARM、MIPS、POWERPC

软核:NIOSII

SOPC:可编程片上系统

IP核(IntellectualPropertycore):知识产权核,包括硬核和软核,还有固核(软核和硬核的折衷)

流片:所以为了测试集成电路设计是否成功,必须进行流片,即从一个电路图到一块芯片,检验每一个工艺步骤是否可行,检验电路是否具备我们所要的性能和功能。如果流片成功,就可以大规模地制造芯片;反之,我们就需要找出其中的原因,并进行相应的优化设计。

 

基于SRAM的FPGA:Altera和Xilinx

灵活;易受干扰,掉电丢失

基于反熔丝结构FPGA:Actel,Quicklogic

稳定;不灵活

基于Flash结构FPGA:Actel、Lattice

灵活、稳定;厂家影响力小

 

FPGA和CPLD都属于PLD,区别如下。

简单地说,FPGA就是将CPLD的电路规模,功能,性能等方面强化之后的产物。

FPGA学习笔记

 

 

FPGA学习笔记

 

 

 

 

———————————————————————————————————————

FPGA选型策略:

1、选型先看IO需求

2、再看逻辑门数要求

3、其他外围器件需求

4、最后看采购难易程度

5、技术成熟度:开发平台、大量应用、容易获取的资源

6、价格

 

1、获取芯片资料

http://www.altera.com.cn/

在ALTERA的网站,就会明确标明它的三大类的FPGA产品,高端的Stratix系列,中端的Arria系列和低成本的Cyclone系列。

对于每一个系列的产品,都会有综述类的文档介绍该系列产品,而这个综述类的文档是选型的最佳资料,里边一般会有该系列芯片整体的特性。

(1)在选择的时候,要根据实际的项目需求,来选择合适的系列。可以用低端的芯片完成的工作,就不要采用高端的芯片,目标是达到性能和成本的最佳平衡点

选择系列应该尽量选择成熟,容易获取技术资源的系列,这一点与下面不同。

(2)每一个系列的FPGA芯片,可能又分为好几代的产品,比如ALTERA的Cyclone系列,到现在已经发展了Cyclone,CycloneII,CycloneIII和CycloneIV四代产品。这种产品的升级换代很大程度上都是由于半导体工艺的升级换代引起的。随着半导体工艺的升级换代,FPGA芯片也在升级换代的过程中,提供了更强大的功能,更低的功耗和更好的性价比。那么在确定一个系列的FPGA后,选择哪一代的产品则又成为一个问题。我个人建议是在价格和供货都没有问题的情况下,选择越新的产品越好。一定不能选择厂家已经或者即将停产的芯片。任何产品都是有生命周期的,目标就是尽量保证在产品的生命周期里,所用到的芯片的生命周期还没有结束。在产品初期规划时做芯片选型,要尽可能选用厂家刚量产或者量产不久的产品,甚至在有确切的供货渠道的情况下,可以选择厂家即将量产的芯片。

 

另一种说法:

稳定性和可靠性是产品设计需要考虑的关键因素。

厂家最新推出的FPGA系列产品一般都没有经过大批量应用的验证。选择这样的芯片会增加设计的风险。

而且,最新推出的FPGA芯片因为产盘比较小,一般供货情况都不会很理想,价格也会偏高一些。

如果成熟的产品能满足设计指标要求,那么最好选这样的芯片来完成设计。

例如,要用FPGA设计一块数据采集卡。采用Altera公司的Cyclone,CyloneII和Cyclonelll

等3个系列的芯片都可以完成这个功能.考虑到Cyclone和Cylonell是成熟产品,同时Cylonell

又是Cyclone的升级产品,因此选择CyloneII是比较理想的方案。

 

(3)在CycloneIII这个系列的FPGA中,又分为两个不同的子系列,普通的CycloneIII和CycloneIIILS。在每个子系列里,根据片内资源的不同又分为更多的型号,比如普通的CycloneIII子系列,就包含了EP3C5,EP3C10,EP3C16,EP3C25,EP3C40,EP3C55,EP3C80和EP3C120等8种型号的芯片。每个型号的芯片又根据通用I/O口数量封装区分出不同的芯片。比如,EP3C5的芯片又有EP3C5E144,EP3C5M164,EP3C5F256和EP3C5U256这四种不同的芯片。而每一种芯片,又有不同的速度等级,比如说EP3C5E144就有C7,C8,I7和A7四个速度等级。

 

1、片上资源。要根据设计的大小选择合适的片上资源。这个是比较难确定的一个参数,自己做的设计到底有多大,需要多少片上资源,很难一下子确定下来。比较推荐的一个方式是先拿之前的设计去综合后映射到某一个芯片上,看看需要占用多少的片内资源,然后评估要做的新的设计跟之前的大小,做换算后得到需要片上资源的数量。另外的一种方式就是先完成新的设计,直接综合出来映射到不同型号的芯片上,然后评估哪一种芯片合适。还有一个需要注意的地方就是,不能选择片上资源刚刚够用的芯片,要留有一定的余量,以便于后期设计错误的修正和升级。

2、封装。选择封装,主要需要在两个方面考量,第一个就是可用的I/O口的数量。第二个就是封装的尺寸I/O数量是一个必要的条件,先要根据这个条件筛选出可以用的芯片。然后在筛选出来的芯片中,再根据封装类型尺寸pitch尺寸选择合适的芯片。在封装尺寸符合要求的情况下,尽量选择有利于PCB设计和生产的封装。比如如果有TQFP封装的芯片,尺寸又符合项目的需求,那么就不要选择BGA封装的。对于BGA封装的芯片,如果有pitch为1.0mm的可以满足要求,就不要选择pitch为0.5mm的。这直接影响到PCB设计难度,制造成本和良率。

3、速度等级。速度等级是一个相对比较独立的参数。要根据实际设计所能综合出来的最高运行频率和需求的运行频率做比较,尽量选用速度等级比较慢的芯片。当所有的速度等级都不能满足需要的时候,更多的要从优化设计的角度来提高设计本身所能达到的最高运行频率。

 

FPGA初学者的选择

对于一个FPGA的初学者,如何选择一个公司的某一个系列的产品作为学习的基础呢?这是一个问题,但并不是最重要的问题。

初学者在学习FPGA的时候,要解决的首要的问题就是对数字电路技术基础知识的掌握,然后就是对硬件描述语言的掌握(veirlog或者VHDL)。至于FPGA芯片本身,只是一个载体。当真正掌握了FPGA设计的本质后,需要使用某一个厂家的某一种FPGA的时候,只需要针对这个厂家的该型号的FPGA做一些了解就可以了,设计的基础还是一样的,以往积累的大部分经验都可以应用得上。

不过在选择的时候,还是要选择主流厂家的流行的型号,这样更容易获取学习资源。

 

 

尽量选择兼容性好的封装:

作为代码设计者,希望算法实现之后再选择FPGA的型号。

但是,现在的设计流程一般都是软件和硬件并行开始设计。

也就是说,在HDL代码设计之前,就开始硬件板卡的设计。

这就要求硬件板卡具备一定的兼容性,可以兼容不同规模的FPGA芯片。

 

幸运的是,FPGA芯片厂家考虑到了这一点。

目前,同系列的FPGA芯片一般可以做到相同物理封装兼容不同规模的器件。

例如,XILINX的spartan3系列FPGA,在BGA456封装下,可以选择3S200,2S400,3S1000,3S1500这4种型号的FPGA.

 

正是因为这一点,将来的产品就具备非常好的扩展性,可以不断地增加新的功能或者提高性能,而不需要修改电路板的设计文件。

 

尽量选择一个公司的产品

如果在整个电子系统中需要多个FPGA器件,那么尽量选择一个公司的产品。

这样的好处不仅可以降低采购成本,而且降低开发难度。

因为开发环境和工具是一致的,芯片接口电平和特性也一致,便于互联互通。

Xilinx公司和Altera公司的FPGA产品哪个好一些?

 

很多第一次接触FPGA的设计师在芯片选型的时候都有过这个疑问。

其实这两个最大的FPGA厂家位于关国的同一座城市,人员和技术交流都很频繁,因此产品各有的优势和特色,很难说清楚谁好谁坏。

 

在全球不同的地区,这两家公司的FPGA芯片产品的市场表现会有所差别。

在中国市场,两家公司可以说是平分秋色,在高校里面Altera的客户会略多一些。

针对特定的应用,两个厂家的产品目录里面都可以找到适合的系列或者型号。

 

比如,针对低成本应用,Altera公司的Cyclone系列和Xilinx公司的Spartan3系列是对应的。

针对高性能应用,Altera公司的Stratix系列和Xilinx公司的Virtex系列是对应的。

所以,最终选择那个公司的产品还是看开发者的使用习惯。

 

———————————————————————————————————————

器件的硬件资源

硬件资源是器件选型的重要标准。硬件资源包括逻辑资源、IO资源、布线资源、DSP资源、存储器资源、锁相环资源、串行收发器资源和硬核微处理器资源等。

逻辑资源和IO资源的需求是每位设计人员最关心的问题,一般都会考虑到,可是,过度消耗IO资源和布线资源可能产生的问题却很容易被忽视。主流FPGA器件中,逻辑资源都比较丰富,一般可以满足应用需求。可是,在比较复杂的数字系统中,过度IO资源的消耗可能会导致2个问题:FPGA负荷过重,器件发热严重,严重影响器件的速度性能、工作稳定性和寿命,设计中要考虑器件的散热问题;局部布线资源不足,电路的运行速度明显降低,有时甚至使设计不能适配器件,设计失败。根据本人的应用经验:

(1)在做复杂数字信号处理时,位数比较高的乘法器和除法器对全局布线资源的消耗量比较大

(2)在做逻辑设计时,双向IO口对局部布线资源的消耗量比较大

(3)在利用存储器资源设计滤波器的应用场合,局部布线资源的消耗量比较大;

(4)在电气接口标准比较多,而逻辑比较复杂的应用场合,局部布线资源的消耗量比较大。

据Altera公司推荐,设计中最好能预留30%以上的逻辑资源、20%以上的IO源和30%以上的布线资源。而且,从两家公司器件的结构看,Xllinx公司器件的可编程逻辑块相对于Al-tera公司要复杂一些,使用起来要灵活一些。在一些复杂的、控制信号比较多的设计中,适合选用Xllinx公司的产品。不过Xllinx公司器件布线资源是分段的,器件延时的可预测性要差一些。在这些应用场合,最好首先做设计仿真,对设计消耗的布线资源,尤其是很容易被忽视的局部布线资源,要有一个比较充分的了解,然后在考虑器件选型,是比较理想的。

在做乘法运算比较多而且对速度性能要求比较高的应用场合,最好能选用带DSP资源比较多的器件,例如,Altera公司的StatixⅡ和StatixⅢ系列,Xllinx公司的Virtex-4SX和Virtex-5SX系列等。

器件中的存储器资源主要有2种用途:作高性能滤波器;实现小容量高速数据缓存。这是一种比较宝贵的硬件资源,一般器件中的存储器资源都不太多,存储器资源较多的器件逻辑容量也非常大,用得也比较少,供货渠道也不多,器件价格也非常高。因此,在器件选型时,最好不要片面追求设计的集成度而选用这种器件,可以考虑选用低端器件+外扩存储器的设计方案

目前,主流FPGA中都集成了锁相环,利用锁相环对时钟进行相位锁定,可以使电路获得更稳定的性能。Xllinx公司提供的是数字锁相环,其优点是能获得更精确的相位控制,其缺点是下限工作频率较高,一般在24MHz以上;Altera公司提供的是模拟锁相环,其优点是下限工作频率较低,一般在16MHz以上,其主流器件StatixⅡ和StatixⅢ系列中的增强型锁相环工作频率只要求在4MHz以上,其缺点是对时钟相位的控制精度相对较差

在通讯领域里,用光纤传输高速数据是一个比较常用的解决方案。A1tera公司的StatixⅡGX和StatixⅢGX系列,Xllinx公司的Virtex-4FX和Virtex-5FX系列都集成了高速串行收发器,这种器件价格一般都比较高。目前,National和Maxim等公司提供的高性能专用串行收发芯片价格都不高,因此,如果只是进行光纤数据传输没计,大可不必选用这种器件;如果是光纤数据传输+逻辑或算法比较复杂的应用场合,最好是将两种方案进行比较,然后考虑是否选用该器件。

利用集成硬核微处理器的FPGA器件进行嵌入式开发,代表嵌入式应用的一个方向。Altera公司提供集成ARM的APEX系列器件,Xllinx公司提供集成Power-Pc的Virtex-4FX和virtex-5FX系列器件。随着器件价格不断下降,在很多应用场合,在不增加成本的情况下,选用该器件和传统FPGA+MCU的应用方案相比,能大幅度提高系统性能和降低硬件设计复杂程度。此时,选用该器件是比较理想的。

 

 

关于器件速度等级的选型,一个基本的原则是:在满足应用需求的情况下,尽量选用速度等级低的器件。该选型原则有如下好处:
(1)由于传输线效应,速度等级高的器件更容易产生信号反射,设计要在信号的完整性上花更多的精力

(2)速度等级高的器件一般用得比较少,价格经常是成倍增加,而且高速器件的供货渠道一般比较少,器件的订货周期一般都比较长,经常会延误产品的研发周期,降低产品的上市率。

 

器件的温度等级

某些应用场合,对器件的环境温度适应能力提出了很高的要求,此时,就应该在有工业级甚至是军品级或宇航级的器件中进行选型。据调研,Altera公司每种型号的FPGA都有工业级产品;Xllinx公司每种型号的FPGA都有工业级产品,部分型号的FPGA提供军品级和宇航级产品。如果设计主要面向军用或航天应用,最好选用Actel公司的器件,该公司的器件主要面向这些用户。

 

器件的封装

目前,主流器件的封装形式有:QFP,BGA和FBGA,BGA和FBGA封装器件的管脚密度非常高,设计中必须使用多层板,PCB布线相当复杂,设计成本比较高,器件焊接成本比较高,因此,设计中能不用尽量不用(也是初期研发不自己做FPGA核心电路的原因)。不过,在密度非常高,集成度非常高和对PCB板体积要求比较高的应用场合,尽量选用BGA和FBGA封装器件。还有一种情况,在电路速度非常高的应用场合,最好选用BGA和FBGA封装器件,这2种封装器件由于器件管脚引线电感和分布电容比较小,有利于高速电路的设计

 

器件集成度不断提高,性能不断上升,而价位不断下降是FPGA器件发展的普遍趋势,因此,在不断推出的新一代器件中选型是一个基本规律。以Xllinx公司刚推出的Virtex-5为例,性能比Virtex-4提高30%,而相对价位却降低35%。

———————————————————————————————————————

FPGA开发板选型方法

1、初学者自己购买FPGA开发板学习:因为是自己用,而且一般对价格有一定的接受限度。此类用户不建议购买原厂及国外厂家的开发板,因为价格相对昂贵,最便宜的也要1500往上,但也不可盲目的购买国内的非常便宜的开发板,原因很简单便宜没好货,为了降低正本,质量不一定有保证,跟不可能有技术支持和学习指导。一般自己用都买一块,且主要是为了学习,所以选择国内的相对有实力的公司会好一些。这些公司的产品有保障,而且也不贵。而且自有一定的技术实力,尽量选择可以提供学习资料和技术支持的公司。这样你购买的就不单是一个板子,会加速自己的学习。

2、研究所做项目:一般是为了缩短项目周期,而且项目用到的板子一般比较复杂,此时原厂和国外的开发板当首先考虑。因为国内的公司一般不倾向于作特别高端的板子,即使有也可能价格昂贵,国外的在高端的价格比较适中

3、学校建实验室:实验室如果是给本科平时的教学用:那么可能需要的数量比较大,而且要和教学相结合,此时往往需要板子的接口比较多,但是主芯片也不能太高端,国外的板子一般接口多的主芯片势必很大,价格很昂贵,而且板子作的很复杂并不一定适合初学者。此时国内一些公司做的比较好,他们一是丰富板子的接口以适应国内的教学计划,而且在主芯片选择上,选择那种适合初学者的芯片,在成本上也比较理想,而且此类公司一般都负责软件的升级还提供很多的参考实验以方便学生的学习,所以这些板子很适合教学。

 

200到300的可以去看一下周立功的EASYFPGA

500-600的可以去考虑一下黑金开发板

之所以推荐上面2个是因为其资料非常全面

 

———————————————————————————————————————

QuartusII使用方法:

The Quartus II Settings File (.qsf) and Quartus II Project File (.qpf) files are the primary files in a Quartus II project.

 

File names, project names, and directories in the Quartus II software cannot contain spaces.

 

the name of the top-level design entity is case sensitive(大小写敏感)

你可能感兴趣的:(学习笔记)