热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

建议收藏:不能不刷的100道数字IC笔/面试题!

一、IC设计流程及相应EDA开发工具前端设计(逻辑设计)1、规格制定根据客户需求(具体的功能和性能要求)制定芯片规格Spec

一、IC设计流程及相应EDA开发工具


  • 前端设计(逻辑设计)

    • 1、规格制定

      • 根据客户需求(具体的功能和性能要求)制定芯片规格Spec
    • 2、详细设计

      • 设计方案,具体实现架构,模块划分
    • 3、HDL编码

      • 将实际的硬件电路功能通过HDL语言描述出来,形成RTL(寄存器传输级)代码;工具:SUMMIT 公司的VISUALHDL、Altera的Quartus
    • 4、仿真验证——前仿真

      • 检验编码设计的正确性,检验的标准就是第一步制定的规格,看设计是否满足了规格中的所有要求。
      • 仿真验证工具:Mentor公司的ModelsimSynopsys的VCS,还有Cadence的NC-verilog均可以对RTL级的代码进行设计验证。
      • 该部分称为前仿真,接下来逻辑部分综合之后再一次进行的仿真可以称为后仿真。
    • 5、逻辑综合Design Compiler

      • 将HDL代码翻译成门级网表Netlist。综合需要设定约束条件,就是你希望综合出来的电路在面积、时序等目标参数上达到的标准。逻辑总和需要基于特定的综合库,不同的库中,门电路基本标准单元(standard cell)的面积,时序参数是不一样的。所以,选用的综合库不一样,综合出来的电路在时序,面积上是有差异的。
      • 逻辑综合工具Synopsys的Design Compiler、Synplify 公司的 Synplicity 
      • 一般来说,综合完成后需要再次做仿真验证(这个也称为后仿真,之前的称为前仿真),仿真工具选择上面的三种仿真工具均可
    • 6、Static Timing Analysis,静态时序分析

      • 属于验证范畴,主要在时序上对电路进行验证:检查电路是否存在建立时间(setup time)和保持时间(hold time)的违例(violation)。
      • 工具:Synopsys的Prime Time
    • 7、形式验证

      • 也是验证范畴,从功能上(STA是时序上)对综合后的网表进行验证。常用的就是等价性检查方法,以功能验证后的HDL设计为参考,对比综合后的网表功能,是否在功能上存在等价性——为了确保逻辑综合过程中没有改变原先HDL描述的电路功能。
      • 工具:Synopsys的Formality
      • 前端的终点就是门级网表文件
  • 后端设计(物理设计)

    • 1、DFT(Design For Test)可测性设计

      • 芯片每步往往都自带测试电路,DFT的目的就是在设计时就考虑将来的测试。
      • DFT的常见方法是,在设计中插入扫描链,将非扫描单元(如寄存器)变为扫描单元。
      • 工具:Synopsys的DFT Compiler
    • 2、布局规划(Floor Plan)

      • 布局规划就是放置芯片的宏单元模块,在总体上确定各种功能电路的摆放位置,如IP模块,RAM,I/O引脚邓邓。布局规划能直接影响芯片最终的面积。
      • 工具为Synopsys的Astro
    • 3、CTS

      • Clock Tree Synthesis,时钟树综合,简单点说就是时钟的不限。由于时钟信号在数字芯片的全局指挥作用,它的分布应该是对称式的连接到各个寄存器单元,从而使时钟从同一个时钟源到达各个寄存器时,时钟延迟差异最小。这也是为什么时钟信号需要单独布线的原因。
      • CTS工具:Synopsys的Physical Compiler.
    • 4、布线(Place & Route)

      • 这里的布线就是普通信号布线了,包括各种标准单元(基本逻辑门电路)之间的走线。
      •  Xilinx 有 Foundation Series 和 Alliance Series 两个系列。 Altera 的两个系列是 MaxPlusII 和 Quartus 。



二、静态时序分析和动态时序分析的比较


1、静态时序分析

静态时序分析(static timing analysis,STA)遍历电路存在的所有时序路径,根据给定工作条件(PVT)下的时序库.lib文件计算信号在这些路径上的传播延时检查信号的建立和保持时间是否满足约束要求,根据最大路径延时和最小路径延时找出违背时序约束的错误


 静态时序分析的优点:


  • 不需要给输入激励;
  • 几乎能找到所有的关键路径(critical path);
  • 运行速度快,占用内存较少,不仅可以对芯片设计进行全面的时序功能检查,而且还可利用时序分析的结果来优化设计。因此静态时序分析已经越来越多地被用到数字集成电路设计的验证中

静态时序分析的缺点: 


  • 只适用同步电路
  • 无法验证电路的功能
  • 需要比较贵的工具支持
  • 对于新工艺可能还需要建立一套特征库,建库的代价可能要几百万。

静态时序分析的工具:


  • Synopsys的prime time,
  • Cadence的Encounter Timing System等

2、动态时序分析

动态时序分析(dynamic timing analysis,DTA)通常是所有的输入信号都会给一个不同时刻的激励在testbench(.sp或者.v)中设置一段仿真时间,最后对仿真结果进行时序和功能分析。 这里的仿真可以是门级或者晶体管级,包括spice格式和RTL格式的网表。(可以理解为仿真

如下图所示的spice中给激励的语句和波形:


动态时序分析的优点


  • 晶体管级的仿真比较精确,直接基于工厂提供的spice 工艺库计算得到;
  • 适用于任何电路,包括同步、异步、latch等等
  • 不需要额外搞一套特征库
  • 不需要很贵的时序分析工具。

动态时序分析的缺点:


  • 需要给不同的测试激励,这使得在分析的过程中关键路径无法检查全 (致命性的);随着规模增大,所需要的向量数量以指数增长,且这种方法难以保证足够的覆盖率。
  • 规模大的电路spice仿真特别慢 (致命性的)

动态时序的工具 :


  • spice仿真器: hspice, finesim, hsim, spectre等;
  • verilog仿真器: ModelSim,VCS,NC-Verilog,Verilog-XL等。

从上面的分析可以看出,静态时序的主要缺点是烧钱,需要很贵的工具。这一点国内的公司也容易解决,要么融资很多不差钱,要么用盗版。

动态时序分析2个致命性的缺点关键路径无法检查全意味着里面可能有fail的path,芯片流片出来无法工作;仿真特别慢意味着你的schedule可能受到影响,无法按时交货。所以动态时序分析只适用于小规模的电路,通过给激励就能完成时序的检查,同时仿真的时间还能接受。
作者:IC君
链接:https://www.jianshu.com/p/c97a2dae9d97
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。




三、ASIC和FPGA的区别是什么?具体说说FPGA的组成及开发流程?


(一)ASIC和FPGA的区别区别


1、概念区别

ASIC(Application Specific Integrated Circuit, 专用集成电路)是一种在设计时就考虑了设计用途的IC。

FPGA(Field Programmable Gate Array, 现场可编程门阵列)也是一种IC。顾名思义,只要有合适的工具和适当的专业基础,工程师就可以对FPGA进行重新编程


2、开发流程区别

FPGA开发是利用HDLquartus、vivado等EDA工具,重新配置(configure)芯片的功能,而ASIC通常都具有较少的可重配置能力。

ASIC基本都是基于标准单元开始设计的,还需要进行Place&Route(布局&布线)。当芯片存在任何问题时,必须再次重新投片,直到达到你想要的功能和性能。ASIC设计流程非常昂贵,至少需要几个月的时间才能完成

ASIC在离开生产线后再也无法改变。这就是为什么设计师在大规模量产之前需要完全确保设计正确无误。工程师可以利用FPGA的可重配置这一优势,进行ASIC的原型验证,以便在将设计发送到代工厂之前,可以在实际世界中对其进行全面的测试。

FPGA是一大堆预制的门和触发器,具有可编程互连的特性。可以使用这些基本模块配置成你想要的任何逻辑功能。如果有错误,可以在几秒钟内重新编程,而不需要数月才能知道结果。然而,在FPGA中,有时候需要额外的硬件开销来进行正确的连接


3、成本区别

ASIC在重复成本方面具有很大的优势,因为在设计中浪费的材料非常少。对于FPGA,总是有很多的硬件资源被浪费。这意味着FPGA的重复成本通常高于同类ASIC的重复成本

尽管ASIC的重复成本非常低,但其非重复成本相对较高且通常达到数百万。由于它是非重复性的,因此每个IC的成本随着量的增加而减少。

所以,在ASIC量产到一定量之后,使用ASIC可以比使用FPGA更便宜。与FPGA相比,ASIC在功耗,性能,尺寸和成本方面具有很大优势。




(二)FPGA组成结构及功能


1、FPGA的基本结构组成

目前主流的FPGA芯片仍是基于查找表(LUT)。FPGA芯片主要由以下6部分组成:


  1. 可编程输入/输出单元(IOB):支持多种电平标准、LVDS、DDR2/3
  2. 基本可编程逻辑单元(CLB = LUT + Register):LUT、DFF、MUX​​​​​​​​​​​
  3. 完整的时钟管理模块:GC、DCM、PLL、MMCM等
  4. 丰富的布线资源
  5. 嵌入式块RAM:FIFO、ECC
  6. 底层嵌入功能单元和内嵌专用硬核(IP:DSP、PCIe、Serdes、ARM、PC)

对于一款芯片,我们肉眼看到的如图所示,看不出它有任何特点。


当我们对其内部放大时,看到如图所示结构,密密麻麻小方格,仍然完全看不出有什么特点:

 

当我们再对其内部进行放大时,看到如图所示结构,这时可以看到芯片内部的最基本组成单元:可编程逻辑单元、布线资源、可编程IO


2、FPGA各个基本结构的功能

1.可编程输入/输出单元(IOB)

目前大多数FPGA的I/O单元被设计为可编程模式,即通过软件的灵活配置,可适应不同的电器标准与I/O物理特性;可以调整匹配阻抗特性,上下拉电阻;可以调整输出驱动电流的大小等。


ILOGIC/LOGIC资源可支持以下操作(这些资源之间的所有连接均由所编写代码控制):

  1. 边沿触发D型触发器
  2. 电平敏感性锁存器
  3. 异步/组合
  4. IDDR/ODDR模式

2.基本可编程逻辑单元(CLB)

FPGA的基本可编程逻辑单元是由查找表(LUT)和寄存器(Register)组成的,是实现时序电路和组合电路的主要逻辑资源


  • 查找表完成纯组合逻辑功能。
  • FPGA内部寄存器可配置为带同步/异步复位和置位时钟使能的触发器,也可以配置成为锁存器

FPGA一般依赖寄存器完成同步时序逻辑设计。一般来说,比较经典的基本可编程单元的配置是一个寄存器加一个查找表,但不同厂商的寄存器和查找表的内部结构有一定的差异,而且寄存器和查找表的组合模式也不同。

学习底层配置单元的LUT和Register比率的一个重要意义在于器件选型和规模估算。由于FPGA内部除了基本可编程逻辑单元外,还有嵌入式的RAM、PLL或者是DLL,专用的Hard IP Core等,这些模块也能等效出一定规模的系统门,所以简单科学的方法是用器件的Register或LUT的数量衡量。

3.时钟资源

全局时钟是一种专用互联网络,是专为覆盖对FPGA中各种资源的所有时钟输入设计的。这些时钟网络的设计旨在降低歪斜、占空比失真和功耗。其设计的目的还在于支持甚高频信号。

全局时钟控制资源和网络通常由以下通路和组件构成:


  1. 全局时钟输入
  2. 全局时钟缓冲器
  3. 时钟树和时钟网络-GCLK
  4. 时钟区域

区域时钟每区域有2个区域时钟缓冲器BUFR和4个区域时钟树。区域时钟网络是一组独立于全局时钟网络的时钟网络。与全局时钟不同,区域时钟信号(BUFR)的跨度限于三个时钟区域,而IO时钟信号只驱动一个区域。

第三种时钟资源是IO时钟,可以达到非常高的速度,可用于局部的IO串行器/解串器。

4.丰富的布线资源

布线资源连通FPGA内部所有单元,连线的长度和工艺决定着信号在连线上的驱动能力和传输速度。布线资源的划分:

1)全局性的专用布线资源:以完成器件内部的全局时钟和全局复位/置位的布线

2)长线资源:用以完成器件Bank间的一些高速信号和一些第二全局时钟信号的布线(这里不懂什么是“第二全局时钟信号”);

3)短线资源:用来完成基本逻辑单元间的逻辑互连与布线

4)其他:在逻辑单元内部还有着各种布线资源和专用时钟、复位等控制信号线

由于在设计过程中,往往由布局布线器自动根据输入的逻辑网表的拓扑结构和约束条件选择可用的布线资源连通所用的底层单元模块,所以常常忽略布线资源。其实布线资源的优化与使用和实现结果有直接关系。

5.嵌入式块RAM

目前大多数FPGA都有内嵌的块RAM。嵌入式块RAM可以配置为单端口RAM、双端口RAM、伪双端口RAM、CAM、FIFO等存储结构。

CAM,即为内容地址存储器。写入CAM的数据会和其内部存储的每一个数据进行比较,并返回与端口数据相同的所有内部数据的地址。简单的说,RAM是一种写地址,读数据的存储单元;CAM与RAM恰恰相反。

除了块RAM,Xilinx和Lattice的FPGA还可以灵活地将LUT配置成RAM、ROM、FIFO等存储结构。

6.底层嵌入功能单元和内嵌专用硬核

底层嵌入功能单元是指通用程度较高的嵌入式功能模块(软核)。如锁相环(Phase Locked Loop,PLL)DLL(Delay Locked Loop)DSP(Digital Signal Processing)和CPU等。

与“底层嵌入单元”是有区别的,这里指的硬核主要是那些通用性相对较弱,不是所有FPGA器件都包含硬核。




(三)以CycloneⅡ为例介绍FPGA器件

CYCLONEⅡ系列FPGA器件由美国Altera公司出品,属于中端产品。采用了90nm的工艺,增加了片内逻辑单元数。为了方便说明,在此仅选用EP2C5进行分析讲解。


1、FPGA的命名规则

先了解一下FPGA的命名规则,这样就可以从芯片名字的角度来看这是怎么样性能的一款芯片了。

例如EP2C20F484C6,含义:

EP——工艺,

2C——cyclone2,

20——LE数量约为20K,

F——封装形式,

484——管脚数,

C——温度范围(确定其是工业级,军品级,还是商业级),

6——速度(数字越小速度越快)。


2、内部结构及组成

1.逻辑单元与逻辑阵列

        逻辑单元(Logic Element,LE)在FPGA器件内部,用于完成用户逻辑的最小单元。一个逻辑阵列包含16个逻辑单元以及一些其他资源, 在一个逻辑阵列内部的16个逻辑单元有更为紧密的联系,可以实现特有的功能。

        一个逻辑单元主要由以下部件组成:


  • 一个四输入的查询表(LookUp Table,LUT)
  • 一个可编程的寄存器
  • 一条进位链
  • 一条寄存器级连链。

        查询表: 用于完成用户需要的逻辑功能,CYCLONEⅡ系列的查询表是4输入1输出的,可以完成任意4输入1输出的组合逻辑。

        可编程寄存器:可以配置成D触发器,T触发器,JK触发器,SR触发器。每个寄存器包含4个输入信号,数据输入、时钟输入、时钟使能、复位输入。

        一个逻辑单元包含3个输出,两个用于驱动行连接、列连接、直接连接,另外一个用于驱动本地互联。 这三个输出是相互独立的。输出信号可以来自于查询表也可以来自于寄存器。

        本地互连通路是逻辑阵列的重要组成部分,芯片级设计思路上的考虑与节省我们就不讨论,从实际运用出发,直接看看这个互连通路是干什么用的。本地互连通路提供了一种逻辑阵列内部的连接方式, 逻辑阵列内部还包含一种对外的高速连接通路,称之为直接连接通路。

        直接连接通路连接的是相邻的逻辑阵列,或者与逻辑阵列相邻的M4K存储器块、乘法器、锁相环等。

CYCLONEⅡ系列FPGA的逻辑单元有两种工作模式:普通模式和算数模式。


  • 普通模式适合于一般的逻辑运算。算数模式适用于实现加法器、计数器、累加器、比较器等。
  • 逻辑阵列的主体是16个逻辑单元,另外还有一些逻辑阵列内部的控制信号以及互连通路。前面所讲的互联通路和直接连接通路就是逻辑阵列中的部分。
  • 逻辑阵列还包括一些控制信号:两个时钟信号,两个时钟使能信号,两个异步复位信号,一个同步复位信号,一个同步加载信号。

2.内部连接通路

        在FPGA内部存在各种连接通路,连接不同的模块,比如逻辑单元之间、逻辑单元与存储器之间。FPGA内部资源是按照行列的形式排列的,所以连接通路也分为行列的。


  • 行连接又分为R4连接、R24连接和直接连接
    • R4连接就是连接4个逻辑阵列,或者3个逻辑阵列和1个存储块, 或者3个逻辑阵列和1个乘法器。简单地说就是连接4个模块吧。R24就是24个模块。
  • 列连接是C4,C16,含义不用说了吧,是连接4个模块和16个模块。

3.时钟资源

CYCLONEⅡ系列FPGA有关时钟资源部分主要包括全局时钟树和锁相环两部分。


  • 全局时钟树又称全局时钟网络,负责把时钟分配到器件内部的各个单元,控制器件内部所有资源
  • 锁相环则可以完成分频、倍频、移项等相关时钟的基本操作
  • 全局时钟树是一种时钟网络结构,可以为FPGA内部的所有资源提供时钟信号,这些资源包括内部的寄存器、内部的存储器、输入输出管脚寄存器等。
  • CYCLONEⅡ系列FPGA中每条全局时钟树都对应一个时钟控制模块,时钟控制模块的作用是从多个时钟源种选择一个连接到全局时钟树,进而提供给片内的各种资源。这些时钟源包括锁相环的输出,专用时钟引脚的输入,两用时钟引脚的输入或者内部逻辑。
  • 专用时钟引脚是为时钟输入专门设计的引脚,在有可能的情况下应该尽量将时钟信号连接到专用管脚上。
    • EP2C5有8个专用时钟引脚(CLK),4个位于芯片左侧,4个位于芯片右侧。
    • 两用时钟引脚(DPCLK)通常用于介入时钟或者异步控制信号,EP2C5有8个两用时钟引脚,芯片每一侧两个。CYCLONEⅡ系列FPGA允许对两用时钟引脚的输入延时进行设置,是我们更好地控制时序。

4.内部存储器

CYCLONEⅡ系列FPGA的内部存储器是以M4K存储器块的形式存在的,每一个存储器块的大小为4608bitM4K块包括输入/输出寄存器,作用相信大家都知道。还拥有本地互联通路,作用前面讲过了哦。

好的。直接来看端口吧,从端口看作用,了解怎样去控制。

clock——输入——时钟信号

clock_en——输入——时钟使能信号

aclr——输入——异步复位信号

renwe——输入——读写使能信号

byteena——输入——字节使能信号

addressstall——输入——地址锁存信号

address——输入——地址

datain——输入——数据输入

dataout——输出——数据输出

看了这些端口以及端口说明,相信作用就不言而喻了吧,换言之,当我们想使用内部存储模块的时候,控制好这些端口的数据流就能够使用好这部分的资源了,当然存储器的使用离不开时序的控制,如果没有得到自己想要的结果,极有可能是时序控制部分出了问题。


CYCLONEⅡ系列FPGA中的M4K存储器可以被配置成以下模式:

单口模式:存储器不能同时进行读写操作。

简单双口模式:支持同时对存储器进行读写操作,读端口和写端口可以位宽不同,如果对同一地址进行读写,则输出端数据为改地址更新前的数据。

完全双口模式:两个端口可以任意组合,同时为写端口,同时为读端口,或者一个为写端口一个为读端口。存储器位宽不能为32或36。潜在威胁,如果两端口同时向一个地址写入数据的时候,会导致该地址中的数据出现不可预知的状况。

移位寄存器模式:节约用逻辑单元中构建寄存器而消耗。利用时钟下降沿写入数据,时钟上升沿读出数据,配置好该模式后是自动完成的哦。

只读存储器模式:存储器的内容通过存储器初始化文件(.mif)指定。

FIFO模式:用于数据的缓冲、多路数据的对齐、变换时钟域等。


5.乘法器

在数字信号处理运算中,主要包括滤波、快速傅里叶变换、离散余弦变换等。在写运算常常会涉及到大量的乘法运算,所以在FPGA中设计了嵌入的乘法器,专门用在这方面的信号处理。如果使用逻辑单元来搭建乘法器,会消耗不少逻辑单元并且会抑制运算速度的提高。

嵌入的乘法器包含有可选的输入/输出寄存器。寄存器的使用会提高电路性能但是会产生延时。乘法模块还包括两个控制信号,signa和signb来控制乘数A和乘数B是否有符号。另外一个乘法器还可以拆开成两个并行的乘法器,例如EP2C5有1个18bit*18bit的乘法器,可以作为两个9bit*9bit的乘法器使用,但是需要注意的是,符号控制信号就一对,所以要求两个乘法器在相同位置的数据输入必须同时为符号数或者无符号数。

6.输入/输出引脚

在输入/输出引脚和FPGA内部逻辑单元之间存在输入/输出单元(IOE),每个输入输出单元包含1个输出缓冲和3个寄存器。3个寄存器分别用于锁存输入数据、输出数据、和输出数据使能信号。




(四)FPGA开发流程


1、设计输入

设计输入方式:IP核、原理图、HDL

原理图输入:用基本逻辑门电路或晶体管搭建电路;

HDL输入:采用硬件描述语言描述电路;


  • HDL语言具有不同层次上的抽象,这些抽象层有开关级、逻辑门级、RTL级、行为级和系统级,如图3。其中开关级、逻辑门级又叫结构级,直接反映的是结构上的特性,大量的使用原语调用,很类似最开始原理图转成门级网表。RTL级又可称为功能级。

IP核:什么是IP核?任何实现一定功能的模块叫做IP(Intellectual Property)。


  • IP按照来源的不同可以分为三类,第一种是来自前一个设计的内部创建模块,第二种是FPGA厂家,第三种就是来自IP厂商;

这里集中探讨原理图和HDL的优缺点。


  • 原理图的优点就是结构直观性,HDL的优点是严密性、支持甚宽的抽象描述层次、易于移植、方便仿真调试等等,缺点就是不具备对方的优点。当时出现HDL的时候,人们确实是想着原理图该退出历史舞台了,但是到现在它还依然存在着。存在即是有道理的,存在就得用它,但是又得使用HDL,于是存在一种混合编程的形式。
  • 除了顶层模块用原理图之外,其他的内部子模块全部使用HDL来描述HDL描述的模块可以通过工具转换成符号,然后在顶层模块中引用这些符号,这就完成混合编程。


2、编译

原理图、HDL、IP核这些都将通过编译后生成门级的网表


3、映射

我们通过编译得到一张门级网表之后,接下来就得考虑如何与我们选择的硬件平台结合起来,毕竟我们使用的硬件平台是由一个一个的LUT(假设这类FPGA)组成的。那么这个结合的过程就是映射过程


  • 我们把讲基于SRAM技术的FPGA的二选一多路器拿出来举个例子,如图6,可以按照红色线将二选一多路器完全劈成两边,原来的一个表就可以规划到其他两个表或表内容中,因为被劈成的两部分可单独成表也可以被规划到其他电路形成的表里

再强调的是,映射是和器件有关的,即使是同一个系列,不同型号的FPGA内部就够也是有区别的,好比从外观看都是一个单元楼内的单元房,但是每个单元房内装修、家具摆设等都是不一样的。


4.1、布局

        讲到这一块,正好有这么一个例子来讲解这个概念。近来报道朝鲜希望在俄罗斯远东地区租用数十万公顷的土地用来培育农产品。咱先撇开今后的购买的成功与否,假设成功了,并且有了这个详细的希望培育的农作物的品种及数量,有各式各样的蔬菜、主粮、禽类畜养场、果树等等。我们前面做的那些流程得到的LUT门级网表就好比这样的清单。

        得到这样的清单之后,我们再假设在这十万公顷的土地上,阳光、水资源、温差都有一定的分布。大家知道农作物的的成长和高量产或者与阳关有关,或者与水资源有关,或者与温差有关,并且禽类的畜养材料与农作物的副产有关。所以接下来要做的事情就是根据现有的自然条件和农产品的所需环境特点合理布局,哪些地适合做什么。

        紧接着我们回到FPGA开发中来,我们通过前面的步骤得到的清单就是LUT门级网表。网表里提供的仅仅是从逻辑关系上一些LUT结构的连接。我们需要将这些LUT结构配置到FPGA具体的哪个位置。需要说明的是,FPGA里任何硬件结构都是按照横纵坐标进行标定的,图中选中的是一个SLICE,SLICE里面存放着表和其他结构,它的位置在X50Y112上。不同的资源的坐标不一样,但是坐标的零点是公用的。

    在FPGA里布局需要考虑的问题是,如何将这些已有的逻辑上连接的LUT及其它元素合理的放到现有的FPGA里,达到功能要求的时候保证质量。具体点就比如,乘法器这样的电路适合放在RAM附近,当然,硬件乘法器的硬件布局一般也是在存储器附近,有利于缩短乘法的延时时间,什么样的电路需要配置高速等等。

        十万公顷的地布局规划好了,农产品就会有很好的丰收,同样FPGA开发布局布好了,由FPGA搭建起来的电路就会更加稳定和扩展性。


4.2、布线

        上小节中,我们把十万公顷的地给安排好了,哪些地该种什么。具体实施之前还有一些是必须做的,比如农作物的浇灌,没有一个很好的灌溉系统是一个问题;再比如丰收了得采摘吧,这个时候,能够让大卡车到达每一块农地的公路枢纽也是需要解决的问题。将每一块或者相关的田地连接的灌水系统和公路的建设,就好比我们这个布线的过程。

        我们在FPGA内通过布局,知道那些LUT具体分布到哪个SLICE,但是一方面如何让这些SLICE连接起来,二方面如何让输入的信号到达相应的开始处理点和如何让输出到达输出IO上,并且连接的电路整体性能好,这就是布线这个环节需要完成的内容。要达到布线最优话,当然这里面设计到布线算法和很多细节问题,比如涉及到布线资源、PLL资源分布。但是这些对我们理解布线这个概念没有很多益处,暂且不深入,本质上就是一个线路求最优的问题


5、约束

        约束,在图1上看到,在综合和布局布线这两个流程环节里都出现了,我们暂且规定其为约束一和约束二,或者说综合约束和布局布线约束布局布线约束又可以分为位置约束、时序约束

        约束,就是对这些环节操作定制规则。一般开发环境会对这些约束有个默认,这些默认的设置对大部分情况下还是适用的,但是通常布局布线约束中的I/O约束是我们每一个工程都必须给定的。同时开发工具开放其他约束接口,允许我们设置这些规则,具体的有哪些约束怎么去做在后面介绍工具使用的时候进行讨论,这里先明白这些约束的基本概念。

综合约束

    相信大家已经下意识的将综合约束和综合过程挂在一起了,没错,综合约束确实是在综合过程中做的,用来指导综合过程,包括编译和映射。我们已经知道综合过程是将RTL级电路描述转换到FPGA上的硬件单元(LUT)中,形成以FPGA存在的硬件单元构成的电路。

        我们还是拿前面有过的例子来说明,不同的约束将导致生成性能不同的电路。综合这么一个完成式Y=A1*A2+A3*A4的电路,没有加资源共享得到的电路如图8左边所示的电路,而加了资源共享的约束后,得到的电路结构如图8右边的电路。

        通过之前的分析,得到左边的电路结构资源消耗多但是速度快,而右边的结构消耗资源少,但是速度慢,乘法器需要分时复用

        当然这只是一个例子,但是足以说明,不同的综合指导原则也就是综合约束,将会产生不同的电路当得到的电路性能不能满足需求的时候,适当考虑综合约束,来达到一个速度和面积的转换的效果,实现性能的提升

        电路实现的速度和消耗的面积是贯穿在FPGA开发过程中两个 矛盾的问题,综合约束是其中一种小范围内实现速度和面见平衡点移动的方式。

位置约束

    没错,你又想对了,位置约束和我们布局有关系,它就是指布局的策略。根据所选择的FPGA平台现有硬件资源分布来决定我们布局。

    其中最典型的位置约束就是I/O约束。一个典型的系统是既有输入也有输出的,而不管是输入还是输出,都是从I/O上为端点的。输入从哪个端点进来,输出从哪个端点出去,输入是需要支持什么样的电气特性的端点,输出又是需要支持什么样的电气特定的端点。这些都是I/O约束做的事情。任何一个工程,都必须有这么一个约束。

        还有一种典型的位置约束是在增量编译里涉及的物理界定。增量编译的出现就是因为在FPGA开发过程中综合和布局布线的长耗时性而提出的。思想就是把FPGA切成很多个小块的FPGA,然后约定具体哪块小FPGA放置什么模块,实现什么样的功能,从物理上进行界定。当修改工程后,开发平台就会检测哪些小FPGA内没有进行修改,哪些进行了修改,然后将修改过的部分重新进行综合布局布线步骤。这样一来,相比原来修改一点,全工程重新经过那些过程来讲,时间节省下来了。

时序约束

        估计没有多少悬念了,时序约束很大程度上和布线有关。为什么要做这个约束?

        由于一方面信号在芯片内传递是需要消耗时间的,另一方面大量存在的寄存器有反应时间,而我们开发的最开始的时候这些时间都是理想化的。但是考虑到真实情况下,如果跑的速度比较高,达到了200M这么个速度,当然这个高速和具体的芯片有关,高性能的芯片本身跑的速度可以达到很高,200M相对来说就不是高速,对一些低性能芯片还可能达不到200M。这个时候,这些时间达到了同样一个系统时间数量级的时候,很可能影响电路的性能了。某一刻,该来的信号没有来,默认的话就会采集错误信号了。

        为了让这些硬件本身带来的延时时间更理想化,我们就要对这些决定时间延时的因素优化来减少时间延时。对于寄存器本身的反应时间这个因素我们开发者是无能为力的,我们要做的优化就是布线了。是走直线还是走其他,不仅仅决定于自身这条路径,还和整个系统布线有关,好比水桶原理,系统性能决定于最差路径延时

        时序约束做的就是这些事情,但是时序约束并不是指具体去连接每一条线,这个工作就像前面那些流程一样都是由软件去实现的,先用软件自己默认原则布线,然后对其结果分析不满足时序要求的,我们再对具体的问题路径做一些指导约束。时序约束的添加,主要包括周期约束、输入偏移约束和输出偏移约束


6、仿真

        如果我们把FPGA开发形成电路当作一个产品的生产过程,那么在FPGA开发流程中含有的三种仿真(RTL级仿真、静态仿真和时序仿真)就好比产品线中的三道检测站。如图9,这三道工序任何一道出了问题,修改设计后都得重新走这三道卡,所以尽量在把问题发现在源头

测试平台

    所谓testbench,即测试平台,详细的说就是给待验证的设计添加激励,同时观察输出响应是否符合设计要求测试平台在做功能仿真、静态仿真和时序仿真的时候都需要用到。刚开始的对于一些初学者,遇到的都是一些简单的东西,测试平台相应的也很简单,用一个文件就可以很清晰的呈现测试结构。对于一些复杂的项目,测试就没有那么简单了,由此还专门产生一个行业——测试行业。这个时候我们要用到一个概念就是结构化测试。

        一个完整的测试平台如下图10所示,它是分结构组成的,其中对设计测试结果的判断不仅可以通过观察对比波形得到,而且可以灵活使用脚本命令将有用的输出信息打印到终端或者产生文本进行观察,也可以写一段代码让它们自动比较输出结果。

        测试平台的设计是多种多样,可以使用灵活的Verilog的验证脚本,但是它也是基于硬件语言但是又服务于软件测试的语言,有时并行有时顺序,只有掌握这些关键点,才能很好服务测试。需要说明的一点是,不管大家是已经在用Verilog在写测试平台还是刚学习写测试平台,那么建议大家还是能用到System Verilog中相对Verilog新的语法还是尝试的用,System Verilog是一种趋势,它本身就是向下兼容的第三代的Verilog。

RTL级仿真——前仿真for code

        这里RTL级仿真属于第一道检测,有些场合称作功能仿真,为了突出和后面的静态仿真的区别,以免在后面介绍静态仿真的时候大家弄的很头大,我们还是这样称呼。它是对工程在寄存器转送级进行的描述时进行测试,查看其在RTL级描述的时候实现的功能的正确性。

        关于RTL级仿真,如果设计中涉及到原理图输入的话,在一些仿真工具中是不支持的,比如Modelsim,这个时候要进行功能上的验证,可以将原理图转换成HDL描述,或者直接把整个工程转换成LUT门级网表后进行后面要讲到的静态仿真完成。

        所有逻辑功能的验证都希望在RTL级做,尽可能的将问题发现在RTL级仿真过程中,减少后面发现问题带来的反复

静态仿真——后仿真for netlist

        静态仿真,有些地方给的外号叫门级仿真,确切的说应该是综合后的LUT门级网表。是在综合过程后做的仿真。有些开发平台下将静态仿真具体又分为编译仿真和映射仿真,比如ISE就是这样做的,但是个人觉得应该很少场合做这个编译仿真。静态仿真的目的就是验证当工程到了用LUT门级网表描述的时候,从功能上检查验证工程的正确性。

        不管是Altera还是Xilinx的开发平台,都直接支持静态仿真,但是由于各自厂家的仿真器专业性不强,我们还是用第三方仿真工具比较多。这时候在第三方工具下的输入必须是经过综合工具综合出来的涵盖工程所有信息的LUT门级网表文件了。一般专业一点的第三方综合工具是不具备综合功能的,至少我们在使用Modelsim的时候,并没有要求我们添加工程用到的具体的哪一款型号FPGA的信息。这也是静态仿真的外号门级仿真指的是LUT门级网表仿真的依据。

时序仿真——后仿真for netlist+时延

        ​​​​​​​时序仿真是在布局布线之后做的,在前面介绍时序约束的时候讲到,布线延时问题影响到了电路的性能的时候可以做时序约束。那么这个延时问题的获得就可以通过时序仿真获得,当然还有一种获得延时出现超载情况,这个属于下面小节介绍的静态时序分析了。

        一般情况下,电路进行完布线过程后,会生成一个延时信息文件,我们简称SDF(standrad dealy format)文件,Quartus平台下是以.sdo文件形式存在的。里面含有三种延时信息,分别为最小值、典型值、最大值,存在的形式是最小值:典型值:最大值,一般缩写min:typ:max。这里也体现了,在FPGA里的延时信息是不能够精确获得的,只能是逼近,因为本身同一器件中,不同的区域的逻辑门也很有可能和其他的区域内同种的逻辑门的延时不一样。我们这里举一个例子来说明一下这三种值的含义。

        如上图,这是一个描述一段延时线的延时信息,给的延时信息从in端点到out端点,输入发生跳变后,分别以最小值、典型值和最大值将信号跳变传递到out端点。我们这里只是一段延时线,在延时信息文件里还有一类延时信息,就是一些具有逻辑功能的cell延时,这个时候信号跳变又分为由高变低和有低变高,因为这两种跳变在这些器件里的三种延时值是不一样的,得分别探讨,具体分别以某一种情况类推。

        在做后仿真的时候,只需要在做完静态仿真后的基础上添加布线的延时信息后,再分析逻辑功能是否满足要求。后方针的平台 使用情况和前面一样,一般采用第三方仿真工具,典型的是Modlesim,具体操作过程见软件相关操作章节。


7、静态时序分析

        静态时序分析,简称STA(Static Timing Analysis),这个过程做的话一把是在是做后仿真前做的。在布局布线后,会生成时序分析报告,该报告是分析工具利用从布线的路劲上提取出寄生参数后精确计算出来的。该报告中会提示出一些关键路径,所谓关键路劲就是指延时信息比较突出的信号节点流,通过分析可以得到不满足时序要求的路径,这个过程就是STA过程。

        静态时序分析的特点就是不需要输入向量就能穷尽所有的路径,且运行速度很快、占用内存较少,不仅可以对芯片设计进行全面的时序功能检查,而且还可利用时序分析的结果来优化设计。很多设计都可以在功能验证的成功的基础上,加上一个很好的静态时序分析,就可以替代耗时非常长的后仿真了,这是一种很有保障性的化简流程方式。

        后仿真相对静态时序分析来说还具有逻辑验证在加上延时信息的基础上分析逻辑。


8、在线调试

        在线调试也称作板级调试,它是将工程下载到FPGA芯片上后分析代码运行的情况。有人会以为,我们不是已经做了仿真了,甚至是时序仿真都通过了,还会存在问题么?在实际中,存在这么些情况我们需要用到在线调试:


  •     仿真不全面而没有发现的FPGA设计错误。很多情况下,由于太复杂,无法做到100%的代码覆盖率;
  •     在板级交互中,存在异步事件,很难做仿真,或者仿真起来时间很长,无法运行;
  •     除了本身FPGA外,还可能存在板上互连可靠性问题、电源问题和IC之间的信号干扰问题,都可能导致系统运行出错;
  •     其他潜在问题。

        在线调试的方式主要有两种,一种是利用外部测试设备,把内部信号传送到FPGA针脚上,然后用示波器或者逻辑分析仪观察信号;另一种就是利用嵌入式逻辑分析仪,在设计中插入逻辑分析仪,利用JTAG边缘数据扫描和开发工具完成数据交互。


9、配置及固化

FPGA配置过程

        在FPGA正常工作时,配置数据存储在SRAM中,这个SRAM单元也被称为配置存储器(configure RAM)。由于SRAM是易失性存储器,因此在FPGA上电之后,外部电路需要将配置数据重新载入到芯片内的配置RAM中。在芯片配置完成之后,内部的寄存器以及I/O管脚必须进行初始化(initialization),等到初始化完成以后,芯片才会按照用户设计的功能正常工作,即进入用户模式。

        FPGA上电以后首先进入配置模式(configuration),在最后一个配置数据载入到FPGA以后,进入初始化模式(initialization),在初始化完成后进入用户模式(user-mode)。在配置模式和初始化模式下,FPGA的用户I/O处于高阻态(或内部弱上拉状态),当进入用户模式下,用户I/O就按照用户设计的功能工作。

        举例——altera FPGA配置全过程

        一个器件完整的配置过程将经历复位、配置和初始化等3个过程。

配置模式


  • 这一块分成两部分,一部分是在线调试配置,另一块是固化,即将工程配置到相应存储单元中,上电后,通过存储在存储器中的内容配置FPGA。

        在线配置


  • 第一部分在线调试配置过程是通过JTAG模式完成的,如图13所示,在JTAG模式中,PC和FPGA通信的时钟为JTAG接口的TCLK,数据直接从TDI进入FPGA,完成相应功能的配置。


  • JTAG接口是一个业界标准接口,主要用于芯片测试等功能。FPGA基本上都可以支持JTAG命令来配置FPGA的方式,而且JTAG配置方式比其他任何方式优先级都高。JTAG接口有4个必需的信号TDI, TDO, TMS和TCK以及1个可选信号TRST构成,其中:
    • TDI,用于测试数据的输入;
    • TDO,用于测试数据的输出;
    • TMS,模式控制管脚,决定JTAG电路内部的TAP状态机的跳变;
    • TCK,测试时钟,其他信号线都必须与之同步;
    • TRST,可选,如果JTAG电路不用,可以讲其连到GND。​​​​​​​

        固化


  •         第二部分固化程序到存储器中的过程可以分为两种方式,主模式和从模式。       
    • 主模式下FPGA器件引导配置操作过程,它控制着外部存储器和初始化过程;从模式下则由外部计算机或控制器控制配置过程。主、从模式从传输数据宽度上,又分别可以分为串行和并行。

    (1)、主串模式

        主串模式是最简单的固化模式,如图14所示,这个模式过程不需要为外部存储器提供一系列地址。它利用简单的脉冲信号来表明数据读取的开始,接着由FPGA提供给存储器时钟,存储器在时钟驱动下,将数据输入到FPGA Cdata_in端口。

    (2)主并模式

        主并模式其实和主串模式的一样机理,只不过是在主串的基础上,同周期数内传送的数据变成8位,或者更高,如图15。这样一来,主并行相比主串行的数度要优先了。现代有些地方已采用这种方式来配置FPGA的了。

    (3)从并模式

        从上面看到,主模式下的连接还是很简单的。但是有时候,系统可能用其他微处理器来对FPGA进行配置。这里的微处理器可以指FPGA内嵌的处理器,比如说Nios。微处理器控制着何时配置FPGA,从哪读取配置文件。如图16,这种方式的优点是处理器可以灵活随时变更FPGA配置,同时配置的速度也快。微处理器先从外部存储设备里读取一个字节的数,然后写到FPGA里。

    (4)从串模式

        理解了从并模式,从串模式就不用很多解释了,它的特点就是节约FPGA管脚I/O。

    (5)多片级联

        多片模式有两种,一种是采用菊花链的思想,多片FPGA共享一个存储器,另外一个是可以使用其他存储器配置不同的FPGA。如果所示是一个共享型的结构,显示启动了。这里分主FPGA和从FPGA,主FPGA和存储器是使用串行主模式来配置,而后面那个的配置是通过第一配置好的FPGA上微处理器进行协调的。

模式选择

        现今FPGA应该可以支持上面五种配置模式,是通过3个模式引脚来实现的,具体的映射如下表,在今后模式还是有可能增加的。

        在PS模式下,如果你用电缆线配置板上的FPGA芯片,而这个FPGA芯片已经有配置芯片在板上,那你就必须隔离缆线与配置芯片的信号。一般平时调试时不会把配置芯片焊上的,这时候用缆线下载程序。只有在调试完成以后,才把程序烧在配置芯片中, 然后将芯片焊上.或者配置芯片就是可以方便取下焊上的那种。这样出了问题还可以方便地调试.。

        对FPGA芯片的配置中,可以采用AS模式的方法,如果采用EPCS的芯片,通过一条下载线进行烧写的话,那么开始的”nCONFIG,nSTATUS”应该上拉,要是考虑多种配置模式,可以采用跳线设计。让配置方式在跳线中切换,上拉电阻的阻值可以采用10K一般在做FPGA实验板的时候,用AS+JTAG方式,这样可以用JTAG方式调试,而最后程序已经调试无误了后,再用AS模式把程序烧到配置芯片里去。


10、开发工具总结

在围绕图1把FPGA开发流程讲完后,这里对每个环节中设计的相关软件进行总结,如下表所示。毕竟充分利用各种工具的特点,进行多种EDA工具的协同设计,对FPGA的开发是非常重要的。充分利用了这些EDA工具的优点,能够提高开发效率和系统性能。

        表中列出的每种EDA工具都有自己的特点。一般由FPGA厂商提供的集成开发环境,如Altera Quartus II和Xilinx ISE,在逻辑综合和设计仿真环节都不是非常优秀,因此一般都会提供第三方EDA工具的接口,让用户更方便地利用其他EDA工具。为了提高设计效率,优化设计结果,很多厂家提供了各种专业软件,用以配合FPGA芯片厂家提供的工具进行更高效的设计。

        比较常见的使用方式是:FPGA厂商提供的集成开发环境、专业逻辑仿真软件、专业逻辑综合软件一起使用,进行多种EDA工具的协同设计。比如Quartus II+ModelSim+FPGA Compiler II,ISE+ModelSim+Synplify Pro等等。




四、如何理解Setup time 和 Hold time?

建立时间:数据在时钟上升沿到来之,必须保持稳定的时间

保持时间:数据在时钟上升沿到来之,必须保持稳定的时间

不满足建立时间和保持时间的电路,触发器在数据变化时无法采到真实的高低电平信号,并会将这种不确定性往下传播。

建立时间约束:Tsetup

保持时间约束:Thold



五、名词解释之协议篇:SPI、SD、USB、LVDS、SERDES、DDR、MIPI、PCIe、MAC、SATA

SPI(Serial peripheral interface):串行外设接口

SD(Secure Digital):SD卡/TF卡

USB(Universal Serial Bus):通用串行总线

LVDS(Low - Voltage Differential Signal):低电压差分总线

SerDes(Serializer / Deserializer):串行器/解串器

DDR(Double Data Rate):双倍数据速率

PCIe(Peripheral Component Interconnect Express):高速串行扩展总线

MAC(Media Access Control):以太网数据链路层

SATA(Serial Advanced Technology Attachment):串行ATA接口




六、名词解释之存储篇:RAM、ROM、SRAM、DRAM、SSRAM、SDRAM、PROM、EPROM、E2PROM、Flash

模电/数电/单片机/计算机组成原理/电力电子常见笔试/面试题(合集)未完更新ing_Cheeky_man的博客-CSDN博客_电子电路原理




七、名词解释之设计流程篇:

DFT(Design For Test):可测性设计

APR(Auto Place & Route):自动布局布线

CTS(Clock Tree Synthesis):时钟树综合

ECO(Engineering Change Order):工程修改

DRC(Design Rule Check):设计规则检查

LVS(Layout Vs Schematic):版图与网表对比

DFM(Design For Manufacturing):可制造性设计

JDV(Job Deck VIew):在线掩模数数据检视




八、何为同步复位、异步复位?何为异步复位同步释放?

同步复位:复位与时钟有关,在时钟边沿有效;

//同步复位
always@(posedge clk) beginif(!rst_n)q <= &#39;b0;elseq <= d;
end

异步复位:复位与时钟无关,任意时刻都可复位;

//异步复位
always@(posedge clk, negedge rst_n) beginif(!rst_n)q <= &#39;b0;elseq <= d;
end

异步复位同步释放:复位信号有效时,输出立即为0,复位信号释放时,这时触发器应该读取数据并输出,但是为复位释放时刻离时钟边沿过近,使触发器的建立时间得不到满足,因为不能马上释放,应该等到触发器的一个clk后再释放,虽然信号延迟了一个clk才读取,但是使读取的信号准确率得到了保证,这是值得的。

input clk;//输入时钟
input rst_n;//复位信号
output s_rst;//打拍后的复位信号reg rst_1;
always @(posedge clk, negedge rst_n) beginif(!rst_n) begin //异步复位,只要复位信号有效,就马上复位rst_1 <= 0;s_rst <= 0;endelse begin//打一拍后再释放rst_1 <= &#39;b1;s_rst <= rst_1;end
end



九、何为亚稳态?如何消除亚稳态?

数字IC设计知识点及综合题详解(提前批、秋招必刷基础题)——(四)亚稳态、跨时钟域(CDC)处理方法及其编程仿真代码_Cheeky_man的博客-CSDN博客

亚稳态:触发器无法在某个规定时间内达到一个可确认的状态;

原因:触发器的 Tsetup 和 Thold 不满足,使得输出端 Q 在时钟边沿到来后比较长的一段时间内处于不确定的状态,并且Q稳定后的值是随机的,与输入D无关;

解决方法:


  • 单bit数据——多级寄存器同步
    • 电平同步器(快域采慢域)、脉冲同步器(慢域采快域)
  • 多bit数据——FIFO+双端口RAM、握手信号



十、画出CMOS 非门/与非门/或非门的结构




 十一、你所了解的信号跨时钟域传输的方式





十二、列出4bit的格雷码,画出格雷码转二进制码、二进制码转格雷码的电路图

虽然自然二进制码可以直接由数/模转换器转换成模拟信号,但在某些情况,例如从十进制的3转换为4时二进制码的每一位都要变,能使数字电路产生很大的尖峰电流脉冲。而格雷码则没有这一缺点,它在相邻位间转换时,只有一位产生变化。它大大地减少了由一个状态到下一个状态时逻辑的混淆。由于这种编码相邻的两个码组之间只有一位不同,引起数字量发生变化时,格雷码仅改变一位,这样与其它编码同时改变两位或多位的情况相比更为可靠,即可减少出错的可能性。

格雷码的构造方法为:直接排列以二进制为0值的格雷码为第零项,第一项改变最右边的位元,第二项改变右起第一个为1的位元的左边位元,第三、四项方法同第一、二项,如此反覆,即可排列出n个位元的格雷码


1、二进制码转格雷码

自然二进制码转换成二进制格雷码:最高位相同,而次高位格雷码二进制码的高位次高位相异或,而格雷码其余各位与次高位的求法相类似。      

原理: 若二进制码表示为: B[N-1]B[N-2]...B[2]B[1]B[0];

         相应地, 则二进制格雷码表示为: G[N-1]G[N-2]...G[2]G[1]G[0].

         其中最高位保留: G[N-1] = B[N-1];

         其他各位: G[i] = B[i+1] xor B[i]. (i = 0, 1, 2, ..., n-2)

    图示如下:


 2、格雷码转二进制码

二进制格雷码转换成自然二进制码,其法则是最高位相同,而次高位自然二进制码为高位自然二进制码与次高位格雷码相异或,而自然二进制码的其余各位与次高位自然二进制码的求法相类似。      

 


 




十四、三段式FSM

1、时序逻辑:current state → next_state

2、组合逻辑:state的切换

3、时序/组合:对应state的输出

//1、时序逻辑
always @(posedge clk, negedge rst_n) beginif(!rst_n)current_state <= IDLE;elsecurrent_state <= next_state;
end//2、组合逻辑
always @(posedge clk, negedge rst_n) begincase(current_state)IDLE:next_state = current_state;//阻塞赋值//3、描述输出
always @ (posedge clk or negedge rst_n) begincase(next_state)IDLE:next_state <= current_state;//非阻塞赋值

 


推荐阅读
  • 通过使用CIFAR-10数据集,本文详细介绍了如何快速掌握Mixup数据增强技术,并展示了该方法在图像分类任务中的显著效果。实验结果表明,Mixup能够有效提高模型的泛化能力和分类精度,为图像识别领域的研究提供了有价值的参考。 ... [详细]
  • 利用ZFS和Gluster实现分布式存储系统的高效迁移与应用
    本文探讨了在Ubuntu 18.04系统中利用ZFS和Gluster文件系统实现分布式存储系统的高效迁移与应用。通过详细的技术分析和实践案例,展示了这两种文件系统在数据迁移、高可用性和性能优化方面的优势,为分布式存储系统的部署和管理提供了宝贵的参考。 ... [详细]
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 在C#编程中,数值结果的格式化展示是提高代码可读性和用户体验的重要手段。本文探讨了多种格式化方法和技巧,如使用格式说明符、自定义格式字符串等,以实现对数值结果的精确控制。通过实例演示,展示了如何灵活运用这些技术来满足不同的展示需求。 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • Parallels Desktop for Mac 是一款功能强大的虚拟化软件,能够在不重启的情况下实现在同一台电脑上无缝切换和使用 Windows 和 macOS 系统中的各种应用程序。该软件不仅提供了高效稳定的性能,还支持多种高级功能,如拖放文件、共享剪贴板等,极大地提升了用户的生产力和使用体验。 ... [详细]
  • PHP预处理常量详解:如何定义与使用常量 ... [详细]
  • 如何撰写适应变化的高效代码:策略与实践
    编写高质量且适应变化的代码是每位程序员的追求。优质代码的关键在于其可维护性和可扩展性。本文将从面向对象编程的角度出发,探讨实现这一目标的具体策略与实践方法,帮助开发者提升代码效率和灵活性。 ... [详细]
  • C++ 开发实战:实用技巧与经验分享
    C++ 开发实战:实用技巧与经验分享 ... [详细]
  • 计算机视觉领域介绍 | 自然语言驱动的跨模态行人重识别前沿技术综述(上篇)
    本文介绍了计算机视觉领域的最新进展,特别是自然语言驱动的跨模态行人重识别技术。上篇内容详细探讨了该领域的基础理论、关键技术及当前的研究热点,为读者提供了全面的概述。 ... [详细]
  • 利用源链接技术调试ASP.NET Core源代码的方法与实践
    本文详细探讨了通过源链接技术调试ASP.NET Core源代码的实用方法,旨在为开发者提供高效、准确的调试技巧,适用于学习和实际工作中遇到的相关问题。希望读者能从中获得有价值的参考和启发。 ... [详细]
  • 本文深入探讨了 hCalendar 微格式在事件与时间、地点相关活动标记中的应用。作为微格式系列文章的第四篇,前文已分别介绍了 rel 属性用于定义链接关系、XFN 微格式增强链接的人际关系描述以及 hCard 微格式对个人和组织信息的描述。本次将重点解析 hCalendar 如何通过结构化数据标记,提高事件信息的可读性和互操作性。 ... [详细]
author-avatar
手机用户2502939901
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有