还是从李小龙说起。伴随着一声“哟嚯”,飞出一脚后张开双臂身体半蹲的招牌式动作,被全球各地无数人模仿过。可是我们知道,全世界只有一个李小龙。无论你把“招式”模仿得多么惟妙惟肖,都无法达到那个效果。原因其实很简单,我们不具备他的速度和力量。采用反推法逆向思维,如果具备了他的速度与力量,任何一个招式都会威力无穷。由此可知,基本功是多么重要。
前几节的内容,我们讲的是怎么“减负”,尽量卸下对于完成项目来说没有必要的学习部分。本节内容要讲的就是,对于核心知识点,必须下苦功完全掌握。
我们经常会遇到这样的情况,“感觉”已经懂了,会了,但是一进入实际项目束手无策。为什么?这种情形,绝大部分时候,都是因为基本核心知识点还没有完全学通,处于半懂不懂的状态。例如:
搞不清楚 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( Tassign 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 Oend
- Z3 I$ V& u# k& H# wassign en_dout = add_cnt0 && cnt0 == y-1;
! P) |4 ?* X) K; l1 R8 galways @(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 walways @(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- galways @(*)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 aend |
^9 H& y% V0 U2 K* ~# b类似这些习题,一直要练习到不需要思考的过程,而是形成类似于条件反射式的自然反应。掌握的要领就是不停练习反复练习。在这一点上,没有捷径可走。唯一可依托的,就是——勤奋。
高深的内容都是由最基本的要素组合而成。一旦有了扎实的基本功底,就有了“李小龙的速度与力量”,很多“招式”方面的高深问题就迎刃而解了。
本节中我们通过借喻“功夫”,来说明基本功的重要性以及和高深内容的关系。