资讯详情

如何零基础入门FPGA?这篇文章让你吃透!

只有在脑海中建立逻辑模型,才能理解FPGA只有实现内部逻辑结构的基础才能理解为什么要写Verilog和写C为了理解顺序执行语言和并行执行语言设计方法的差异,整体思路是不同的。当你看到一个简单的程序时,你应该考虑什么样的功能电路。

学习FPGA逻辑思维不仅非常重要,而且良好的数学思维也可以简化你的设计,所以啊,那些看到高数字头痛的童鞋需要注意这门课。例如,有两个32bit的数据X[31:0]与Y[31:0]相乘。

当然,无论Altera还是Xilinx都有现成的乘法器IP核可以调用,这也是最简单的方法,但两个32bit乘法器将消耗大量资源。那么,有没有不太复杂的方法来节约资源呢?我们可以稍微修改一下:

将X[31部分[31:0]X1[15:0]和X2[15:0],令X1[15:0]=X[31:16],X2[15:0]=X[15:0],则X1左移16位后与X2可以得到相加X;同样将Y[31部分[31:0]Y1[15:0]和Y2[15:0]Y1[15:0]=Y[31:16],Y2[15:0]=Y[15:0],则Y1左移16位后与Y2可以得到相加Y,则X与Y相乘可转化为X1和X2 分别与Y1和Y这样的32相乘bit*32bit乘法转换为四个16bit*16bit三个32bit加法操作。转换后占用的资源会减少很多,有兴趣的童鞋,不妨综合一下,看看两者的区别。

时钟是时序电路的控制器这句话太经典了,可以说是FPGA圣言的设计。FPGA设计以时序电路为主,因为无论组合逻辑电路多么复杂,都不能改变太多的模式,也不难理解。

然而,时间序列电路是不同的。它的所有动作都是由时钟的节奏变化引发的。可以说,时钟是整个电路的控制器。如果控制不好,电路功能就会混乱。

打个比方,时钟就相当于人体的心脏,它每一次的跳动就是触发一个 CLK,向身体各器官供血,维持身体的正常运转。组织细胞的组成是每个器官身体正常工作所必需的,因此触发器可以与基本单元组织细胞进行比较。

时序逻辑电路的时钟是控制时序逻辑电路状态转换的发动机

由于时间逻辑电路主要使用触发器来存储电路的状态,而触发器状态的变化需要时钟的上升或下降边缘,这表明时钟在时间电路中的核心作用。

最后,让我们简单地谈谈经验。综上所述,我们应该多练习,多思考,多问问题。产生真正的知识。最好自己练习别人100次的计划。一方面,实践的动机来自兴趣和压力。如果有需求,很容易形成压力,也就是说,最好在实际的项目开发中锻炼,而不是学习。

不熟悉FPGA的内部结构

FPGA为什么可以编程?

恐怕很多初学者不知道,也不想知道。

因为他们认为这无关紧要。他们潜意识地认为可编程就像写软件。

软件编程的思想根深蒂固。Verilog或者VHDL就像看到C语言或其他软件编程语言相同。逐一阅读,逐一分析。

拒绝去理解为什么FPGA可以编程,不懂FPGA如果你想学习内部结构,你想学习FPGA 恐怕是天方夜谭。

那么FPGA为什么可以编程?先来看看什么是程。

启示 程只是一堆具有一定意义的01编码。

编程实际上是编写这些01编码。但是我们现在有很多开发工具来操作或其他操作。

因此,软件是一个接一个的,通常不是直接编写这些01编码,而是以高级语言的形式编写,最终从开发工具转换为01编码。

对于软件编程,处理器将有一个特殊的编码电路将这些01编码逐个翻译成各种控制信号,然后控制其内部电路逐个读取,因为软件操作是逐步完成的。

而FPGA的可编程,本质也是依靠这些01编码实现其功能的改变,但不同的是FPGA之所以能完成不同的功能,不是因为像软件一样翻译01编码来控制一个操作电路,FPGA里面没有这样的东西。

FPGA内部主要有三个部分:可编程逻辑单元、可编程连接和可编程IO模块。

某种存储器的基本结构(SRAM、 FLASH等)制作的4输入或6输入1输出地真值表加上一个D由触发器组成。

任何4输入1输出组合逻辑电路都有相应的真值表。同样,如果使用此存储器制作的4输入1输出地的真值表,则只需修改其真值表的内部值,即可等效任何4输入1输出的组合逻辑。这些真值表的内部值是01编码。

如果要实现时序逻辑电路怎么办?任何时序逻辑都可以转换为组合逻辑 D触发器完成。但毕竟只实现了4输入1输出的逻辑电路,逻辑电路的规模通常相当大。

那我该怎么办呢?此时,需要使用可编程连接器。这些连接器上有许多由存储器控制的链接点。通过重写相应存储器的值,可以确定哪些线连接,哪些线断开。这可以将许多可编程逻辑单元组合起来,形成一个大型逻辑电路。

任何芯片都必须有输入引脚和输出引脚。IO可任意定义非专用引脚(FPGA有专门的非用户测试,下载引脚)输入或输出,也可以IO设置电平标准。

总是一句话,FPGA可编程的原因是它可以通过特殊的01代码制作成 真值表,并将这些真值表结合起来,实现大规模的逻辑功能。

不了解FPGA内部结构无法理解最终代码是如何变换的FPGA如果你去里面,你就不能深入了解如何充分利用它FPGA。现在的FPGA,不仅有前面提到的三个部分,还有许多特殊的硬件功能单元。如何充分利用这些单元来实现复杂的逻辑电路设计是从新手到大师必须克服的障碍。所有这些,或者必须首先理解FPGA内部逻辑及其工作原理。

HDL语言的英语全称是:Hardware Deion Language,注意这个词Deion,而不是Design。为什么外国人要用?Deion而不是这个词Design呢?因为HDL它不是用来设计硬件的,只是用来描述硬件的。

描述这个词准确地反映了HDL语言的本质,HDL语言只是已知硬件电路的文本表达,只是以文本的形式描述未来的电路。在编写语言之前,硬件电路应该已经设计好了。语言只是将这种设计转化为文本表达。

硬件设计也有不同的抽象层次,每个层次都需要设计。最高抽象级为算法级,其次是系统结构级、寄存器传输级、门级和物理级。

使用HDL优点是我们设计了一个寄存器传输电路,所以使用HDL描述后转换为文本形式,其余的可以转换为更低层次EDA工具已经完成,大大降低了工作量。这是一个全面的概念,也就是说,在这个抽象层面上,可以描述硬件单元EDA将工具理解并转换为底部的门级电路或其它结构。

在FPGA在设计中,这种抽象层次的意见被描述为HDL语言,可以通过FPGA开发软件转化为上一点所述FPGA实现形式的内部逻辑功能。

HDL也可以描述算法级或系统结构级等更高的抽象级,但目前受到限制EDA软件开发,EDA软件无法理解如此高的抽象水平,因此HDL描述这种抽象水平不能转化为较低的抽象水平,这就是所谓的不可整合。

所以在阅读或写作中HDL语言,尤其是综合语言HDL,不应该看到的是语言本身,而应该看到语言背后相应的硬件电路结构。

FPGA谁用?许多学校用于学习微电子或集成电路设计的学生。事实上,这只是许多学校受资金限制,买不起专业的集成电路设计工具FPGA只是工具工具FPGA用于设计电子系统的工程师。

这些工程师通常使用现有的芯片来完成电子设备,如基站、机顶盒、视频监控设备等。当现有芯片不能满足系统的需要时,就需要使用FPGA快速定义一个可用的芯片。

前面说了,FPGA电子系统工程师不能使用一些真值表、触发器、各种连接和一些硬件资源FPGA设计无非是考虑如何将这些未来资源结合起来,实现一定的逻辑功能,而不是像IC设计工程师总是关注最终芯片是否可以制造。

本质上,它与使用现有芯片组合成不同的电子系统没有什么不同,关注更底层的资源。

要想把FPGA它仍然很容易使用,因为它只不过是那些资源,理解前两点,然后做一个实验板,运行实验,做一些简单的事情。

而真正要把FPGA用得好,那光懂点FPGA知识远远不够。因为最们最终必须让它走。FPGA如何组合内部资源,实现什么功能来满足系统的需要,需要了解更多、更广泛的知识。

无论是FPGA的哪个方向,都离不开数字逻辑知识的支撑。FPGA说白了是一种实现数字逻辑的方式而已。如果连最基本的数字逻辑的知识都有问题,学习FPGA的愿望只是空中楼阁而已。数字逻辑是任何电子电气类专业的专业基础知识,也是必须要学好的一门课。

如果不能将数字逻辑知识烂熟于心,养成良好的设计习惯,学FPGA到最后仍然是雾里看花水中望月,始终是一场空的。

以上几条只是我目前总结菜鸟们在学习FPGA时所最容易跑偏的地方,FPGA的学习其实就像学习围棋一样,学会如何在棋盘上落子很容易,成为一位高手却是难上加难。要真成为李昌镐那样的神一般的选手,除了靠刻苦专研,恐怕还确实得要一点天赋。

第一句话是:还没学数电的先学数电。然后你可以选择verilog或者VHDL,有C语言基础的,建议选择VHDL。因为verilog太像C了,很容易混淆,最后你会发现,你花了大量时间去区分这两种语言,而不是在学习如何使用它。当然,你思维能转得过来,也可以选verilog,毕竟在国内verilog用得比较多。

接下来,首先找本实例抄代码。

抄代码的意义在于熟悉语法规则和编译器(这里的编译器是硅编译器又叫综合器,常用的编译器有:

Quartus、ISE、Vivado、Design Compiler 、Synopsys的VCS、iverilog、Lattice的Diamond、Microsemi/Actel的Libero、Synplify pro),然后再模仿着写,最后不看书也能写出来。

编译完代码,就打开RTL图,看一下综合出来是什么样的电路。

HDL是硬件描述语言,突出硬件这一特点,所以要用数电的思维去思考HDL,而不是用C语言或者其它高级语言,如果不能理解这句话的,可以看《什么是硬件以及什么是软件》。

在这一阶段,推荐的教材是《Verilog传奇》、《Verilog HDL高级数字设计》或者是《用于逻辑综合的VHDL》。不看书也能写出个三段式状态机就可以进入下一阶段了。

此外,你手上必须准备Verilog或者VHDL的官方文档,《verilog_IEEE官方标准手册-2005_IEEE_P1364》、《IEEE Standard VHDL Language_2008》,以便遇到一些语法问题的时候能查一下。

现在,你可以设计一些数字电路了,像交通灯、电子琴、DDS等等,推荐的教材是夏老《Verilog 数字系统设计教程》(第三版)。在这一阶段,你要做到的是:给你一个指标要求或者时序图,你能用HDL设计电路去实现它。这里你需要一块开发板,可以选Altera的cyclone IV系列,或者Xilinx的Spantan 6。

还没掌握HDL之前千万不要买开发板,因为你买回来也没用。这里你没必要每次编译通过就下载代码,咱们用modelsim仿真(此外还有QuestaSim、NC verilog、Diamond的Active-HDL、VCS、Debussy/Verdi等仿真工具),如果仿真都不能通过那就不用下载了,肯定不行的。

在这里先掌握简单的testbench就可以了。推荐的教材是《WRITING TESTBENCHES Functional Verification of HDL Models》。

你可能发现你综合出来的电路尽管没错,但有很多警告。这个时候,你得学会同步设计原则、优化电路,是速度优先还是面积优先,时钟树应该怎样设计,怎样同步两个异频时钟等等。

推荐的教材是《FPGA权威指南》、《IP核芯志-数字逻辑设计思想》、《Altera FPGA/CPLD设计》第二版的基础篇和高级篇两本。学会加快编译速度(增量式编译、LogicLock),静态时序分析(timequest),嵌入式逻辑分析仪(signaltap)就算是通关了。如果有不懂的地方可以暂时跳过,因为这部分还需要足量的实践,才能有较深刻的理解。

因为Quartus和ISE的编辑器功能太弱,影响了开发效率。所以建议使用Sublime text编辑器中代码片段的功能,以减少重复性劳动。Modelsim也是常用的仿真工具,学会TCL/TK以编写适合自己的DO文件,使得仿真变得自动化,推荐的教材是《TCL/TK入门经典》。

你可能会手动备份代码,但是专业人士都是用版本控制器的,所以,为了提高工作效率,必须掌握GIT。

文件比较器Beyond Compare也是个比较常用的工具。此外,你也可以使用System Verilog来替代testbench,这样效率会更高一些。如果你是做IC验证的,就必须掌握System Verilog和验证方法学(UVM)。推荐的教材是《Writing Testbenches using SystemVerilog》、《The UVM Primer》、《System Verilog1800-2012语法手册》。

掌握了TCL/TK之后,可以学习虚拟Jtag(ISE也有类似的工具)制作属于自己的调试工具,此外,有时间的话,最好再学个python。脚本,意味着一劳永逸。

这个时候,你已经会使用FPGA了,但是还有很多事情做不了(比如,FIR滤波器、PID算法、OFDM等),因为理论没学好。我大概地分几个方向供大家参考,后面跟的是要掌握的理论课。

  • 信号处理 —— 信号与系统、数字信号处理、数字图像处理、现代数字信号处理、盲信号处理、自适应滤波器原理、雷达信号处理

  • 接口应用 —— 如:UART、SPI、IIC、USB、CAN、PCIE、Rapid IO、DDR、TCP/IP、SPI4.2(10G以太网接口)、SATA、光纤、DisplayPort

  • 无线通信 —— 信号与系统、数字信号处理、通信原理、移动通信基础、随机过程、信息论与编码

  • CPU设计 —— 计算机组成原理、单片机、计算机体系结构、编译原理

  • 仪器仪表 —— 模拟电子技术、高频电子线路、电子测量技术、智能仪器原理及应用

  • 控制系统 —— 自动控制原理、现代控制理论、过程控制工程、模糊控制器理论与应用

  • 压缩、编码、加密 —— 数论、抽象代数、现代编码技术、信息论与编码、数据压缩导论、应用密码学、音频信息处理技术、数字视频编码技术原理

现在你发现,原来FPGA会涉及到那么多知识,你可以选一个感兴趣的方向,但是工作中很有可能用到其中几个方向的知识,所以理论还是学得越多越好。如果你要更上一层,数学和英语是不可避免的。

设计FPGA算法的时候,多多少少都会用到MATLAB,比如CRC的系数矩阵、数字滤波器系数、各种表格和文本处理等。

此外,MATLAB还能用于调试HDL(用MATLAB的计算结果跟用HDL算出来的一步步对照,可以知道哪里出问题)。推荐的教材是《MATLAB宝典》和杜勇的《数字滤波器的MATLAB与FPGA实现》。

Photoshop

花一、两周的时间学习PS,对图像处理有个大概的了解,知道各种图片格式、直方图、色相、通道、滤镜、拼接等基本概念,并能使用它。这部分是0基础,目的让大家对图像处理有个感性的认识,而不是一上来就各种各样的公式推导。推荐《Photoshop CS6完全自学教程》。

基于MATLAB或OpenCV的图像处理

有C/C++基础的可以学习OpenCV,否则的话,建议学MATLAB。这个阶段下,只要学会简单的调用函数即可,暂时不用深究实现的细节。推荐《数字图像处理matlab版》、《学习OpenCV》。

图像处理的基础理论

这部分的理论是需要高数、复变、线性代数、信号与系统、数字信号处理等基础,基础不好的话,建议先补补基础再来。看不懂的理论也可以暂时先放下,或许学到后面就自然而然地开窍了。推荐《数字图像处理》。

基于FPGA的图像处理

把前面学到的理论运用到FPGA上面,如果这时你有前面第七个阶段的水平,你将轻松地独立完成图像算法设计(图像处理是离不开接口的,上面第五个阶段有讲)。推荐《基于FPGA的嵌入式图像处理系统设计》、《基于FPGA的数字图像处理原理及应用》。

进一步钻研数学。要在算法上更上一层,必然需要更多的数学,所以这里建议学习实分析、泛涵分析、小波分析等。

性价比不高,一般的软核性能大概跟Cortex M3或M4差不多,用FPGA那么贵的东西去做一个性能一般的CPU,在工程上是非常不划算的。不如另外加一块M3。

加上软核,可能会影响到其它的逻辑的功能。这是在资源并不十分充足的情况下,再加上软核,导致布局布线变得相当困难。软核不开源,出现Bug的时候,不容易调试。工程上很少使用,极有可能派不上用场。

入门应该学习尽量简单的东西,要么专心学习ARM,要么专心学习FPGA。这样更容易有成就感,增强信心。

ZYNQ和SOC的应用领域并不广,还有很多人没听过这种东西,导致求职的不利。开发工具编译时间长,浪费较多时间。绝大多数工作,都只是负责一方面,也就是说另一方面,很有可能派不上用场。

问这种问题的,一般是学生,他们没有做过产品,没有遇到过工程上的问题。IP核并非万能,不能满足所有需求。尽量少用闭源IP核,一旦出问题,这种黑匣子很可能让产品难产。

深入理解底一层次,可以更好地使用高一层次。该法则可以适用于所有编程语言。


往期推荐:点击图片即可跳转阅读

32bcd2def35fd73a2182d8a20bc02bcc.png

谁能教教我怎么学单片机,怎么入门?

dc3e902aa192a3d48ce89c708e3f79cc.png

什么是PWM“死区”?

274438840da8898666df4303d8b62e1a.png

平衡小车PID,就该这么调!!!

fa6237102f270adb249ea832b5ea9daa.png

绝了!电容这样理解真的简单!

标签: 三电平的支撑电容

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台