找回密码
 注册
关于网站域名变更的通知
查看: 314|回复: 1
打印 上一主题 下一主题

转——FPGA核心知识讲解

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-3-21 07:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
9 ?8 }5 `3 a7 C( }$ u9 J0 X4 Z
转——FPGA核心知识讲解
9 `9 T" e, v7 Z3 f
还是从李小龙说起。伴随着一声“哟嚯”,飞出一脚后张开双臂身体半蹲的招牌式动作,被全球各地无数人模仿过。可是我们知道,全世界只有一个李小龙。无论你把“招式”模仿得多么惟妙惟肖,都无法达到那个效果。原因其实很简单,我们不具备他的速度和力量。采用反推法逆向思维,如果具备了他的速度与力量,任何一个招式都会威力无穷。由此可知,基本功是多么重要。
前几节的内容,我们讲的是怎么“减负”,尽量卸下对于完成项目来说没有必要的学习部分。本节内容要讲的就是,对于核心知识点,必须下苦功完全掌握。
我们经常会遇到这样的情况,“感觉”已经懂了,会了,但是一进入实际项目束手无策。为什么?这种情形,绝大部分时候,都是因为基本核心知识点还没有完全学通,处于半懂不懂的状态。例如:
搞不清楚 add_flag和sel_flag的区别 ,不清楚变量使用的条件,不清楚计数器需要用几个已经计数器之间的关系。
那么对于核心知识点,应该达到什么样的标准,才算是真正掌握了呢?
例 :当收到en1=1时,执行一下操作
a.间隔2个时钟周期后,dout产生宽度为5的高电平脉冲,然后
b.间隔2个时钟周期后,dout产生宽度为7的高电平脉冲,然后
c.间隔2个时钟周期后,dout产生宽度为3的高电平脉冲,然后
d.间隔2个时钟周期后,dout产生宽度为6的高电平脉冲。
当收到en2=1时,执行一下操作
a.间隔4个时钟周期后,dout产生宽度为3的高电平脉冲,然后
b.间隔1个时钟周期后,dout产生宽度为6的高电平脉冲,然后
c.间隔6个时钟周期后,dout产生宽度为3的高电平脉冲,然后
d.间隔2个时钟周期后,dout产生宽度为5的高电平脉冲。(答案如下)
always @(posEDGE clk or negedge rst_n)begin

* h8 Q6 b9 U) z$ \; n( F2 r
     if(!rst_n)begin

) g/ V2 }0 S) i. m/ U/ l
        cnt0  <= 0;
+ W9 F1 O% ?" Z) C  h' L' v
    end

3 i4 @8 y$ z2 _5 Z
    else  if(add_cnt0)begin
' N3 d: v9 J- e5 d/ g
         if(end_cnt0)

* }4 D& s" m. O, E+ o( _
            cnt0  <= 0;

0 J  m2 e0 O+ x" y( n/ O4 y3 K6 L
        else
2 T% P' v( ?0 G9 W! n/ [
            cnt0  <= cnt0 + 1;
8 }1 N4 G& j. e
    end
( a/ z! ~) ~8 N+ V" |
end
8 r5 Z+ t! \2 n. f- l
assign add_cnt0 = add_flag ;      

# k  v! V3 T$ T! l4 T' @7 P2 O
assign end_cnt0 = add_cnt0 && cnt0==x-1 ;
8 L: h0 {' E2 S. m$ B
always @(posedge clk or negedge rst_n)begin
/ ^' D$ j9 d) u, e% t8 }
     if(!rst_n)begin

5 a" J) N1 P# x: {+ i9 u
        cnt1  <= 0;
% a. \. V; X2 K) G6 i8 ]. t9 o
    end
: k% d' L# j) g' j
    else  if(add_cnt1)begin
4 _* P1 A6 T9 I' M' q
         if(end_cnt1)

9 w7 z+ U( I  C: F) g) Q
            cnt1  <= 0;
3 y# _+ h. e0 Q) c. R
        else

5 }) U9 r" F* w% k0 b& s5 m+ _
            cnt1  <= cnt1 + 1;

( G7 k5 G* y( |  P5 x1 L1 n
    end

/ c, _& S1 K. {4 y- ~0 S" p
end

7 o8 G9 o6 F6 j5 h. S4 h0 r
assign add_cnt1 = end_cnt0;      

9 b6 t& B+ a9 v% t( i
assign end_cnt1 = add_cnt1 && cnt1==4-1 ;

) k' f) }4 P1 r, B3 V
always  @(posedge  clk or negedge rst_n)begin
! T5 K( _' R  q+ j$ m
    if(rst_n==1'b0)begin

3 [: h- K  R9 I' q" w# z
        dout  <= 0;
9 _: P5 Z0 u* g( B% s
    end

7 E0 ?! z3 k4 u9 N% T6 n3 J0 d7 v
    else  if(en_dout)begin
& M4 A& L$ f, N' Y; ^
        dout  <= 1;
& B& r! U$ n+ m# M
    end

9 f+ t( U. O- ~4 I
    else  if(end_cnt0)begin
* Q! \: E7 [. U
        dout  <= 0;
4 R" c4 |) V7 X) o0 G! r" v
    end

4 q( r$ A5 y' d$ ?/ R0 \
end

! i  B0 \1 \- k% }4 Z+ c( Z6 f
assign en_dout = add_cnt0 && cnt0 == y-1;
) T" c- }+ B; n2 q) O  Q; F
always  @(posedge  clk or negedge rst_n)begin
) I; a+ ^1 I0 y' j: J
     if(rst_n==1'b0)begin

' S& j6 _/ r2 f$ [
        add_flag  <= 0;

+ X8 d0 A* Q" E4 \0 q: Z6 k  x
    end

# \* V6 g1 d8 m- S, U
    else  if(en1||en2)begin

) [: {6 D# q% p& M- h# o
        add_flag  <= 1;

( \# l' X" R1 W! g( P% N, P
    end

7 r( j5 {5 y$ R; B" w1 H; \
    else  if(end_cnt1)begin

  o$ H( L: Y7 H4 z4 D
        add_flag  <= 0;

) @/ d3 W3 y- D$ ~/ _- n2 b
    end

6 V+ O( d$ I7 \: C# R
end
+ L7 S2 N, m- \" Q2 v; W( l
always  @(posedge  clk or negedge rst_n)begin
2 Z8 f8 {- F& K9 o& t5 M
     if(rst_n==1'b0)begin
  b% g3 ?. |4 S% S' _
        sel_flag  <= 0;
4 y+ i( t- J4 [/ P
    end

6 F/ }, w9 U& A8 P% B4 u7 c
    else  if(en1)begin
2 g. e& H! |) A9 m: G8 c
        sel_flag  <= 0;

; c6 T/ \# d# S1 r  Z5 o
    end
2 p5 p# e& ^% P$ y/ _( E* K
    else  if(en2)begin
7 \3 e# \% J0 j' S3 d
        sel_flag  <= 1;
9 ?% B: ^$ m" U$ U: q
    end

& E" F9 Y0 P% @9 q1 }& g4 P
end

9 S2 r$ Y% g; F, |+ Q( M& P7 ~# w7 g
always  @(*)begin
2 S: c; L3 S* y. P4 E$ R
     if(sel_flag==0)begin
6 r6 C$ I1 R- G
        if(cnt==0)begin
( b& u5 w6 m; h) _: K9 p( L
        x = 7;

# [* i; [3 Y5 i" @2 i
        y = 2;

# a* X5 I* s1 c" W
       end

3 i7 S; F# U+ T0 J* f& c
       else if  (cnt1==1)begin

# u7 X! s7 S. ?5 w+ `9 K1 M
        x = 9;

4 q/ @0 y/ V' P0 L( m3 W
        y = 2;
0 e+ O9 Q' g; ]/ j! t; ^
       end

( X8 Y( C& s) S. }  J$ o
       else if (cnt1==2)begin
9 w# X1 k9 d, r! M; a! x% k- a9 F/ D
        x = 5;
- G$ P8 l5 r; r9 W
        y = 2;
. B) M) @( c' N/ Y! b2 W6 U; G
       end
. e) Y8 j- w. j2 r, |5 m, o  q! ^
       else begin

9 I5 @" m! u4 |4 I
        x = 8;

: g$ y/ x+ o1 D1 p% k
        y = 2;

# }. n1 Q% O- r/ U& i" @- }4 W
       end
4 Y" u+ T+ O% _' s, G
    end
5 B  }" a8 m; I3 k
    else begin

  n, p. k  ]/ x9 _: c5 V2 \
         if(cnt==0)begin

3 ~( {& o% S% g9 u  ~: B/ g
        x = 7;
. z% U6 \- y- `/ q. T+ N9 G
        y = 4;

8 ]9 A  ^% L, b7 @" u( {% ~
       end
" d! R2 M! g+ W3 l
       else if  (cnt1==1)begin
/ m) s( E, A& n! o" M/ x! d1 l
        x = 7;

  a9 Z' Z7 w, S, C1 E) g0 f, m
        y = 1;

1 Z0 k# |) J* W5 t  j
       end
# c% _: x" B- H  ?# ^
       else if (cnt1==2)begin

* C& C  T: F  P: a1 Y% @
        x = 9;
: C- A' G  o3 ~" j4 |' J* M0 F9 O; L
        y = 6;

* K3 E/ L+ c( ~6 c7 C( {
       end

3 K- _5 w+ E  a5 D9 ^* u, \
       else begin
1 O- e- `4 m: f: V& N+ c* J
        x = 7;
. L* }5 w" n5 Q3 S9 A  V
        y = 2;

" L- z# S; I. M- j$ [& J9 q$ r
       end
  m$ r5 U2 ^- X9 P7 O
   end

, b4 R; W& D8 m
end
* ]# z9 c$ c! c. v. u$ C$ b6 S8 L
类似这些习题,一直要练习到不需要思考的过程,而是形成类似于条件反射式的自然反应。掌握的要领就是不停练习反复练习。在这一点上,没有捷径可走。唯一可依托的,就是——勤奋。
高深的内容都是由最基本的要素组合而成。一旦有了扎实的基本功底,就有了“李小龙的速度与力量”,很多“招式”方面的高深问题就迎刃而解了。
本节中我们通过借喻“功夫”,来说明基本功的重要性以及和高深内容的关系。
游客,如果您要查看本帖隐藏内容请回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-9 06:44 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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