写在最前面:
没错,我便是一名普一般通的工程师,有那么一两项能养活自己的技能。技能这个东西,假如仅仅用在作业岗位上的话,便是一个“搬砖”的东西,假如把它共享出来,没准还能磕碰出有意思的东西来,你们说是吧?
好了,这一系列博文教程叫做“FPGA软硬件加快入门”,望文生义,便是运用FPGA自身的特色,在软硬件进行不同的体系分工,加快体系输出的速度(首要是核算),我会尽量从入门者的视点解说相关内容,假如你觉得还行,挺受用,动一动手指,帮助转发一下,不胜感激啦~
一、 从嵌入式软件开发到FPGA开发
1.1 单片机开发流程浅析
在开端介绍FPGA之前,让咱们来回忆一下简略的嵌入式软件开发吧,信任咱们或多或少都触摸过单片机(Micro Control Unit)的规划流程。作为一个简略的操控器,单片机的作业流程无非如下:
1、 单片机上电,程序从存储器中加载到MCU内部;
2、 依据单片机的输入(如键盘输入、传感器数据的读取等)、以及程序内部的逻辑,核算得到操控成果;
3、 将成果输出,操控单片机的外部设备(如LED的亮灭、操控电机转速的PWM波形等);
也便是说,一个简略的单片机作业体系的构成如下:
而为了建立上面的这样一个体系,咱们在软件方面需求做的作业包含下面这几部分:
1、 代码修改,这儿首要包含输入输出设备驱动和内部的操控逻辑;
2、 代码编译,将源文件(.c或.cpp)转化为指定单片机可执行的二进制文件;
3、 可执行文件烧写,将二进制文件固话到单片机(内部或外部)的存储器中;
上面三个过程,咱们一般是在各种IDE(Integrated Development Environment)开发环境下完成的,也便是说在一个软件里边完成修改、编译、烧写的功用,常见的IDE软件如下:
1.2 从单片机开发到FPGA开发
1.2.1 FPGA的根本作业原理
在进行FPGA开发之前,咱们有必要得了解为什么要运用FPGA,也就有必要得知道FPGA的作业原理。咱们知道,关于一个简略单片机体系来说,作业原理和上文描绘相同,也便是说,关于一个简略的让LED闪耀的功用,单片机要做的作业如下:
1、 从(内部或外部)的程序存储器中,取出一条让LED点亮的指令;
2、 将该指令输入到CPU的指令译码器中,依据译码器的成果(此处是将操控LED的GPIO的输出寄存器的bit位拉高)操控相应寄存器;
3、 加载下一条延时指令,输入到译码器中,进行空操作处理;
4、 持续加载下一条让LED灭的指令,译码后,操控GPIO总线上的指定bit位拉低,然后平息LED;
5、 循环上述操作到达闪耀LED的意图;
经过上面闪耀LED的比方,咱们能够知道,关于单片机来说,它的中心有2点:
指令的加载、译码——其实也便是对指令集的解析,知道这一条言语究竟进行了什么硬件上的操作,后边章节会具体的解说;
外设的操控——能够经过写寄存器操控单片机的外设,如GPIO、uart、spi、IIC等;
那么关于FPGA而言呢?
无论是FPGA、单片机,又或是ARM体系、咱们的PC,其实本质上便是一个核算渠道,是一个信息处理体系。作为一个体系,它的输入、核算、输出的构成是永久不会变的。那变的是什么?变得是核算的原理。
关于单片机而言,取指、译码、输出是它的原理,那么关于FPGA而言,它的原理又是什么?在介绍之前,咱们先回忆一下《数字电路》这门课里边的根底内容——组合逻辑和时序逻辑电路。
D触发器是时许逻辑电路的根本组件,与、或、非们是组合逻辑电路的根本组成。运用这些组成咱们能够完成许多小的功用。
比方,经过D触发器咱们能够规划一个计数器:
比方,咱们能够经过简略的组合逻辑来完成一个比较器
讲到这儿,咱们或许现已知道了,这两个简略的逻辑电路其实能够构成一个让LED闪耀的简略体系。咱们只需求将计数器的输出作为比较器的X输入,而别的一个固定的电平值(比方说8)作为Y输入,那么每逢X=Y的时分,比较器的X=Y都会输出一个高电平。而将X=Y的输出作为另一个1位计数器的输入的时分,便会发生这么一个作用——每过8个时钟周期后,最终输出的电平就会回转一次,到达LED闪耀的作用,整个电路的构成如下:
为什么在这儿要讲LED闪耀的数字电路构成呢?由于这正是FPGA的作业原理!FPGA全程Field Programmable Gate Array(现场可编程门阵列),这个“门”指的便是FPGA内部芯片的首要组成部分——巨大数量的寄存器和门电路(具体的构成后边章节会介绍)。
至此,咱们能够比照出单片机开发和FPGA作业原理了。它们的异同点如下表:
1.2.2 为什么要用FPGA
前面咱们提到一个简略的操控LED的比方,知道了整个流程是取指、译码、操控外设的流程。关于一个LED电频翻转来说,MCU当然是满足的,咱们考虑一下以下几个问题:
1. 假如我要输出高清的60帧/s的1080P视频信号给显示器怎么办?用GPIO操控?
2. 假如我要进行运算量十分大的程序,比方现在十分火的AI网络练习,涉及到许多的乘法、加法,用MCU?PC?
答复了上述几个问题也就解说了为什么要用FPGA了。咱们来挨个解说一下:
1. 用GPIO翻转输出一个指定的电平需求几十个时钟周期(MCU的clock频率),假如我要输出一个60帧、1080P的视频信号的话(其实也是电平的操控),那么翻转的频率或许要到达百兆的速度了,假如运用MCU这种方法的话,MCU要到达几GHz的主频了,这显然是不现实的。而依据上面FPGA的电平翻转的原理,D触发器的时钟频率只需求百兆就能够了;
2. 核算机根底告知咱们,无论是MCU仍是PC的CPU,内部都有相应的乘法器和加法器。假如规划到许多的核算的话,单个乘法/加法器哪怕主频再高,核算速度也跟不上。而关于FPGA来说,能够模仿上面计数器、比较器的方法,规划几十个、几百个乃至几千个核算单元,哪怕主频比CPU低许多,核算速度也远高于CPU。二者的联系能够用下图形象地表明:
FPGA开发流程
二、FPGA开发流程
FPGA的开发有一个特色,即开发环境和运用的芯片有十分强的关联性。不像单片机开发的IDE,一个开发套件能够适配几十上百家不同的单片机(各种51、PIC、stm32等)。但现在干流的FPGA芯片只要2家——Xilinx(赛灵思)和Altera(后被Intel收买,咱们权且称之为英特尔的FPGA吧)。
这系列博文首要会集在Xilinx的FPGA芯片及其相应的开发套件Vivado上。
以比较常见的stm32系列单片机和集成开发环境Keil为例,咱们来比照一下单片机开发和FPGA开发的流程。
能够看到,相关于单片机(更不用说一般的PC软件开发了),FPGA的开发流程杂乱了许多。工程么,不便是各种tradeoff,开发便当和核算性取舍,便是后话了~