4. 3 建立“产生效果”的 “低级功能模块”3 V& z9 k) L( T( r
首先,我们先回顾一下“低级建模”的准则。低级建模的准则如下: 5 r( Y/ i0 q4 l! W# p
1. 有“组织模块”和“功能模块”之分。 2. “低级建模”中的“功能模块”均称为“低级功能模块”。 3. “低级功能模块”有如特点:有开始信号,完成信号,一个模块只有一个工能 4. 多个“低级功能模块”组织起来称为“组织模块”。
) L7 ]7 d: p: f: ^" U; x# b
在上一章节,我们建立了两个“低级功能模块”,各个模块都有“开始信号”,“完成信号”,和“单一的功能”(准则2, 3),然后将两个“低级功能模块”组织了起来(准则1,4), 4 n" D8 U9 u0 V. P
“ 自左向右循环3次,自右向左循环5次,然后自左向右一次,自右向左一次,然后自左向右循环30次”
1 H1 Y& l( Q; {; \
这一章节,我们要从上一章节的基础上,建立另一个“低级功能模块”,用来产生如上的效果。 然后再将它与之前已经组织好的模块,再一次组织起来。
3 y% N9 A) j; C/ T8 D- S' r
概念图如下:
. K4 M: h s6 P% q( G
http://space.ednchina.com/upload/2010/6/5/008ce9c1-162b-4fee-9b78-4534e377b90e.jpg
$ ]* F+ d# U u' q) o3 M+ |# s/ B
“产生效果的模块”代码如下:
t' ]* o, ]# Q8 W8 i
1.module effect_module 2.( 3. CLK, RSTn, 4. Start_Sig, Done_Sig, 5. Right_Start_Sig, Left_Start_Sig, 6. Right_Done_Sig, Left_Done_Sig 7.); 8. 9. input CLK; 10. input RSTn; 11. input Start_Sig; 12. input Right_Done_Sig; 13. input Left_Done_Sig; 14.& T9 o: G+ E$ H j U0 s# I+ S: l
15. output Done_Sig; 16. output Right_Start_Sig; 17. output Left_Start_Sig; 18.! B4 v7 y& K$ X
19.
- ~1 h& E: ?. O- ~7 O: h: Y /*************************************/ 20.
9 @& H$ P5 _9 A5 L 21. reg [7:0]i; 22. reg isDone; 23. reg isLeft; 24. reg isRight; 25.
$ j/ M" ?; m& \, ~ 26. always @ ( posedge CLK or negedge RSTn ) 27. if( !RSTn ) 28. begin 29. isDone <= 1'b0; 30. i <= 8'd0; 31. isRight <= 1'b0; 32. isLeft <= 1'b0; 33. end 34. else if( Start_Sig ) 35. case ( i ) 36. 37. 8'd0 : 38. i <= i + 1'b1; 39.
- Q; ~" f! J: o! g" `* v+ `0 J9 d 40. 8'd1, 8'd2, 8'd3, 8'd9 : 41. Flash_Right; 42.
. H) I0 t2 u. h3 Q% O 43. 8'd4, 8'd5, 8'd6, 8'd7, 8'd8, 8'd10 : 44. Flash_Left; 45.) p' k) p0 v S3 d' s, g; }
46. 8'd41, 8'd42 : 47. Done; 48.
; w1 w, c* m. v+ V- u 49. default : 50. Flash_Right; 51. 52. endcase 53. 54.* e& S" P& y6 P' o' `
/***********************************/ 55.
/ q5 i U+ g7 A( p( R 56. task Flash_Right; 57. 58. if( Right_Done_Sig ) 59. begin i <= i + 1'b1; isRight = 1'b0; end 60. else isRight = 1'b1; 61. 62. endtask 63./ F& x, I2 c% J9 E! O/ G
64.2 v3 v2 v6 i$ _8 i7 x; c
/***********************************/ 65.! L7 D5 T- T: l# t" ~# d( q
66. task Flash_Left; 67. 68. if( Left_Done_Sig ) 69. begin i <= i + 1'b1; isLeft = 1'b0; end 70. else isLeft = 1'b1; 71. 72. endtask 73.
* k8 C7 z0 s2 j% F8 | 74.. k" O' h1 D. k3 P
/***********************************/ 75.
5 f+ K9 G! {/ p z$ L! r2 c7 ] 76. task Done; 77. 78. if( isDone == 1 ) 79. begin isDone <= 1'b0; i <= 8'b0; end 80. else 81. begin isDone <= 1'b1; i <= i + 1'b1; end 82. 83. endtask 84.
7 K4 {, d) |9 j* W" X 85.
9 ?# A r- I' f& Z' v( q /***********************************/ 86.+ |% m' S8 t/ k$ a0 p, `
87. assign Done_Sig = isDone; 88. assign Right_Start_Sig = isRight; 89. assign Left_Start_Sig = isLeft; 90. 91.endmodule
( V7 `1 B/ t! P' V7 F
这个effect_module由于使用模板的关系,多以编程格式与flashing_to_right/left 大同小异。但是核心功能部分就稍微复杂一些。
% Y2 i& m' k1 r& z [* i
第23行和24行,声明用的寄存器“isRight”和“isLeft”分别对应flashing_to_right 和 flashing_to_left 的“Start_Sig”。
; H; H$ S5 ^+ h+ \& _& s8 `
- R7 H, R0 Y% m# |# c' }
在40行,第1~3, 9 i步骤,执行“Flash_Right”任务。在56~62行,巧妙的利用“开始信号”和“完成信号”来执行“flashing_to_right”模块。正如下代码: ) \2 S, H2 q4 s" j2 V9 L. N4 r
$ f* c/ f# }( ~( }. d4 N9 I
if( Right_Done_Sig ) begin i <= i + 1'b1; isRight = 1'b0; end else isRight = 1'b1;
# p/ y$ M) P) W0 u, \" X( G9 s
$ ]8 z# U2 }- s" C
一开始 “isRight" 的初始值为0,所以会进入 else语句,然后“isRight”被设置为1。当“isRight"为1时,“Right_Start_Sig”被拉高(第88行),换一句话说就是“使能flashing_to_right ”模块。 在“flashing_to_right”模块执行完成之前(产生完成信号),i步骤不变。当检查到“完成信号”,i会指向下一个步骤,然后isRight设置为0(关闭flashing_to_right模块)。 $ Q( A! [% Z; ^- Q' k# e
即使是Flash_Left 任务,还是其他什么任务。只要涉及到“开始信号”和“完成信号”,都可以使用这样的写法,这是“低级功能模块”的编程好处。
4 M3 f2 }9 h {! u; ]% e
在第30行至50行之间,这个功能模块产生的效果,如i指向的步骤那样,0时初始化,1~3,9时执行“flashing_to_right”功能,然后 4~8,10 时执行“flashing_to_left”功能等等...... 最后会产生如下的效果: . w4 i% }4 O' f. t- F9 g5 c; d
“ 自左向右循环3次,自右向左循环5次,然后自左向右一次,自右向左一次,然后自左向右循环30次”
8 @7 V2 }' f6 k6 Q
在最后两个步骤,产生完成信号。 L- K8 l( d( M# i0 i
9 E+ x$ c, q$ A, d
if( isDone == 1 ) begin isDone <= 1'b0; i <= 8'b0; end else begin isDone <= 1'b1; i <= i + 1'b1; end 3 t0 }. X- h" k' y4 i$ Y' C
! M% M' R( o6 a! j+ x
就这样,一个符合“低级建模”准则的“低级功能模块”就完成了。这个模块只是“产生控制次序而已”,还不是完成品。在下一章,当将“effect_module”和“flashing_module”组织过后,就会成为完成品。
5 [* Q; H& f0 ~% \
0 l# Z$ M5 J7 n6 x/ Q2 K |