|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
时钟与触发器的关系 1 z- g& T: w+ t" W, n! u4 Y# L3 _
9 p1 M, {! y- o4 i& m 对于FPGA设计者来说,用好“HDL语言的可综合子集”可以完成FPGA设计50%的工作——设计编码。
9 c# I& h. R5 G! w9 r) Q; f- I P d% K9 c& {
练好仿真、综合、时序分析这3项基本功,对于学习“HDL语言的可综合子集”有如下帮助:! y. L9 g$ e3 n/ E- K1 ^+ f
+ M K' r5 T: g$ O1 g! @
1. 通过仿真,可以观察HDL语言在FPGA中的逻辑行为。0 u0 Q. Y! \( d* m
) Z5 V( K! ?+ ?6 Q( B 2. 通过综合,可以观察HDL语言在FPGA中的物理实现形式。
* c1 B R& c. o6 e# f3 V. u" \9 L' v- L6 f
3. 通过时序分析,可以分析HDL语言在FPGA中的物理实现特性。/ {/ T/ H/ f& T/ U& R6 o
& w4 g; O) l5 s' L 对于FPGA设计者来说,用好“HDL语言的验证子集”,可以完成FPGA设计另外50%的工作——调试验证。3 o8 u0 _( s/ i w0 g
6 ]' L# c* Y' p' P6 i& \* T& n' q
1. 搭建验证环境,通过仿真的手段可以检验FPGA设计的正确性。. d. O5 u; ^$ ^- u
: W7 o, o& n2 z
2. 全面的仿真验证可以减少FPGA硬件调试的工作量。
: U" A1 ] q5 J# B3 `- z) c+ O A' Q9 e" }
3. 把硬件调试与仿真验证方法结合起来,用调试解决仿真未验证的问题,用仿真保证已经解决的问题不在调试中再现,可以建立一个回归验证流程,有助于FPGA设计项目的维护。) [4 A+ A, l& c
* M1 }7 ~; J. p2 r6 ?3 Z& f FPGA 设计者的这5项基本功不是孤立的,必须结合使用,才能完成一个完整的FPGA设计流程。反过来说,通过完成一个完整的设计流程,才能最有效地练习这5项基本功。对这5项基本功有了初步认识,就可以逐个深入学习一些,然后把学到的知识再次用于完整的设计流程。如此反复,就可以逐步提高设计水平。采用这样的循序渐进、螺旋式上升的方法,只要通过培训入了门,就可以自学自练,自我提高。- W M5 w; X2 v; z2 Z7 Q
2 @3 U" N4 U. ~# Q$ T9 t6 C 市面上出售的有关FPGA设计的书籍为了保证结构的完整性,对 FPGA设计的每一个方面分开介绍,每一方面虽然深入,但是由于缺少其他相关方面的支持,读者很难付诸实践,只有通读完全书才能对FPGA设计获得一个整体的认识。这样的书籍,作为工程培训指导书不行,可以作为某一个方面进阶的参考书。
1 X s, i6 E1 ~7 U' f: k; M
. w6 H+ o" ~" Q8 V 对于新入职的员工来说,他们往往对FPGA的整体设计流程有了初步认识,5项基本功的某几个方面可能很扎实。但是由于某个或某几个方面能力的欠缺,限制了他们独自完成整个设计流程的能力。入职培训的目的就是帮助他们掌握整体设计流程,培养自我获取信息的能力,通过几个设计流程来回的训练,形成自我促进、自我发展的良性循环。在这一过程中,随着对工作涉及的知识的广度和深度的认识逐步清晰,新员工的自信心也会逐步增强,对个人的发展方向也会逐步明确,才能积极主动地参与到工程项目中来。
6 t5 B, v6 l6 E: j6 F* k& V6 Y. h4 r: b8 Q3 m6 F! F
最后总结几点:
, f$ q+ a' D c, D( V# _3 A! [0 X% x& U7 W6 X# ?5 o
1)看代码,建模型! s0 d Y" f# V
7 K+ h6 q# \* b$ p 只有在脑海中建立了一个个逻辑模型,理解FPGA内部逻辑结构实现的基础,才能明白为什么写Verilog和写C整体思路是不一样的,才能理解顺序执行语言和并行执行语言的设计方法上的差异。在看到一段简单程序的时候应该想到是什么样的功能电路。
1 z4 e$ y" q5 M" P& k( I7 J6 G
5 @9 @# z; Y: d# z 2)用数学思维来简化设计逻辑
1 [& S- ?; F, [3 A' Y! {( _$ T* ~- W) b
学习FPGA不仅逻辑思维很重要,好的数学思维也能让你的设计化繁为简,所以啊,那些看见高数就头疼的童鞋需要重视一下这门课哦。举个简单的例子,比如有两个32bit的数据X[31:0]与Y[31:0]相乘。当然,无论Altera还是Xilinx都有现成的乘法器IP核可以调用,这也是最简单的方法,但是两个32bit的乘法器将耗费大量的资源。那么有没有节省资源,又不太复杂的方式来实现呢?我们可以稍做修改:- L& R1 v' [& g
* w- _1 K* l, r# }( b. n- q
将X[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: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和Y2相乘,这样一个32bit*32bit的乘法运算转换成了四个16bit*16bit的乘法运算和三个32bit的加法运算。转换后的占用资源将会减少很多,有兴趣的童鞋,不妨综合一下看看,看看两者差多少。
5 @" x/ @3 {: X, |$ ^1 u e
2 ]' P/ V, c4 u0 C! S. q, Z6 O 3)时钟与触发器的关系
" D* G8 V$ D ^( o+ y9 M8 ~' g Y
! y$ x1 S, R c0 s( S$ }9 L “时钟是时序电路的控制者” 这句话太经典了,可以说是FPGA设计的圣言。FPGA的设计主要是以时序电路为主,因为组合逻辑电路再怎么复杂也变不出太多花样,理解起来也不没太多困难。但是时序电路就不同了,它的所有动作都是在时钟一拍一拍的节奏下转变触发,可以说时钟就是整个电路的控制者,控制不好,电路功能就会混乱。
: F% b+ G" d- V8 C4 b0 E4 [) _2 x4 O
打个比方,时钟就相当于人体的心脏,它每一次的跳动就是触发一个 CLK,向身体的各个器官供血,维持着机体的正常运作,每一个器官体统正常工作少不了组织细胞的构成,那么触发器就可以比作基本单元组织细胞。时序逻辑电路的时钟是控制时序逻辑电路状态转换的“发动机”,没有它时序逻辑电路就不能正常工作,因为时序逻辑电路主要是利用触发器存储电路的状态,而触发器状态变换需要时钟的上升或下降沿!由此可见时钟在时序电路中的核心作用!
2 h7 w: l [- j* d$ X- r
0 ]2 }8 S% v2 L* I 最后简单说一下体会吧,归结起来就多实践、多思考、多问。实践出真知,看 100遍别人的方案不如自己去实践一下。实践的动力一方面来自兴趣,一方面来自压力,我个人 觉得后者更重要。有需求会容易形成压力,也就是说最好能在实际的项目开发中锻炼,而不是为了学习而学习。在实践的过程中要多思考,多想想问题出现的原因,问题解决后要多问几个为什么,这也是经验积累的过程,如果有写项目日志的习惯更好,把问题及原因、解决的办法都写进去。最后还要多问,遇到问题思索后还得不到解决就要问了,毕竟个人的力量是有限的,问同学同事、问搜索引擎、问网友都可以,一篇文章、朋友们的点拨都可能帮助自己快速解决问题。
* V6 P3 r( e( ~0 p# _0 B+ g |
|