还是从李小龙说起。伴随着一声“哟嚯”,飞出一脚后张开双臂身体半蹲的招牌式动作,被全球各地无数人模仿过。可是我们知道,全世界只有一个李小龙。无论你把“招式”模仿得多么惟妙惟肖,都无法达到那个效果。原因其实很简单,我们不具备他的速度和力量。采用反推法逆向思维,如果具备了他的速度与力量,任何一个招式都会威力无穷。由此可知,基本功是多么重要。
前几节的内容,我们讲的是怎么“减负”,尽量卸下对于完成项目来说没有必要的学习部分。本节内容要讲的就是,对于核心知识点,必须下苦功完全掌握。
我们经常会遇到这样的情况,“感觉”已经懂了,会了,但是一进入实际项目束手无策。为什么?这种情形,绝大部分时候,都是因为基本核心知识点还没有完全学通,处于半懂不懂的状态。例如:
搞不清楚 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 Oassign 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" pend
7 o8 G9 o6 F6 j5 h. S4 h0 rassign add_cnt1 = end_cnt0;
9 b6 t& B+ a9 v% t( iassign end_cnt1 = add_cnt1 && cnt1==4-1 ;
) k' f) }4 P1 r, B3 Valways @(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 fassign 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# Rend + 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 Pend
9 S2 r$ Y% g; F, |+ Q( M& P7 ~# w7 galways @(*)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 mend |
* ]# z9 c$ c! c. v. u$ C$ b6 S8 L
类似这些习题,一直要练习到不需要思考的过程,而是形成类似于条件反射式的自然反应。掌握的要领就是不停练习反复练习。在这一点上,没有捷径可走。唯一可依托的,就是——勤奋。
高深的内容都是由最基本的要素组合而成。一旦有了扎实的基本功底,就有了“李小龙的速度与力量”,很多“招式”方面的高深问题就迎刃而解了。
本节中我们通过借喻“功夫”,来说明基本功的重要性以及和高深内容的关系。