|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
荐读:如何学习 FPGA / Y! o! @6 u+ S& A3 w m7 C
1 l7 X* F4 r$ `% ^) b- R% S' W) J- M, D3 w! u
大家好。又到了每日学习的时候了,近期很多人问我该如何去学FPGA,那么今天咱们就来聊一聊。 : K- N! C% T, Z9 I s3 }
4 ^# R4 r6 Z0 x x7 t, [/ L7 |
一、入门首先要掌握HDL(HDL=verilog+VHDL)。( I% M9 q6 R Q1 s$ Q
8 I5 s9 S1 k$ c4 K# Y# U0 m 第一句话是:还没学数电的先学数电。然后你可以选择verilog或者VHDL,有C语言基础的,建议选择VHDL。因为verilog太像C了,很容易混淆,最后你会发现,你花了大量时间去区分这两种语言,而不是在学习如何使用它。当然,你思维能转得过来,也可以选verilog,毕竟在国内verilog用得比较多。1 d% F- Q7 `" I4 J7 o* ]
" P% u) _0 F9 v1 ?9 n3 a' W7 z
接下来,首先找本实例抄代码。抄代码的意义在于熟悉语法规则和编译器(这里的编译器是硅编译器又叫综合器,常用的编译器有:Quartus、ISE、Vivado、Design Compiler 、Synopsys的VCS、iverilog、Lattice的Diamond、Microsemi/Actel的Libero、Synplify pro),然后再模仿着写,最后不看书也能写出来。编译完代码,就打开RTL图,看一下综合出来是什么样的电路。 }5 g G9 t7 y" K! N
8 b; o: M5 f0 ~) N$ I3 S& d _ HDL是硬件描述语言,突出硬件这一特点,所以要用数电的思维去思考HDL,而不是用C语言或者其它高级语言,如果不能理解这句话的,可以看《什么是硬件以及什么是软件》。在这一阶段,推荐的教材是《Verilog传奇》、《Verilog HDL高级数字设计》或者是《用于逻辑综合的VHDL》。不看书也能写出个三段式状态机就可以进入下一阶段了。4 u& l- K- B8 b( o% ^% B5 c
/ I) P |, E8 Q9 c! ?! Q
此外,你手上必须准备Verilog或者VHDL的官方文档,《verilog_IEEE官方标准手册-2005_IEEE_P1364》、《IEEE Standard VHDL Language_2008》,以便遇到一些语法问题的时候能查一下。: E$ A' d& X9 O+ `
4 g. V9 p0 _0 P( O 二、独立完成中小规模的数字电路设计。- J$ R1 A; J1 k- N! K) I4 Y" ?% v$ b
$ u( k: I5 Q2 Y" V, I& m 现在,你可以设计一些数字电路了,像交通灯、电子琴、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》。+ L& G8 R( B2 i1 S
% ~' O/ O0 O1 V4 f$ ^( L- c
三、掌握设计方法和设计原则。& W4 m, |/ f [/ {4 D
7 X$ z$ h7 D/ D+ O# r 你可能发现你综合出来的电路尽管没错,但有很多警告。这个时候,你得学会同步设计原则、优化电路,是速度优先还是面积优先,时钟树应该怎样设计,怎样同步两个异频时钟等等。推荐的教材是《FPGA权威指南》、《IP核芯志-数字逻辑设计思想》、《Altera FPGA/cpld设计》第二版的基础篇和高级篇两本。学会加快编译速度(增量式编译、LogicLock),静态时序分析(timequest),嵌入式逻辑分析仪(signaltap)就算是通关了。如果有不懂的地方可以暂时跳过,因为这部分还需要足量的实践,才能有较深刻的理解。- t3 U8 B1 n m% g4 h6 z- E- c
r7 G, O. a' i: ` 四、学会提高开发效率。; G9 J6 [- X) l1 V3 Q R
6 n; ^! y! i) H" Z$ Q 因为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语法手册》。1 o, N7 \: _* |5 W
; T+ i9 s' C7 s6 r$ { x
掌握了TCL/TK之后,可以学习虚拟Jtag(ISE也有类似的工具)制作属于自己的调试工具,此外,有时间的话,最好再学个python。脚本,意味着一劳永逸。 B. k- x2 N: M+ v
1 K. D! P5 L& g4 c! f; o, b 五、增强理论基础。
; }: ~, i0 D- T0 b9 g) U, E R1 ]; R0 d% \) C- _; B
这个时候,你已经会使用FPGA了,但是还有很多事情做不了(比如,FIR滤波器、PID算法、OFDM等),因为理论没学好。我大概地分几个方向供大家参考,后面跟的是要掌握的理论课。
: g. b- G& p% R: V/ L$ Y( J( z7 L6 w1 m1 s/ L" L
1、信号处理——信号与系统、数字信号处理、数字图像处理、现代数字信号处理、盲信号处理、自适应滤波器原理、雷达信号处理
4 @2 N& U! T5 M v, X- t! ~$ r4 w% L2 Y- D" O
2、接口应用——如:UART、SPI、IIC、USB、CAN、PCIE、Rapid IO、DDR、TCP/IP、SPI4.2(10G以太网接口)、SATA、光纤、DisplayPort
; q8 q) j9 E. [( j& m& d6 R. L% d( @! c8 {" `6 ~
3、无线通信——信号与系统、数字信号处理、通信原理、移动通信基础、随机过程、信息论与编码; o' ^ Y, @( m
3 t" a+ Z9 r. Q1 G+ F$ o
4、CPU设计——计算机组成原理、单片机、计算机体系结构、编译原理% `- a* X2 x& u, [1 j. d, [
* L8 G" @9 O; \4 V5 g 5、仪器仪表——模拟电子技术、高频电子线路、电子测量技术、智能仪器原理及应用
( d$ h/ I1 A2 a5 e8 {4 ?0 e0 r/ K% g7 I0 M; s$ [5 ~3 l
6、控制系统——自动控制原理、现代控制理论、过程控制工程、模糊控制器理论与应用( ?& \" ?! O' T. X k+ e
" q% L7 r) o+ A
7、压缩、编码、加密——数论、抽象代数、现代编码技术、信息论与编码、数据压缩导论、应用密码学、音频信息处理技术、数字视频编码技术原理
$ d6 T6 |7 V2 @. U* I' S
3 H1 R- i3 Y7 Z 现在你发现,原来FPGA会涉及到那么多知识,你可以选一个感兴趣的方向,但是工作中很有可能用到其中几个方向的知识,所以理论还是学得越多越好。如果你要更上一层,数学和英语是不可避免的。5 b1 K# \5 u% b0 w. n
3 M0 S% X% H& @, j 六、学会使用MATLAB仿真。
) W+ X+ p' I/ E, y3 C! G3 T. @ j3 u8 i3 [# C' ?
设计FPGA算法的时候,多多少少都会用到MATLAB,比如CRC的系数矩阵、数字滤波器系数、各种表格和文本处理等。此外,MATLAB还能用于调试HDL(用MATLAB的计算结果跟用HDL算出来的一步步对照,可以知道哪里出问题)。推荐的教材是《MATLAB宝典》和杜勇的《数字滤波器的MATLAB与FPGA实现》。
) T! i% {! d- D# q2 Z2 M1 W* ]) m5 i5 f
七、足量的实践。
" \/ ]8 ?' [/ t, K9 _8 A3 V' a, o: m+ q3 S
这个时候你至少读过几遍芯片手册(官网有),然后可以针对自己的方向,做一定量的实践了(期间要保持良好的代码风格,增加元件例化语句的可读性,绘制流程图/时序图,撰写文档的习惯)。比如:通信类的可以做调制解调算法,仪表类的可以做总线分析仪等等。不过这些算法,在书上只是给了个公式、框图而已,跟实际的差距很大,你甚至会觉得书上的东西都很肤浅。那么,你可以在知网、百度文库、EETOP论坛、opencores、ChinaAET、Q群共享、博客上面找些相关资料(校外的朋友可以在淘宝买个知网账号)。其实,当你到了这个阶段,你已经达到了职业级水平,有空就多了解一些前沿技术,这将有助于你的职业规划。/ ]% G1 z( z! R) W0 O. b: O9 ~
8 B( D7 F) x* U% e6 {
在工作当中,或许你需要关注很多协议和行业标准,协议可以在EETOP上面找到,而标准(如:国家标准GB和GB/T,国际标准ISO)就推荐《标准网》和《标准分享网》。. l$ e& T1 c, k" B( ] Y9 I1 O& N9 R
9 s! {7 ], M. i2 }2 ?! J% I/ u
八、图像处理。(这部分只写给想学图像处理的朋友,也是由浅入深的路线)! X1 F) x. o+ u: Z
; ^& l. C/ i4 ?2 ^: `/ g; u
1、Photoshop。花一、两周的时间学习PS,对图像处理有个大概的了解,知道各种图片格式、直方图、色相、通道、滤镜、拼接等基本概念,并能使用它。这部分是0基础,目的让大家对图像处理有个感性的认识,而不是一上来就各种各样的公式推导。推荐《Photoshop CS6完全自学教程》。# V' k* e( \1 r2 Z
! E& q( r& N# F a; e2 y( x 2、基于MATLAB或OpenCV的图像处理。有C/C++基础的可以学习OpenCV,否则的话,建议学MATLAB。这个阶段下,只要学会简单的调用函数即可,暂时不用深究实现的细节。推荐《数字图像处理matlab版》、《学习OpenCV》。! d7 t9 l- W+ R6 Q& W+ M: A
% ?# y( T. V% m: {- b1 n. }' N 3、图像处理的基础理论。这部分的理论是需要高数、复变、线性代数、信号与系统、数字信号处理等基础,基础不好的话,建议先补补基础再来。看不懂的理论也可以暂时先放下,或许学到后面就自然而然地开窍了。推荐《数字图像处理》。
- e6 } L8 q& ~" ]7 i) b
" W1 }+ j7 H' s* P" s$ q9 R; p+ Y: Y 4、基于FPGA的图像处理。把前面学到的理论运用到FPGA上面,如果这时你有前面第七个阶段的水平,你将轻松地独立完成图像算法设计(图像处理是离不开接口的,上面第五个阶段有讲)。推荐《基于FPGA的嵌入式图像处理系统设计》、《基于FPGA的数字图像处理原理及应用》。" w( v8 _( ]+ O/ B4 @- }% n& m
; O9 l( h' y4 o7 E# @% [* L6 W 5、进一步钻研数学。要在算法上更上一层,必然需要更多的数学,所以这里建议学习实分析、泛涵分析、小波分析等。
5 u9 Z* A0 x' B: b a t# H4 _
$ R$ D6 E6 c9 Z. m 下面这两个阶段是给感兴趣的朋友介绍的。8 y& v- l2 g% Q! @7 V; Y8 ?6 F u
! @ E, f: N2 _1 C 九、数电的尽头是模电。1 ]0 r3 y* t3 M0 `% W7 f1 [
2 J2 ^# p+ R% c& q4 w( `5 u 现在FPGA内部的事情是难不到你的,但是信号出了FPGA,你就没法控制了。这个时候必须学好模电。比如:电路分析、模拟电子技术、高频电子线路、PCB设计、EMC、SI、PI等等,能设计出一块带两片DDR3的FPGA开发板,就算通关了。具体的学习路线可以参考本博客的《如何学习硬件设计——理论篇》和《如何学习硬件设计——实践篇》。* t) S+ S% f" i/ }
% j t) O! e* h2 M
十、学无止境。% P: W D5 n3 n1 L; q9 G) o
; s: W* k, G$ o5 m k0 t 能到这个境界,说明你已经很厉害了,但是还有很多东西要学的,因为FPGA常常要跟CPU交互,也就是说你得经常跟软件工程师交流,所以也得懂点软件方面的知识。比如ARM(Xilinx的ZYNQ和Altera的SOC会用到ARM的硬核,请参考本博客的《如何学习嵌入式软件》)、DSP、Linux、安卓、上位机(QT、C#、JAVA)都可以学一下,反正学无止境的。
" b; u4 B+ i2 [
# k/ \: z1 P5 k' T' e( q 十一、其它问题。3 T4 u7 b9 Y J. [0 _' p8 {5 E
9 f( K% U3 @+ }) e! `& N, }3 S
a、为什么不推荐学习NIOS II和MicroBlaze等软核?
6 ]9 b* o; s4 Z
1 n+ F" ?; C9 \9 K+ \
5 n9 f+ @5 [- j X, | 1、性价比不高,一般的软核性能大概跟Cortex M3或M4差不多,用FPGA那么贵的东西去做一个性能一般的CPU,在工程上是非常不划算的。不如另外加一块M3。
/ v+ c l; n+ \ b1 T! g6 `+ N5 T
2、加上软核,可能会影响到其它的逻辑的功能。这是在资源并不十分充足的情况下,再加上软核,导致布局布线变得相当困难。1 A" ^! N% `1 s# ^
h. {: W9 l9 M3 M, F" D
3、软核不开源,出现Bug的时候,不容易调试。. W2 s+ D' Q6 C1 B+ Q# \0 o& z* y: r
6 w2 n( f; H3 G; w+ M; T 4、工程上很少使用,极有可能派不上用场。
. b* t% Q, c3 t# J. g
- n& j7 n2 V- i: ]5 Q tb、为什么不推荐0基础学习ZYNQ或SOC?: X2 i; F( W( }9 m k' q" k
! b) f; c- U W 1、容易让人有傍同心理。傍同心理是指一个人通过渲染与自己有亲近关系的人的杰出,来掩盖和弥补自己在这方面的不足,从而获得心理上的平衡。自己在学习很厉害的东西,然后也感觉自己很厉害,但这只是错觉而已。
2 c Z% b, i( {6 E, Z6 L7 H1 z% t
3 d& N$ X3 f, v: J3 b: t0 x: J" l 2、入门应该学习尽量简单的东西,要么专心学习ARM,要么专心学习FPGA。这样更容易有成就感,增强信心。
- F- t" [. w( ~2 k3 g! {! c) [5 N4 p, i6 u
3、ZYNQ和SOC的应用领域并不广,还有很多人没听过这种东西,导致求职的不利。( e3 Y% q3 \3 i' g7 e# R
( S m9 I- v* d0 F 4、开发工具编译时间长,浪费较多时间。
! e9 a+ O! {! o$ G D
" V' K" ~0 ^+ X& e4 f# E0 J/ \5 P 5、绝大多数工作,都只是负责一方面,也就是说另一方面,很有可能派不上用场。/ k; a* n4 {4 ]" o
+ s4 L' m* y; }7 @c、为什么已经存在那么多IP核,仍然需要写HDL?
7 u) w J: t/ q
( Y7 _7 ?1 b2 w7 ^& r( L 1、问这种问题的,一般是学生,他们没有做过产品,没有遇到过工程上的问题。! @; T& o* m. s% L# t7 J7 q
3 E. w8 S- @# E 2、IP核并非万能,不能满足所有需求。
$ m% [# @8 L* r& H4 C9 _: K
3 P0 |! ]8 `; c4 Q& p0 r% N. @ 3、尽量少用闭源IP核,一旦出问题,这种黑匣子很可能让产品难产。' h+ l; e/ R5 K9 D) L
* S+ ?7 ]/ j& a5 c% `- r& `
4、深入理解底一层次,可以更好地使用高一层次。该法则可以适用于所有编程语言。 |
|