找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 1070|回复: 2
打印 上一主题 下一主题

玩转FPGA_ALTERA王欣

[复制链接]

4

主题

43

帖子

913

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
913
跳转到指定楼层
1#
发表于 2014-6-16 10:59 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您!

您需要 登录 才可以下载或查看,没有帐号?注册

x
FPGA是可以玩的,有了这种心态,你的设计过程就会变得不那么枯燥乏味了。作一个合格的玩家,你要知道的东西还真不少,但是放轻松,其实这一切也没那么难!Altera的工程师王欣写下了一系列关于如何玩FPGA的文章,目的不是在教会别人如何设计和使用FPGA,这些你可以去看datasheet,而是让你在工作之中也能感受一些轻松和愉快!% y$ }* R8 [+ }3 B; d1 j

+ c: S) m0 E! c% r------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------9 w0 A/ h" y+ ~  u
玩转FPGA(作者 王欣)
* f, g+ e2 y$ m% E1 [2 Y4 o
2 F' K" v8 }: b4 e1 i, ?: p前言* w  E+ G4 i# }; y& I" _

/ z7 v$ w: v, q/ v5 s* z0 y8 A& T一直以来都想写点什么,关于FPGA设计,因为有点不太服气。为什么同样是设计,有些人可以好像玩一样的摆弄,photoshop,很时尚,很跩。有些人可以用所谓的广告创意玩弄人们的智商。而硬件工程师则一律的被人以为呆板没有创意。我是说,为什么我们不可以享受设计本身的乐趣,发挥我们自己的创意,为什么就不可以很随心所欲的摆弄我们手里的那些玩具到处炫耀,让美女们看着我们的眼睛都发光?难道一定就是那些冷冰冰的Datasheet, 死板的Schedule, 老板的猪肝脸?所以我写这些东西的目的,就是想让大家可以和我一起起来,玩转FPGA。所以大家千万别抱着学习的态度来看。看累了,不如去打打游戏,看烦了,不如自己去试着做几个项目玩玩。$ X6 i9 P1 h6 P

4 B3 w( n4 t4 k* v* _% wFPGA是可以玩的,而设计FPGA的工具也是很好玩的,为什么?我们先了解一下我们的玩具。
; }4 E( p% x% Z3 S3 s/ y
  }. i) l( }  W和所有的玩具一样,这款玩具也有它的适合玩家。你如果有一些准备,你可以玩得更开心些。首先是语言,你需要至少知道一样设计方式吧。Verilog 或者VHDL.我个人比较喜欢Verilog,不过这并不重要。不会?那会画电路图也可以啊。或者呢,会用Simulink搭个模型什么的也可以。如果会写一点C,恐怕就更好了。5 A6 W& K& |, ]# |! D) R

* F2 K# X: j& _, w2 [# d5 b那么什么是FPGA (已经知道的朋友尽可以跳过去不看)。想知道学名,去查一下字典,想知道他的历史,去问一下你的教授。我不说这些,因为我们的目的,就是玩。你应该知道芯片吧。对,好像因特尔的CPU,还有AMD。好像德州仪器的DSP。还有ASIC, ASSP, 反正现在这个世界,没有芯片你恐怕活不下去。而学电子的,如果不知道芯片,那也不用活了。还有一样东西,你一定也知道,就是CD-RW, DVD-RW.反复可擦写光盘。而FPGA就是反复可擦写的芯片。这样你就知道他能有多好玩了,是否还记得第一次拿到CD-RW的时候那种惊喜的感觉?想放什么就放什么,想做什么就做什么。你拿到的这东西就是一片巨大的空白,就看玩家怎么往里面塞东西了。 因为他已经是现成的半成品,完全不需要去等待漫长的流片时间,你就可以看到你的设计在板上实现。这就是为什么这个玩具,它可以玩,而且因为是数字电路,所以随便你怎么玩,只要你不插错电源,都可以。不会着火的安全玩具。
- b  f) j3 I" F, |6 r9 S$ O4 I
; _; ]$ J2 q; Z' V3 ~% e3 L下面一个问题是,为什么要玩FPGA。FPGA一开始是一种附属的玩具,主要的玩具是ASIC。人们为了验证ASIC设计的功能,往往用FPGA来测试。因为他不需要漫长的制造时间。就好像看看这个小孩子长什么样吧,也就知道他长大了大概是什么样子。但是现在这个小孩子居然也慢慢长大了。他开始普遍的被用在非常多的产品里面。首先一个原因是价格。现在的工艺水平是越来越高,这当然是好事情,但是坏事情是,也变得越来越贵。可以想象啊,线宽越来越窄,不是需要更厉害一点的放大镜吗?而这种高工艺导致的高价格是很多产量并不大的ASIC无法承受。而FPGA作为一个通用的器件呢,它完全可以去追求最新最好的工艺,而让它的买家一起分摊它的成本。它是目前芯片业拥有利润空间最大的一个分支。可以想象,如果有一天,FPGA公司把这块利润释放出来,对ASIC,ASSP设计公司的打击是致命的。第二个原因,就是他可以玩,可以反复擦写。玩这个,比玩ASIC要快很多,产品可以早点卖出去。另外如果有一天,你又想出了更好的玩法,你完全可以去把你已经卖给别人的东西换掉,变成更好的东西。而如果这个时候你面对的是你设计的ASIC,你只好哭吧。第三个原因,就好像广告里面说的:方~~~~~便。" D. Z7 J: S: [4 K3 z$ R
" J! s& q1 G3 T
再来看看这套玩具里面有些什么.首先是硬件,各种款式的FPGA芯片,各种应用的开发板。根据各自己不同的玩法,选择,拼接各种不同的产品系列。如果现成的不够用了,完全可以自己做一块。然后是工具。QuartusII,这是一个魔盒,它就好像photoshop一样,可以把你原本看上去有点尴尬的照片,变成美轮美奂的艺术品。NiosII,嵌入式CPU,是的,你没听错,就是CPU,而且是你想放多少就可以放多少的CPU。还不过瘾?那看看DSPbuilder吧(这是我的至爱)。帮你把Simulink模型算法变成最终硬件的工具。是的,你完全不需要写一行代码。
) |% ^: ]! H% E( l  v
& [4 l% p. a# F9 |! p* m( X' p好了,不要摩拳擦掌了,开始玩吧。
! Z" Y( W7 k0 x8 f/ c
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏1 支持!支持! 反对!反对!

4

主题

43

帖子

913

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
913
2#
 楼主| 发表于 2014-6-18 14:41 | 只看该作者
玩转FPGA (作者 王欣)
$ W  ?, J$ O+ S8 q1 O- F( F+ _" q/ ^0 `# ^5 W; k
关于QuartusII的一些事情1 Y8 g5 T  i/ Q( M8 i, y

) _8 v, G( a5 ^' T; J9 ~) sQuartusII其实就是一个转换器。一个把你理解的逻辑语言转换成为器件能理解的语言,然后可以让FPGA按照你的想法去工作。我们写的那些VHDL啦,Verilog啦什么的,其实都是人类自己定义的语言,对机器来说,就是对牛弹琴了,它没可能知道人类这些傻瓜坐在那里想做什么。所以为了交流,我们需要让他们理解我们的意图,而你也不至于因此而去学牛说话,所以,我们需要用QuartusII,因为QuartusII就是帮助你进行这种翻译的工具。
4 ?5 Z$ A: E+ a! E' Q7 s: m' z0 D: h: }$ c
我们分两部分来完成这么一件事情,首先把你的逻辑思路转变成用已经有的元件搭建出来的电路。好比你说我要一个加法,器件没你那么聪敏,他不知道什么叫做加法,加法对他来说是没有意义的。工具会把加法转换成为一组逻辑,用与,或,与非,或非这些乱七八糟的连在一起,变成和加法结果一样的电路。这样器件一看就知道了,哦,对了,我有这些的。当然这个时候你再去看那些东西,可能就蒙了。这个过程就是综合。综合结果是一个网表文件 (netlist),也就是一堆很无聊的电路。而这种电路还只是停留在概念上,并没有映射到实物上面。- U$ `: Z) b- A; z

4 b3 R! ^3 \" B) {然后工具会做第二件事情: fitting。QuartusII把你选择的器件找出来,对照它拥有的资源来放刚才转成的电路。FPGA里面的资源都是现成已经做好的,好处是你不需要做,坏处是,你也改不了。第一步首先是放置,就是把那些逻辑一个个放到器件的相应位置上。最后,把所有的放置好的点连接起来。这样,你的思想就在硬件上面完美的体现出来了。然后我们再回过来看看每个点都在做什么,把这些信息存成一个文件,以后你只需要每次告诉器件这个文件,就可以实现你的设计。/ J' X: B. ?5 U! }/ J% ~7 A8 r
- ?7 y8 N/ V/ F) [, C' d
这一切都不需要你来做,工具都可以自动完成,因为对器件世界的理解,工具比你要熟悉的多,所以你可以相信,他一定比你做的好。但是这样是不是太容易了呢?当然不会,否则就不好玩了,你需要指导工具去实现,因为很多事情是工具不晓得的,你需要告诉工具你的要求来实现你的设计。这就是约束。好像女孩子喜欢漂亮,当然不会随便穿戴,要点缀这里,束缚那里,让自己看上去至少很美。打扮没有约束,可能顶多就是难看点。但是翻译过程没有约束,就完全不是一个东西了。所以,约束很重要,后果很严重。你要告诉工具很多信息。比如:时钟信息,工具不可能聪明到知道你从外面送进来的时钟是多少的。比如管脚信息,你要告诉他哪些输入,哪些是输出,而这些输入输出分别应该是什么样子的。这些是最基本的信息,还可以提出一些更苛刻的要求出来。比如说功耗。QuartusII在完成编译以后会对编译的结果进行分析,看是不是能满足你的要求。如果不满足,它可以再试几次。最后告诉你:帅哥,按照你的要求,我们完成了工作了,或者说,小子,你的要求是在太过分了,我做不了。那么可能你得调整一下设计,代码,约束条件,甚至器件。! b: ]5 ?. q- J; m- j+ ?

; {1 m1 N, t, q+ N到此为止,其实QuartusII的工作已经可以说完成了。但如果只是这样,你一定会很郁闷,因为你并不知道你的设计是不是真的可以工作。或者说,你会想知道你的设计为什么不工作。 所以必须提供仿真和debug工具。QuartusII提供一个相对比较简单的仿真工具,让你可以通过画波形图的方式来做仿真。这种工具非常容易用,但是能力比较有限。他可以很直白的实现激励和观察输出波形的平台,但是他无法实现很好的交互能力。好比你需要因为一个信号而发动下一个动作时?你恐怕很难猜得出来什么时候这个信号就来了吧。所以很多时候,我们会比较喜欢用第三方工具ModelSim. 这个东西不好的地方就是你需要自己写仿真代码。你会发现这是一件蛮痛苦的事情,很多时候仿真代码比电路代码本身还要复杂。但是,真的没有办法,我很同情你,因为只有你才知道你想做什么,没有人能代替你来写仿真。
8 E, V, Z( d; D! J9 N& L/ e0 q/ u% F! \
仿真毕竟只是仿真而已,不是真的,很多时候你会发现电路还是不能工作,虽然仿真看上去完全没问题。千万不要太自信的以为这一定就是工具的bug,从而很兴高采烈的报告说,我找到你们一个bug。绝大多数的情况下,要么是因为你的约束有问题,要么是因为你的仿真和真实情况不符合。所以,QuartusII不得不提供一种途径,让你看到,芯片里面到底发生了一些什么事情,那就是在片debug工具,signaltapII。我知道名字不太好听,但是其实真的还蛮有用的。  r3 \* d6 j: u3 W+ F
$ B+ Y( e. {" h% P6 \/ I0 L+ {
QuartusII就是这样一个工具,很简单,但要玩得好,还是需要一点功夫的。后面我会比较细化的聊聊怎么玩这个东西。我不会很老土的说怎么创建一个工具,然后按这里,按那里。这些要你自己去玩,去摸索,否则,完全没有乐趣了。2 \6 b/ r/ j1 y+ U7 z8 c& h

7 X  i# y+ K1 s& C

4

主题

43

帖子

913

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
913
3#
 楼主| 发表于 2014-6-23 08:53 | 只看该作者
本帖最后由 lvsy 于 2014-6-23 09:05 编辑 5 E7 p" D* W5 D( X& z/ Z; U! I" u

8 `0 v; v- T7 T) B9 n3 J1 o" i玩转FPGA (作者 王欣)0 N2 l  H# {' t6 M: G3 q

5 N; \# r/ g* y% \( M: g$ h( w门规8 A1 l& O% C/ w. B' T8 G2 C
  v, Q& c, i! L8 m# X
1 p7 U1 B) y$ E+ C0 l% C4 [4 X& I, ^
我喜欢把寄存器比喻为门。所谓的电路就是由一堆这样的门包围着的。每个门都有一个相应的时钟来驱动,在相同间隔后,门将会打开。一些信号从一个门出来,经过一系列的变化(组合逻辑)变成一个新的信号,走到另一个门口,当门打开的时候,进入。这就是FPGA里面发生的一切。或许速度会快一些,或许情况会复杂一些,但是大体就是这么回事而已。而我们要保证的就是所有的信号都可以高高兴兴来,安安全全回去。不会迟到,也不会早退,更不会被门夹到,就万事大吉了。但是事情容易说不容易做,所以需要注意一些细节方面的问题。如果因为你把逻辑给做错了,那我们就不提了。而有些事情,即使你感觉一切都做得足够完美了,却还是没有结果。在这里提一些会有好处。
- @6 }5 g+ {* M/ f/ W5 c) [0 ` 5 r2 C; r" l1 \+ B% Z
门规之组合电路篇7 p/ L; v2 j: L3 ?4 }5 M# {
虽然我们要讨论的是门,但其实我们更关注的应该是门与门之间发生的一切。因为门的作用只是把阶段和另一个阶段分割开来,而更多的事情,其实是在这个阶段里面做的。门与门之间,或者门外面的,就都是这些组合电路了。组合电路最终影响了你的时钟能够飙到多快。9 O  e  u6 a3 `% D" l( p
, z9 j! ^; u3 l
1.        进来的时候,请随手关门4 v& H  ~: _* n" U' V) m
这是一个再简单不过的规则。在进来的时候,请关一下门。相信如果你呆在一个有一部分没有被包围在墙和门里面的房子里,一定很没安全感。尤其是在门外面的东西吧,你会整夜整夜的睡不着觉。所以进来的时候,最好可以随手关门,把自己包围在一个安全的环境里面。所以信号也是这样,信号是很敏感很没安全感的东西。所以,进来的时候最好被时钟打一下。这在FPGA设计中是非常重要的,尤其是复位信号。外部信号的触发事件是随机的,连它自己都不晓得什么时候那个reset键就被按了一下,加上进来以后的线路会有一点延迟,恰好在时钟触发的时候,前面一个信号被触发了,后一个信号恰好被门夹到。就好像指挥抬手的时候,钢琴开始弹奏了,小提琴手还在摆pose。 这样导致的结果就是大家不是同时开始工作。  A% A/ I' f3 F, m. {+ s6 K

7 ~: b$ J% J( ^8 ?门分很多种,材质不一样(时钟频率),大小不一样(时钟相位),还有很多属性不同(全局时钟?)。所以为了进入不同的区域,你必须关一下相应的门。这其实很容易理解,你进厨房,关厕所的门,就有点奇怪了。还是以复位信号为例,对所有你需要用到复位信号的时钟域,最好可以被相应的时钟打一下。
- E* A6 r. Q' }0 r7 c- C/ ?8 i7 T; E4 M4 A# J
提出这样一点,是因为它经常被忽略,而且发生问题的状况可能变成随机的。如果你的设计仿真没有问题,而在板子上发生一些随机的事件,那么很有可能是你的异步信号造成的。7 O/ a+ x: N* {7 Y; n3 b3 C5 f
4 U! a# \8 W$ G: d. V6 I
2.        在门与门之间请不要来回走动2 u$ @1 A2 C  t: I- v0 q' g* }
门(寄存器)与门之间是什么?是组合逻辑电路。信号的传递就是不断的打开一个门,然后进入另外一个门,这样一级一级的不断传递,你才可以一直从起点走到终点。在有些时候也许你并没有注意,你在到达另外一个门之前,你转了一个圈又回来了。虽然这只是一个简单的圈,但是这个动作会被无限循环,因为这个动作没有被时钟限制。所以导致的后果可想而知了。举一个最简单的例子:! X# W3 K6 q( r, i8 w
D = A + B + C;
/ z& ?9 d& s0 t% n) E! PReg C = D + B;
4 r8 d. z5 h: K2 I# W) `
+ {9 G- z8 x$ o# M# K. ]" \( bA和B都是输入,而C是输出,你会发现其实这个C偷偷的回去转了一圈,而结果是使自己又多做了几次循环。而最终结果是多少要看这段逻辑自身的延迟和你的时钟频率,对不起,谁都不可能预测结果。而且每次编译的结果都会不同,因为编译导致的电路延迟是随机的。但是如果我们把D也用门关一下(寄存器),那么结果就会舒服了。/ X; y) v" F1 `. H% e( u/ Y
# `. ?1 w' P* d1 y
Reg D = A + B + C;
+ I. E) |' A! i2 E% b* }. _Reg C = D + B;2 X8 S: d3 U3 k! O/ C4 \5 ~0 w
' _$ Y" H) ~& W
不妨在QuartusII 里面尝试这两种电路。 工具会报告一个combinational loop的警告给你。也可以尝试做一些仿真体会一下。
2 {& C6 R" S5 C( m2 ]' e+ a/ E
" O4 w: r4 I3 j+ H% Z0 Y4 C' U0 I3.        不要为了省钱,用假门 (Latch Vs Register)) g& K8 G+ G3 x
让我们把这个门再好好的研究一下,首先是定义。我这里说的门更多是flip-flop register. 作为现成的资源,它遍布于器件的四面八方。另外有一种叫Latch的东西,我把它叫做假门。在普通数字电路中,人们会喜欢用到它。因为它的结构相对简单,所以资源上比较节约。所以我们需要说说这个假门的问题。+ O6 e, ~8 ^* o( T! q$ i

# d/ V* O- }' Q: g- l. O那么首先需要了解一下什么是假门,其实就是一个偷工减料的门。我们来看一个简单的图(如图latch):
) ~( I# U( h+ T8 P9 j& y, Z8 j& l" t# A8 R5 W7 x6 n

' _. ~$ @3 J; w" [& z这确实是一个再简单不过的逻辑了,比flip-flop 的那个寄存器要简单许多。当gate为高的时候,Q变成D,否则,就保持Q的值。很显然这是一个用电平来保存数据的一个逻辑,但是为什么我们不喜欢它呢?
+ R5 ~7 u* w) D6 F: T1.        不稳定,和flip-flop做一个比较,register是在开门的时候数据进去的,然后这个门马上就关掉了,所以数据只要在开门的前后保持稳定,那么从输出看都是可以保持一致的。但是Latch的结构中,当Gate为高的时候,Q的数据会随着D的变化而变化。所以他无法保持一个稳定的状态。" i; m' a4 y. m: \, p
2.        它给工具制造了麻烦。因为电路是由你设计的,工具并无法知道你的思路,所以他不会知道你想要的到底是什么时候的输入。因为你现在门是一直那么开着的。在这过程中,狐狸也来过了,狼也来过了,老鼠也来过了,工具不知道究竟以什么为标准来判断这个电路是不是能符合时序要求。这样的话,或许你会很幸运的在一颗片子上面完成任务。但是一旦换一颗,情况就变了。
) `. `6 g& D5 H, m3.        最后,作为一个精打细算的人,我们需要知道他是不是真的就省了那些传说中的资源了。大家不妨自己做一个Latch出来(QuartusII 的megacore中是可以找到LPM_LATCH的)。然后把它编译一下出来看看。你会发现事实上你根本找不到这样的一个电路 ( Resource property editor )你只能看到这样一个有点庞大的图(如图LPM_latch):4 r( U% C' H( i4 R/ ^

+ s/ U- y9 m& ?2 E* ^: l 6 Q( {9 `, F; n# s+ Y; l

# u4 y2 X8 W  t2 ?真是不划算,你发现其实整个查找表都给用上了。而后面一个简简单单的register可怜巴巴的放在那里用不到。0 ~* T/ A, N  |, ^
5 u# ?1 [4 M+ \7 m: x. r
作为FPGA设计中比较独特的一个原则就是,这个世界不是你创造的,所以你必须去适应它,而不是顽固自己的意图。
. t  n$ T$ v. C* T! E* d2 s7 v- |$ f
换句话说:坏人也是人,不是说你不能做,但都已经告诉你坏人不好了,你干嘛还要去做呢?
  `2 N( X* t) b1 u
" A) r6 q. x3 I! J1 V; X留一个问题给大家去尝试,或者玩一下。什么状况下,或者说怎么写代码的时候,可以把Latch写出来。
+ J# l( @2 f& ]( v
/ v* Q3 q* `6 l% K( C" ]4.        除了门,其他的一切过程都只是暂时的3 U; H% `  ]6 C
在FPGA中,除了门与门之间的延迟是固定的(时钟频率)外,一切的组合电路的延迟都是不确定的。你不能依靠一次编译的延迟结果来做你的设计,虽然这样看上去的效率会非常高。就好像接力跑一样,可以一棒一棒的传下去。但是电路是需要可以不断重复的一个过充。相信每次接力跑交棒的时间点都是不同的吧,你再做一次编译以后,你会发现整个世界都变了。所以在设计中,尽量避免使用这种手段。. k+ w$ A4 Y4 [$ [

# n" @7 a8 D' `/ b- c6 R' G* `7 a延迟链,经常会使用这种手段,比如几级非门来增加延迟。但是它也是具有不稳定性的,所以在不到万不得已的状况下,不要用它来增加认为的延迟。延迟链在ASIC中另外一种用途是增加扇出。而这在FPGA设计中是画蛇添足了。因为布线资源中已经加入了buffer了。6 F0 x1 c& u5 c! G9 k( K! J' K
' @0 C; n) J( o' m" b5 j- |9 n
记住这样一个规律就好了,凡是没有被门关过的信号都是不稳定的,都只是暂时的。
2 O( b( y: c. H3 `; x

latch.jpg (11.48 KB, 下载次数: 0)

latch.jpg

LPM_latch.jpg (50 KB, 下载次数: 0)

LPM_latch.jpg
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2024-11-24 09:29 , Processed in 0.062670 second(s), 35 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表