一文带你认识FPGA~

在我们嵌入式中,有这样一朵奇葩介于软件与硬件之间,这朵奇葩就是FPGA。可能很多平时玩MCU比较多的朋友不太了解。

之前我也不太了解,但是最近两年的这两份工作都有与FPGA挂钩,所以我精通FPGA程序的烧写(不仅如此,我还精通电脑的开关机,哈哈):

下面我们一起来简单了解一下。

什么是FPGA

FPGA (Field Programmable Gate Array ),即现场可编程逻辑门阵列,属于专用集成电路中的一种半定制电路,是可编程的逻辑列阵,能够有效的解决原有的器件门电路数较少的问题。

FPGA 的基本结构包括可编程输入输出单元,可配置逻辑块,数字时钟管理模块,嵌入式块RAM,布线资源,内嵌专用硬核,底层内嵌功能单元。

FPGA说白了就是一颗芯片,只不过是半定制的芯片,它里面的电路可以通过硬件描述语言来设计,所以灵活性很高。

设计语言及平台

为什么说FPGA是一朵介于软件与硬件之间的一朵奇葩呢。

因为说它属于硬件吧,但是也是需要写代码的,说它是软件吧,但其思想又与我们一些软件设计思想不符(FPGA程序是并行执行的),而且又得对一些数电及一些芯片规格、芯片内部原理等硬件知识了解得很深。综合来说,我觉得FPGA还是属于硬件的范畴。

FPGA使用硬件描述语言来开发, 常用的主要有VHDL、Verilog HDL、System Verilog 和 System C。其中,Verilog HDL是广泛应用的硬件描述语言,可以用于硬件设计流 程的建模、综合、模拟等多个阶段。

Verilog HDL 优点:类似C语言,上手容易,灵活。大小写敏感。在写激励和建模方面有优势。缺点:很多错误在编译的时候不能被发现。

FPGA的应用及发展

FPGA一般应用在高性能处理、实时要求高的领域,比如高速接口、报文转发、图像处理、视频传输、辅助电机控制(比如伺服驱动器)等,还可以应用在芯片前期验证。

说个我们MCU玩家可能比较熟悉的:MCU芯片的前期设计验证。大家有没有想过STM32是怎么做出来的呢?

首先,用FPGA来设计STM32内部的电路,设计完之后就可以把这FPGA芯片当成STM32来用,然后就可以写C代码去验证一些外设。

如果发现外设功能不正常,那又可以用硬件描述语言来修改FPGA内部电路,不断修改直到FPGA的功能都正常(具有与一般MCU芯片一样的功能),然后再拿去封装成一颗颗芯片,就是我们在用的STM32。

大家不要误以为我是ST的工程师哈,以上只是一些自己接触到的东西加上自己的一些之前的学习了解到的东西。

上面用到的相关是SOPC技术。什么是SOPC技术呢?

SOPC技术简介

SOPC是在单纯的FPGA芯片上使用FPGA的逻辑和存储器资源搭建一个软核CPU系统,由该软核CPU实现所需处理器的完整功能。

由于是使用FPGA的通用逻辑搭建的CPU,因此具有一定的灵活性,用户可以根据自己的需求对CPU进行定制裁剪,增加一些专用功能,例如除法或浮点运算单元,用于提升CPU在某些专用运算方面的性能,或者删除一些在系统里面使用不到的功能,以节约逻辑资源。

另外也可以根据用户的实际需求,为CPU添加各种标准或定制的外设,例如UART,SPI,IIC等标准接口外设,同时,用户也可以自己使用FPGA的逻辑资源,编写各种专用的外设,然后连接到CPU总线上,由CPU进行控制,以实现软硬件的协同工作。

在保证系统性能的同时,增加了系统的灵活性。而且,如果单个的软核CPU无法满足用户需求,可以添加多个CPU软核,搭建多核系统,通过多核CPU协同工作,让系统拥有更加灵活便捷的控制能力。

由于CPU是使用FPGA的通用逻辑资源搭建的,相较使用经过布局布线优化的硬核处理器来说,软核处理器够运行的最高实时钟主频要低一些,而且也会相应的消耗较多的FPGA逻辑资源以及片上存储器资源。

因此SOPC方案仅适用于对于数处理器整体性能要求不高的应用,例如整个系统的初始化配置,人机交互,多个功能模块间的协调控制等功能。再如在芯片的设计验证阶段,主要保证芯片功能没问题即可。

在高端应用上,比如视觉、机器人的应用上,会用到SoC FPGA技术。什么又是SoC FPGA技术呢?

SoC FPGA技术简介

从架构的角度来说,SOPC和SOPC FPGA是统一的,都是由FPGA部分和处理器部分组成。在SoC FPGA 中,嵌入的是ARM公司的Cortex-A9硬核处理器,简称HPS(Hardware Processor System)

而SOPC技术中,嵌入的是NIOS II 软核处理器,两者指令集不一样,处理器性能也不一样。Cortex-A9硬核处理器性能远远高于NIOS II 软核处理器。

相关芯片就是Altera公司Cyclone V SoC FPGA芯片。Cyclone V SoC FPGA 片上的HPS部分,不仅集成了有双核的Cortex-A9硬核处理器,还集成了各种高性能外设,如MMU、DDR3控制器、Nand FLASH控制器等,有这些外设,HPS部分就可以运行成熟的Linux操作系统。

NIOS II软核CPU虽然可以通过配置,用逻辑资源来搭建相应的控制器以支持相应功能,但是从性能和开发难度上来说,基于SoC FPGA架构进行设计开发是比较好的选择。

虽然SoC FPGA芯片上既包含了有ARM,又包含了有FPGA,但是两者一定程度上是相互独立的,SoC芯片上的ARM处理器核并非是包含于FPGA逻辑单元内部的,FPGA和ARM(HPS)处理器只是封装到同一个芯片中,JTAG接口、电源引脚和外设的接口引脚都是独立的。

因此,如果使用SoC FPGA芯片进行设计,即使不使用到片上的ARM处理器,ARM处理器部分占用的芯片资源也无法释放出来,不能用作通用的FPGA资源。而SOPC则是使用FPGA通用逻辑和存储器资源搭建的CPU,当不使用CPU时,CPU部分占用的资源可以被释放,重新用作通用FPGA资源。

相关资料:

《阿东 手把手教你学FPGA》

《小梅哥 基于SoC FPGA的嵌入式设计和开发教程》

最后

FPGA技术是一项很热门、很吃香的技术,但也是有门槛的。比如学历,很多FPGA相关得岗位,都需要研究生学历。FPGA一般研究生阶段会接触得比较多,如果本科阶段能接触到,那就太幸福了,可以学一学。正点原子和野火也在做这方面的教程吧。正点原子的做FPGA教程的好像是《手把手教你学FPGA》这本书的作者,很好的书。

FPGA在高端领域用得多,什么是高端领域前面介绍的时候已经有说,工业机器人、图像处理等。有机会可以去大厂走一遭(大厂也有容易进的),接触一些一般在一般公司接触不到的东西,可以刷新我们的认知。大厂的特点就是有钱、任性,用的都是高端芯片。

之前的公司用的都是Altera的Cyclone V SoC FPGA芯片、TI的DSP28377、AM5728等高端芯片,有的项目甚至几块高端芯片一起上,但是并没有用到那么多的芯片资源。那时候发现STM32好low啊,但现在是真香,哈哈。

大家都知道我们做嵌入式的,要涉及的东西都很杂,在专注于一个方向的前提下多了解一些其它知识也是很有帮助的。关于FPGA相关的笔记我是写不动了,因为我这方面学得不多,也基本都忘了。

短时间内也不会去折腾这个东西了,因为与我现在的发展方向不符(我的方向是MCU->物联网、嵌入式Linux)。这里给大家推荐一位做FPGA的朋友(李肖遥)的公众号:

大家有兴趣的可以关注以下。号主是一位有七年工作经验的工程师,其公众号不仅仅分享FPGA相关的知识,也同样分享C/C++、Linux、QT等方面的技术文章。下面列举的是一些精选文章:

Linux 设备驱动

蜕变成蝶~Linux设备驱动之字符设备驱动

蜕变成蝶~Linux设备驱动中的并发控制

蜕变成蝶~Linux设备驱动中的阻塞和非阻塞I/O

蜕变成蝶~Linux设备驱动之异步通知和异步I/O

蜕变成蝶~Linux设备驱动之中断与定时器

蜕变成蝶~Linux设备驱动之CPU与内存和I/O

蜕变成蝶~Linux设备驱动之DMA

蜕变成蝶~Linux设备驱动之按键设备驱动

蜕变成蝶~Linux设备驱动之watchdog设备驱动

乾坤合一~Linux设备驱动之块设备驱动

乾坤合一~Linux设备驱动之终端设备驱动

乾坤合一~Linux设备驱动之I2C核心、总线以及设备驱动

乾坤合一~Linux设备驱动之USB主机和设备驱动

乾坤合一~Linux设备驱动之SD/MMC/SDIO驱动分析(上)

乾坤合一~Linux设备驱动之SD/MMC/SDIO驱动分析(下)

qt 进阶之路

Qt 学习笔记-强势入门

Qt 学习笔记-处理鼠标响应事件

Qt 学习笔记-Qt中添加背景图片的方法

Qt 学习笔记-中秋节,QPainter画一颗小心心送给你

期待已久,Qt for MCUs 1.0正式发布

Are you kidding me ? 在单片机(MCU)上运行Qt

为什么 qt 成为 c++ 界面编程的第一选择?

Qt 纯属娱乐-绘制一个模拟时钟

Qt 纯属娱乐-模拟一个导航定位系统

Qt 纯属娱乐-做一个类似微信滑动聊天界面demo

简诉我和 Qt 的故事以及发文方向

资料下载 | Qt 语言资料pdf 经典文档推荐

FPGA那些事儿

Vivado SDK 怎么添加函数?

Notepad++编辑器——Verilog、代码片段、直接编译

Zynq lwip怎么既可以接收又可以发送呢?

Zynq lwip不插网线初始化,断线重连,你解决了吗?

Zynq lwip中的TI,Marvell,Realtek,atheros的phy配置

FPGA 高手养成记-Verliog语法基础

FPGA 高手养成记-浅谈状态机

FPGA 高手养成记-Test bench文件结构一览无余

FPGA 高手养成记-【很重要】Testbenth前仿真全过程

FPGA 高手养成记-手把手解析时序逻辑乘法器代码

FPGA 高手养成记-串行口通信电路设计

FPGA 高手养成记-基于FIFO的串口发送机设计全流程

FPGA 高手养成记-i2c通信

程序人生vs疑难杂症

日本微软做四休三真的适合程序员吗

作为一名有追求的程序员,你双11最舍得花钱买的东西有哪些?

@程序员,你真TM需要培养一个兴趣爱好

对程序员来说,一份工作坚持多久跳槽最合适?

@程序员,说好不哭,你却哭的稀里哗啦

多大仇,这个离职证明大家怎么看?

为什么程序员下班后只关显示器从不关电脑?

优秀的程序员应该怎么度过国庆节呢?

程序员视角看手机计算器上为什么10%+10% != 0.2 ?

来瞅瞅 | 2019年最新编程语言排行榜

从【微软员工主动曝光薪资】来反思国内薪资普遍现状

推荐一款命令行利器 Windows Terminal (附安装教程,自定义超炫界面)

尝鲜!基于Chromium的Edge Beta版来了

杂谈

【编程之美】用C语言实现状态机(实用)

hello world 程序是如何被编译出来的?

C语言main函数有哪些写法呢

C/C++中条件编译#if、#elif、#ifdef等灵活妙用

C++中virtual关键字的用法

C++小游戏:扑克牌21点

const 指针与指向const的指针

队列及其实现

浅谈图(存储结构、遍历)

如果觉得文章不错,转发、在看,也是我们继续更新得动力。

(0)

相关推荐