一、FPGA:Field Programmable Gate Array 现场可编程门阵列
可编程输入/输出单元、基本可编程逻辑单元、嵌入式块RAM、丰富的布线资源、底层嵌入功能单元和内嵌专用硬核。
可编程输入/输出单元(I/O)单元
输入/输出(Input/Ouput)单元简称 I/O 单元,它们是芯片与外界电路的接口部分,完成不同电气特性下对输入/输出信号的驱动与匹配需求,为了使 FPGA 具有更灵活的应用,目前大多数 FPGA 的 I/O 单元被设计为可编程模式,即通过软件的灵活配置,可以适配不同的电气标准与 I/O 物理特性;可以调整匹配阻抗特性、上下拉电阻、以及调整驱动电流的大小等。
基本可编程逻辑单元
组成 FPGA 的两个最基本的部分是组合逻辑以及时序逻辑,分别实现这两个基本部分的结构就是 FPGA 的基本单元。组合逻辑部分一般采用查找表(Look-Up-Table,LUT)的形式,时序逻辑部分一般采用触发器(Flip-Flop,FF)的形式。
Xilinx 7 系列 FPGA 中的可编程逻辑单元叫 CLB(Configurable Logic Block,可配置逻辑块)每个CLB 里包含两个逻辑片(Slice)。
时序逻辑的基本单元采用 D 触发器,这种触发器是一种在时钟的上升沿(或下降沿)将输入信号的变化转送至输出的边沿触发器。
- 建立时间(setup-time):如果在 CLK=0 时,由于门的传输延时,输入信号没有稳定的保存到主锁存器中,那么当 CLK 从 0 变到 1,输入关闭,输出打开时,主锁存器就只能给输出端口提供一个不稳定的信号。为了避免这种情况的发生,需要输入信号在上升沿到来前已经稳定。
- 保持时间(hold-time):当 CLK 从 0 变到 1,由于门的传输延时,门不可能立刻关闭,如果此时发生输入信号的变化,那当门关闭后实际保存的信号就可能是变化后的信号(相当于下一时刻的信号将我们需要的当前信号覆盖了)。为了避免这种情况的发生,需要输入信号在上升沿到来后保持一段时间的稳定。
根据数电中的知识,任何一个组合逻辑都可以表示成真值表的形式(逻辑输入对应逻辑输出),也就是任意的真值表所反映的内容都能由组合逻辑实现,查找表(LUT)就能完成这个任务。
存储器
- 硬宏存储器:硬宏型存储器被称为块存储器(Block RAM,BRAM),实现方法就是以硬宏的形式在架构中嵌入存储器块。
- 查找表存储器:查找表存储器被称为分布式存储器(Distributed RAM,分布式 RAM),使用 SLICEM 逻辑块查找表中的真值表作为小型的存储器,能实现 BRAM 不能实现的异步访问,但是一般需要小规模存储器时才采用这种方法(不能占用太多的用来实现逻辑的查找表资源)。
存储的一些知识
时钟部分
PLL
DLL
最高效的计算方式应该是怎样的?
现在大家应该都知道了,计算的瓶颈往往不在于运算单元数量的不够或是速度不够高,而是在内存带宽上,也就是数据读写来不及,运算单元喂不饱。那最高效的计算方式自然就是能充分利用片上高速内存,让运算单元等待数据的情况从不发生,同时尽可能的减少了对外部DDR的读写,这也同时降低了功耗,所以既要速度快又要功耗低这两者其实并不矛盾。
为什么FPGA比GPU的能耗更低呢?上面讲的是原因之一,还有一个原因是FPGA是硬件可编程,所以它的数据通路是最直接的。比如说用FPGA算两个数相加,那直接把两个数从内存读进来送到加法器那去加就行了。但在GPU中还要进行指令译码,知道是做加法之后还要把这两个数往加法器那里送,这中间数据要经过一些选通器才会被正确的送到加法器那而不是别的运算单元那里。译码,数据经过选通,这些都会产生额外的功耗。而FPGA每次要做的运算都是固定的,所以不需要指令译码,也基本不需要数据的选通。