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

转——FPGA核心知识讲解

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

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

( v; `! `2 F0 ]/ l. E3 Q8 W
     if(!rst_n)begin

. b( @2 T! K* K" I3 n4 D: h3 \
        cnt0  <= 0;
" A$ y; @% I8 b% Z0 W" e( b
    end
& ?& X5 ~6 r1 C5 O% o
    else  if(add_cnt0)begin
3 T- H  w' k; D, H; r
         if(end_cnt0)
9 K$ Y+ J+ s1 _  [9 s" m
            cnt0  <= 0;
6 I0 P# D' G: D
        else
. z" e5 h9 a$ n* ]
            cnt0  <= cnt0 + 1;
0 |& T7 Z# D0 P6 V3 H
    end

: [5 I4 r# f6 e( C$ e
end

" {/ T* I9 z1 r$ B
assign add_cnt0 = add_flag ;      
; N+ u. i5 O9 [# s+ D2 L+ F
assign end_cnt0 = add_cnt0 && cnt0==x-1 ;
& {0 R" c: S: v5 y! s( x
always @(posedge clk or negedge rst_n)begin
( f5 Z# a. g7 D  Z
     if(!rst_n)begin

  g1 s3 z1 r8 n2 c
        cnt1  <= 0;

* m) @" N) R4 i0 C& ^# }5 j
    end
" _+ `# P" `, y4 n% p
    else  if(add_cnt1)begin

) p/ Y4 N( |! b! M  [; z
         if(end_cnt1)
$ C2 o" L3 i8 x: a
            cnt1  <= 0;
- B# B9 y# f+ z5 U6 ?$ V
        else
/ M" ~! n1 m5 |* ~% u7 a" U
            cnt1  <= cnt1 + 1;

9 e8 j+ ]5 H! V, J; Y: ]) e& K- `
    end
, V* Z$ L7 B# k8 r3 c. l- q' M. m
end
, @3 O9 S: m/ X* Q8 ?
assign add_cnt1 = end_cnt0;      
6 Y. g, B5 P, D2 k3 i+ z  K
assign end_cnt1 = add_cnt1 && cnt1==4-1 ;
+ K+ p0 k  t6 v% Q( S
always  @(posedge  clk or negedge rst_n)begin
7 @4 _2 V: T- S# z3 f$ q1 R
    if(rst_n==1'b0)begin
8 D& X$ Z' t) v* T  g% \) G1 L9 u$ f
        dout  <= 0;

7 }  X. L6 l8 ~! m
    end

3 p+ J8 F& T+ d! ~
    else  if(en_dout)begin
8 ?* X, J6 Q. ^' k  ]
        dout  <= 1;
5 v$ j' X. ]( Z' }
    end
8 H3 ]( v, @, m8 b+ q1 \; _
    else  if(end_cnt0)begin
& C- x5 D0 j& Q# Y: X, B  H* @+ k
        dout  <= 0;
2 K4 k  h' c! w; b& ?$ y2 T
    end
7 |: o7 a8 [  B7 r
end

( M. K6 o; @1 h! V& d9 l% C; k
assign en_dout = add_cnt0 && cnt0 == y-1;

9 T4 p- V/ n# j: M2 Z
always  @(posedge  clk or negedge rst_n)begin

' n$ D% \1 a& f+ y; ?" q
     if(rst_n==1'b0)begin

4 Y0 ?! X3 ^$ a$ E8 v7 b
        add_flag  <= 0;

1 z4 B0 {/ G: G  [, H* l
    end
0 C. r+ Z! b0 {' k* ^# s8 p
    else  if(en1||en2)begin

4 C! g0 U* F2 J0 T! _
        add_flag  <= 1;

' ^* Q' h- _. g, U+ p) |* p% ?
    end
$ q3 p5 u2 A* W" B3 N- K
    else  if(end_cnt1)begin
+ ?7 @* U  ^; e( @
        add_flag  <= 0;

9 I: [2 a, T4 F" ]
    end

/ u7 z/ v3 R2 M  \5 G
end

& O' z1 J, t2 y% {# a
always  @(posedge  clk or negedge rst_n)begin
' w. B2 T+ k. i1 _, u/ H8 q8 X
     if(rst_n==1'b0)begin

+ }$ L* m, U/ ^
        sel_flag  <= 0;

! ?: r, h: @+ c* J
    end
9 ^; b; w' a) v
    else  if(en1)begin
( o  l" v) n2 A) N6 w, A- _
        sel_flag  <= 0;
- n* w+ |  t3 l9 Y" B0 `! Y5 ~( b
    end
0 B1 \3 N6 q$ _6 _3 g; d
    else  if(en2)begin
  l/ x1 P+ r$ _9 C. z- q* [
        sel_flag  <= 1;
# S! y; r# r, q% T8 @
    end
2 a) Y8 ~+ P, e, r  I1 U
end

3 X, [4 ]% i( |
always  @(*)begin

& W9 R) ~5 b6 s7 K9 d
     if(sel_flag==0)begin

8 V; U$ I% g: [2 b; v1 R
        if(cnt==0)begin

$ t) @0 q6 i/ z
        x = 7;
: y) W7 V5 ^6 S3 K
        y = 2;

: o8 ?! x; \! i  x) \) h8 E
       end

9 V& g$ ?" j5 X# \0 Z% p
       else if  (cnt1==1)begin

- ]/ }3 S' \$ h6 _6 T8 N
        x = 9;
6 m/ r. g: J( p5 {8 l
        y = 2;

& @1 H6 ^0 e8 |2 M6 u
       end

7 n* w% e2 w0 p) Q
       else if (cnt1==2)begin
* e( ?8 T1 Z* ~0 Q) v4 P& H2 ?
        x = 5;

# m" y' ^5 a4 L& ?
        y = 2;
+ @$ \& x  U3 T6 X7 B
       end

" R6 R2 V( P8 Z5 x. R8 X6 U. D) z$ U5 c
       else begin
, t& ^' _) V: E; F4 ^5 r  e
        x = 8;
0 y1 b" K8 k* x3 B2 ~
        y = 2;

, B$ _. i1 @* w' V
       end
- H9 E  ^8 ~8 @+ o6 o7 V) M# m9 G
    end

4 j) m; ~; D9 Z4 C. p
    else begin
- l2 o1 a& l- b  S/ [4 C& b
         if(cnt==0)begin

% l/ }# `; x% \1 a7 U
        x = 7;
9 [4 C: r! q5 L/ }5 \7 _
        y = 4;
4 d* v: R0 n" u9 \4 c7 P
       end
9 z$ O, j0 J9 i  F9 R0 y4 o
       else if  (cnt1==1)begin
6 n1 y; a) k- s
        x = 7;
$ W  R/ D4 H# h
        y = 1;
- p8 X/ @  ~0 V* e* l
       end
6 i: l  a3 n* [  P# x
       else if (cnt1==2)begin
4 p" B+ ^: i/ a% n. j/ v
        x = 9;

1 J- T- C$ e* J- B
        y = 6;
9 [0 @8 L2 m" F; y, G+ k7 Z1 \/ h2 [
       end

, _2 ^; q0 h' y" ~- e3 |
       else begin
6 v, X) Q8 |+ |& s
        x = 7;
$ r8 _& R. P( w
        y = 2;

, j+ V- T$ ]3 g: R1 v5 ^
       end

! O* z0 w, B) J5 |9 ]: l. [# k$ ^
   end

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-28 20:26 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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