单片机MCU和现场可编程逻辑阵列FPGA的区别及使用方式详解

       前段时间学校组织到市会展中心去参观发明的新产品,作为电子,编程爱好者的我这次的参观肯定都已新电子产品为主,在那些大型发明中如电车电池控制器、汽车主控制器、高端远程通讯设备、以及军用设备中大部分使用的都是FPGA、DSP作为主要控制器,曾经哪些在高端发明中如火如荼的STM32系列单片机仿佛都不见了踪迹,取而代之的是哪些名字复杂的难以记得的现场可编程逻辑阵列、数字信号处理,而在电子DIY圈子里STM32更是老生常谈的名字,看到或许你和我有同样的问题,单片机MCU和现场可编程逻辑阵列FPGA区别到底在哪里?使用起来又有什么不同呢?别着急下面就对他进行解答。

什么是FPGA,MCU:

现场可编程逻辑阵列FPGA:

      FPGA全程现场可编程逻辑阵列,顾名思义就是针对数字电路设计的一款器件,如果学习过数字电路一定知道逻辑门,而它就是可以编程的大型逻辑门。它是一种特殊的集成电路芯片,它可以被编程或重新编程以适应不同的应用需求。FPGA的特点在于其高度的可定制性和灵活性。

       FPGA更是芯片验证,芯片设计的主流器件,虽然与专用集成电路(ASIC)相比,FPGA能够提供较短的设计周期和较低的成本,但是跟MCU单片机相比开发周期可不是慢了一点半点,此外,FPGA的应用包括,数字信号处理、视频处理、通信和控制等领域的设备。可以自定义调整FPGA的配置,使其执行计算任务,和多样性数字信号处理,说不定你用的手机SOC开发过程中都有可能用到了FPGA逻辑验证,速度比MCU快功能更强大,成本也更高。

单片机MCU:

       单片机是一种微型集成电路,是多个控制单元集成到一起构成的一个超小型智能的微型计算机。包含CPU,内存,寄存器,输入输出设备等,和我们家用的电脑很相似,是一个完整的,独立的微型计算机,但在家用计算机总和性能方面有所减少,扩大了可编辑性。

       在工业控制领域广泛应用,在生活中使用较多,如洗衣机、玩具、智能冰箱等都能看到它的身影,并且造价成本低,有多个型号可以选择,开发时间比FPGA快,开发简单,周期较快,投入成本较少,但是性能和FPGA比起来差距还是很大的。

总结:

      在一定程度上FPGA的性能要强于单片机MCU的,但是他们的使用用途、针对方向有很大的区别,(这里先说一下,是基于他们开发底层硬件基本单元不同的原因,在不同开发环境和思维中讲解)注意不能说FPGA就是更先进的单片机,为什么呢?请看下面一章。

硬件方面有什么区别呢:

FPGA的内部结构:

         FPGA包含大量的独立逻辑单元(如逻辑块或LUT),并且具备可编程连线结构。使其用编辑就能在FPGA内部进行逻辑块的连接,用户可以根据实际需要随时调试更改FPGA的功能,提高了系统的灵活性和应对变化的能力。

下面是FPGA的内部组成结构图:

          可以看到内部和单片机比起来它是很多个单元组成的,有规律的排列,这就是大量的独立逻辑单元组成的,内部矩形蓝色的块就是基本逻辑块,他们在大体上都是相同的,FPGA的基本参数之一就是看内部逻辑块数量(密度),或叫逻辑单元数量(密度),密度越大集成数量越多代表器件就越先进,其内部IP核更复杂,支持的也就更多。

 

       这就是逻辑块内部基本结构(上图只是示例图),逻辑块LUT的复杂程度决定了FPGA器件的先进程度,比如说拿赛灵思的Zynp-7000来说它LUT的复杂程度要比Zynq-6000系列要复杂的多,性能方面要强大。

单片机的内部结构:

         采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、数模转换、模数转换、器件通信等功能。

 

         这张图是单片机内部的基本结构,可以看到和我们普通家用电脑构造很相似,CPU控制着其他内部设备,内部主要最低控制单元是寄存器,只要通过CPU来控制寄存器的数据位传输,存储等就可以实现对I\O口的控制,单片机的寄存器的功能决定了该器件的支持能力,比如说STM32他在寄存器支持(硬件)上要比51系列单片机功能要多,在通讯方面,(总线的速度主要由寄存器决定),在ADC,DAC转换的数据位上,甚至在CPU内部架构和处理的数据位上,STM32要比51系列单片机强的很多。

总结:

      FPGA在硬件方面和单片机有所不同,主要一点在于FPGA的内部结构是分散的,重复的,有规律的,并且每个都是独立的块,而单片机内部结构是固定的,有自己的运行机制,在架构方面为绕着中央处理器(CPU)来运行,从硬件方面来看,FPGA更适合对大型数字信号的处理(通过内部逻辑门的不同组合),而单片机更适合完成简单的数字产品控制,简单的应用,造成这样的原因主要是因为,基于他们开发底层硬件基本单元不同的原因。

不同的开发环境和思维:

          在这里要先说明一下基于什么样的底层开发对功能有什么影响,暂时先抛开单片机和FPGA方面的问题,我们所有使用的半导体芯片都是基于P型,N型,组成的PN结,就是这个才有了现在的电子产品,芯片的复杂是因为内部多达上亿个晶体管,单从PN结组成的晶体管来开发一定很复杂,在芯片设计时不是基于晶体管来设计的,而是基本逻辑门(一个逻辑门包含几十个晶体管)这样从开发上从几亿个减少到了几千万个,很省开发周期和精力,专用集成电路(ASIC)要比FPGA开发周期长,但不得不说的是专用集成电路(ASIC)性能比FPGA强大。

        回到探讨的问题,如果基于底层硬件单元不同,则会出现越简单的底层硬件单元则开发周期较长,更为复杂,功能更加强大,这就是FPGA,它的基层基本开发硬件单元比单片机更简单,数量也更多,所以强大。而单片机的基层硬件单元是寄存器,寄存器可以看做是由多个逻辑单元组成,在硬件方面寄存器的复杂程度要远大于FPGA的逻辑块,但是换来的代价就是寄存器的数量远远不足于FPGA的逻辑块数量。(如果理解不了可以把FPGA开发理解为编写寄存器,单片机开发是在调用寄存器,不一定完全是这样的

         单片机主要基于内部CPU对寄存器的开发(主要是寄存器的应用),而FPGA主要是针对内部基本逻辑组合的应用,单凭这一点就导致FPGA更适合大规模的数字信号处理,单片机更适合处理少量的(和FPGA相比)较为复杂的信号。

      总的说就是开发底层硬件基本单元越靠近PN结组成的晶体管性能就越强大,换来的代价就是开发周期较长,投入到较高,例如专用集成电路(ASIC)和FPGA,FPGA和单片机。

FPGA开发环境和思维: 

编程语言和示例:

          这是Verilog编程语言,实现4个LED流水灯的实验,和C语言很相似它更倾向于对硬件的描述,但是他主要靠着数字电路的逻辑思维,也就是用代码对内部器件进行硬件描述,它的入门门槛很高不仅需要很强大的逻辑思维,还需要很扎实的数字电路基础,入门门槛更高更复杂,虽然代码不长但是对刚学习FPGA的人来说还是较难理解的,

 

       现在我对上述代码进行简单讲解:在模块中开始时先定义位宽,包括该模块的输入输出接口,要定义好输出bit位宽,输出是4个LED所以是0到3位,在模块内部要定义有编程要素必须要有如果不设定会有问题。

1、必须在模块内部设定复位信号(对应上图rst_n)。

2、内部必须要有时钟信号,(对应上图sys_clk)。

3、每一个if语句都要设定默认值状态就是‘begin’,时序逻辑电路尽量设计,组合逻辑电路一定要有。

4、有必要设置约束文件,为了输出不会出现错误。 

     (注意上面四个不是Verilog语言的基本要求,是实现该功能的基本要求) 

       编程中主要的东西再简单的电路都要有,保证有强大的逻辑能力。

       

设计思路:

       我使用的是Vivado上述代码逻辑综合形成的逻辑阵列图,用上述代码展示了下图的内部逻辑组成原理,Verilog语言所对应的硬件描述。

 

       下图就是对应的内部信号 输入输出波形,在FPGA开发中主要输出波形进行开发的,就是实验目的→转化输出和内部传输波形→转换为Verilog代码,不像单片机可以论功能直接就进行开发,开发时要保证清晰的数字逻辑,虽然FPGA要比单片机更为复杂但是对大型数字信号处理,逻辑处理在开发上要有优势(跟单片机比)。

         举个列子,我要实现延时100ms的功能,先要设定主时钟为50MHZ,然后定义一个计数器来记录频率次数,1秒是50 000 000次的频率延时100ms计算得出,计数器每记录5000 000次就是100ms这时计数器就输出高电平,为了保证循环,还要设定计数器清零的操作,还要设定计数器的最大值,(输出电平时不能在计数了)。

面对未来的方向:

        Verilog语言在1984年第一个版本发布出去,针对FPGA开发的语言统称为硬件描述语言,期间有VHDL,HDL等性能都差不多,都是要保证具备很强大的数字电路描述能力,C语言对FPGA直接进行开发很不友好,但是在生活中很少看见FPGA的原因是因为它成本较高,只能出现在高性能的电子产品上,但是在高性能的电子产品上控制器芯片等都会拿去做定制芯片去定制专用集成电路(ASIC)甚至SOC,(这样做的原因是因为专用集成电路要比FPGA更强大,自己定制芯片的成本会更低)这就涉及到芯片的制造了(拿去流片)这就导致FPGA出现在了一个较为尴尬的局面,可能出现在了芯片流片前的逻辑验证,有点昙花一现的意思了。

       在新版本的Vivado(赛灵思FPGA开发主流软件)支持的逻辑门内部专用集成电路(ASIC)模拟性能可以支持到一亿个,在IP核方面也更加先进,支持能力更多,所有语言都朝着轻量化发展,但是Verilog语言还是和以前一样。

单片机开发环境和思维:

编程语言和示例:

          以下是51系列单片机实现4个LED流水灯的实验,很简单,很好理解,C语言编写,没有更严格的内部处理要求,你只要遵循C语言编写的最基本要求就可以开发。

#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
#include<intrins.h>		//因为要用到左右移函数,所以加入这个头文件
 
typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;
 
#define led P2	   //将P2口定义为led 后面就可以使用led代替P2口
 
void delay(u16 i)	  //延时函数
{
	while(i--);	
}
 
void main()
{
	u8 i;
	led=~0x01;	   //对P2口赋值
	delay(50000); //大约延时450ms	
	for(i=0;i<3;i++)	 //将led左移一位,移三次
	{
		led=_crol_(led,1);
		delay(50000); //大约延时450ms	
	}
	for(i=0;i<3;i++)	//将led右移一位,移三次
	{
		led=_cror_(led,1);
		delay(50000); //大约延时450ms	
	}
}		

 

设计思路:

       首先对头文件导入,函数导入,然后变量进行声明,编写代码你可以直接根据单片机实现的功能上直接进行编程,端口赋值直接进行入延时函数,位运算数据位相加,就可以输出流水灯,没有更苛刻的要求。

 

      举个列子,我要实现延时100ms的功能 调用延时函数,在delay(100)直接就写明目的,为了实现循环要在外面嵌套while语句或for循环。

面对未来的方向:

   以下代码是ESP-32(单片机的一种)使用Python代码进行开发的,它在轻量话有着显著的提升,在代码方面可以实现多模块拼接(Python应用)调用速度快,入门方向年龄更低开发变得简单,而嵌入式硬件开发产品有很火的牌子如:Arduino 、 Micro bit等Arduino更适合初中生,高中生开发,Micro bit适合小学生研究,逐渐走向简单,快速,成本更低等


#导入Pin模块
from machine import Pin
import time

led_pin=[15,2,0,4,16,17,5,18]  #定义LED控制引脚
leds=[]  #定义leds列表,保存LED管脚配置对象
for i in range(8):  #循环8次,0-7
    leds.append(Pin(led_pin[i],Pin.OUT))  #给leds列表添加对象
# leds=[Pin(led_pin[i],Pin.OUT) for i in range(0,8)]

    
#程序入口
if __name__=="__main__":
    #LED全熄灭
    for n in range(8):
        leds[n].value(0)
        
    while True:
        #LED逐个点亮
        for n in range(8):
            leds[n].value(1)
            time.sleep(0.05)
        #LED逐个熄灭
        for n in range(8):
            leds[n].value(0)
            time.sleep(0.05)

       在未来单片机不一定会大面积占有高端处理器市场,但是中低端市场一定都是它的,

结尾总结:

     单片机和FPGA一样都是朝着性能更强的方面,FPGA对入门要求更高,数字逻辑基础等,适合大型数字信号处理,逻辑运算等,而单片机要就就是会编程语言,电子电路基础,就可以了可以实现简单的控制,决定他们不同功能的因为底层硬件基本单元不同,针对入门单片机难度相当于小学,初中,高中,而FPGA难度相当于大学,研究生等开发。

       文章结束了,感谢阅读,如果该文章有用就要点赞吧,让更多的人看到,如果看到该文章有不对的地方欢迎随时来指正。

物联沃分享整理
物联沃-IOTWORD物联网 » 单片机MCU和现场可编程逻辑阵列FPGA的区别及使用方式详解

发表评论