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

转——FPGA核心知识讲解

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
4 I( ]; t3 O( ?  _: v
转——FPGA核心知识讲解
0 k5 [3 w7 B  d1 s* f/ I7 N4 G
还是从李小龙说起。伴随着一声“哟嚯”,飞出一脚后张开双臂身体半蹲的招牌式动作,被全球各地无数人模仿过。可是我们知道,全世界只有一个李小龙。无论你把“招式”模仿得多么惟妙惟肖,都无法达到那个效果。原因其实很简单,我们不具备他的速度和力量。采用反推法逆向思维,如果具备了他的速度与力量,任何一个招式都会威力无穷。由此可知,基本功是多么重要。
前几节的内容,我们讲的是怎么“减负”,尽量卸下对于完成项目来说没有必要的学习部分。本节内容要讲的就是,对于核心知识点,必须下苦功完全掌握。
我们经常会遇到这样的情况,“感觉”已经懂了,会了,但是一进入实际项目束手无策。为什么?这种情形,绝大部分时候,都是因为基本核心知识点还没有完全学通,处于半懂不懂的状态。例如:
搞不清楚 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

) t0 |4 ^# P, j2 `9 z% t# Q% K
     if(!rst_n)begin
* A1 m- d9 w" [' I
        cnt0  <= 0;
* v! S, A. U6 z4 V9 s, o
    end
7 l. V/ P  w6 A: i
    else  if(add_cnt0)begin

9 l# v8 a2 Y, [1 d) H& r
         if(end_cnt0)

- {8 F& \+ ~- m
            cnt0  <= 0;
5 y! U$ {# ?  G. u6 E  m# A
        else

) q0 G% Z: N7 x7 x2 j9 u# H' F
            cnt0  <= cnt0 + 1;
. z4 |) I" A. p  [" k3 Q
    end

0 P% H% y7 {- J0 r, }
end
" x% V, g  }0 T/ B
assign add_cnt0 = add_flag ;      
. d2 @$ S6 F% K, S- ]* b! ?: I1 e5 A& r
assign end_cnt0 = add_cnt0 && cnt0==x-1 ;
9 G0 O, `" g  y4 Y
always @(posedge clk or negedge rst_n)begin
& d" J+ M( q. O2 k. E! w3 `4 J
     if(!rst_n)begin

; W# b: Y; {. |  c4 x. U. Z
        cnt1  <= 0;

; y' E" V& F+ u3 B6 [
    end
. J% Y: R5 g! F; h) c1 r
    else  if(add_cnt1)begin
7 s$ L) i  a8 i' M+ Q! [2 ]7 a
         if(end_cnt1)

2 e% d8 ]  q& Q, M
            cnt1  <= 0;
& r$ @3 Q) P3 n5 ~3 _, a. P: w' L
        else

) [" j5 }) Y: Y! C3 e
            cnt1  <= cnt1 + 1;

& t3 u  f. c1 a5 ]
    end
- x& Z6 E: K, ?# E8 L( `
end

  `- c1 w3 r$ D; W/ R# m/ I( T
assign add_cnt1 = end_cnt0;      
9 O7 k) d! y/ {9 @
assign end_cnt1 = add_cnt1 && cnt1==4-1 ;

/ h( O/ M0 w- ]" F8 |
always  @(posedge  clk or negedge rst_n)begin

3 D; `% q7 ?1 p1 L+ W$ a
    if(rst_n==1'b0)begin

! U% S4 L/ \/ X1 H' m( e
        dout  <= 0;

3 h0 F: k: @4 M5 J( c) f4 l4 L
    end
  d) f- f; z9 \$ L* _
    else  if(en_dout)begin
7 P$ u( A& b( ~* o7 h7 f2 m2 l
        dout  <= 1;

5 T/ p3 |" N6 l6 Y+ A
    end
1 i: h/ _& [5 X$ k( ~
    else  if(end_cnt0)begin

- J( T  @4 R& N7 [# K. Z: |7 O: G
        dout  <= 0;

. e0 r* D5 W  `
    end

, E5 |/ Z% D( c; \$ N8 O
end

- Z3 I$ V& u# k& H# w
assign en_dout = add_cnt0 && cnt0 == y-1;

! P) |4 ?* X) K; l1 R8 g
always  @(posedge  clk or negedge rst_n)begin

5 `2 y! `" Z' Z! B3 F% Z
     if(rst_n==1'b0)begin

+ e% r& s" Q2 F( O* l
        add_flag  <= 0;

( ?5 A& C! A* Z+ r" N" |' j4 \
    end

3 h9 B4 Z9 V6 m
    else  if(en1||en2)begin

# m5 e; v# [, j# z2 b3 r
        add_flag  <= 1;

# y9 R$ Z1 q4 s" J( l! `
    end
  z) W8 Q2 a$ @, H
    else  if(end_cnt1)begin
+ b8 y6 E: z. A3 `  q
        add_flag  <= 0;
( p  g% X1 W7 b1 Q+ K
    end
; Z/ }: R; L( _3 c' ~  E
end

0 z5 G6 x  V( x, m& u9 w
always  @(posedge  clk or negedge rst_n)begin
4 Q( d% p. X9 F2 m: S7 n1 q
     if(rst_n==1'b0)begin

5 j0 J+ u* Y3 q( A1 X/ C
        sel_flag  <= 0;
/ G' c2 c1 M, Z$ l. ]$ y
    end

" j# g# H# W: u$ [( y
    else  if(en1)begin
  ~: \8 e( P& |; R( o
        sel_flag  <= 0;

2 s1 k! g6 f7 U3 p* l+ i
    end

% J2 w0 o- L0 q# s7 ^" f
    else  if(en2)begin

# E! J  {5 A8 s! _+ F# w
        sel_flag  <= 1;
; ~/ {6 H! d# ^2 y/ p# T2 K
    end
* I& _; o4 w$ n: ]1 m
end

/ s5 e: S& D8 E4 Y& j/ z- g
always  @(*)begin
8 T% t6 `7 V! Q/ c6 J4 f0 h9 `+ Y
     if(sel_flag==0)begin
0 v. v! n( c) J
        if(cnt==0)begin
+ ?5 n8 T1 j. }6 e# J$ A
        x = 7;
2 B: l  E& A+ t. n
        y = 2;
3 A# F2 F# ?0 U8 C
       end
; X% `) p+ q% ^( J/ W8 h. R& a& m
       else if  (cnt1==1)begin
& X2 |$ ]5 a2 H1 y8 v6 U5 o
        x = 9;

) n* L* ^+ m* X7 u3 d$ K) A; ^
        y = 2;
1 _5 U7 Q+ [" R3 a, I
       end

. Q# ^$ U7 l( b9 c
       else if (cnt1==2)begin
  c7 @, {8 i5 f
        x = 5;

9 D1 ~5 h4 S! H- {! m/ j
        y = 2;
; \# V1 c3 j. {1 |* N! v! G' r
       end
3 X3 V5 C! N* E% w+ {
       else begin
! u: y: v* S  }8 O( B
        x = 8;
) C  d. b* [5 I7 `) L$ ]/ ^: s
        y = 2;
- Y# X  O5 m( A0 e+ N$ Q
       end
7 G4 C& p  `1 S" Z" q: h+ V$ R
    end
7 F2 t; }. Q  K7 |6 l  |
    else begin
  Z5 l1 z- k" M/ s0 p7 c
         if(cnt==0)begin

0 n- H$ W/ o: G6 y8 I% w2 G
        x = 7;

: T0 x4 r) P4 `& ^4 V
        y = 4;

1 M. U: ?; b: n
       end
+ n. h  t9 [4 h: ?6 ^
       else if  (cnt1==1)begin

; X0 }$ Z* o+ G- K
        x = 7;

, ^1 K5 D! ~4 Y7 V  M5 D
        y = 1;

! @- }+ r* o! @# G3 M/ x! d
       end

; i, @. V/ C0 Z
       else if (cnt1==2)begin

6 Y1 B4 I4 H1 n( N4 X: t
        x = 9;
& T/ ?+ G" S3 M- A6 B: G2 R) y
        y = 6;

) U2 |8 x; \7 ^5 F( i
       end

6 a; G# n7 [* u
       else begin

1 R0 N5 _1 |" N/ e
        x = 7;
) x! n( T# ^! I
        y = 2;

. f/ Z3 o. x4 L1 Y
       end

8 e& |/ }* g, A0 D8 Z* B
   end

1 O" k8 r5 j% E7 a
end

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-29 12:58 , Processed in 0.109375 second(s), 26 queries , Gzip On.

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

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

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