4. 3 建
立“产生效果”的 “低级功能模块”
首先,我们先回顾一下“低级建模”的准则。低级建模的准则如下:
1. 有“组织模块”和“功能模块”之分。
2. “低级建模”中的“功能模块”均称为“低级功能模块”。
3. “低级功能模块”有如特点:有开始信号,完成信号,一个模块只有一个工能
4. 多个“低级功能模块”组织起来称为“组织模块”。
在上一章节,我们建立了两个“低级功能模块”,各个模块都有“开始信号”,“完成信号”,和“单一的功能”(准则2, 3),然后将两个“低级功能模块”组织了起来(准则1,4),
“ 自左向右循环3次,自右向左循环5次,然后自左向右一次,自右向左一次,然后自左向右循环30次”
这一章节,我们要从上一章节的基础上,建立另一个“低级功能模块”,用来产生如上的效果。
然后再将它与之前已经组织好的模块,再一次组织起来。
概念图如下:
点击浏览下一页
“产生效果的模块”代码如下:
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.
15. output Done_Sig;
16. output Right_Start_Sig;
17. output Left_Start_Sig;
18.
19. /*************************************/
20.
21. reg [7:0]i;
22. reg isDone;
23. reg isLeft;
24. reg isRight;
25.
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.
40. 8'd1, 8'd2, 8'd3, 8'd9 :
41. Flash_Right;
42.
43. 8'd4, 8'd5, 8'd6, 8'd7, 8'd8, 8'd10 :
44. Flash_Left;
45.
46. 8'd41, 8'd42 :
47. Done;
48.
49. default :
50. Flash_Right;
51.
52. endcase
53.
54. /***********************************/
55.
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.
64. /***********************************/
65.
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.
74. /***********************************/
75.
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.
85. /***********************************/
86.
87. assign Done_Sig = isDone;
88. assign Right_Start_Sig = isRight;
89. assign Left_Start_Sig = isLeft;
90.
91.endmodule
这个effect_module由于使用模板的关系,多以编程格式与flashing_to_right/left 大同小异。但是核心功能部分就稍微复杂一些。
第23行和24行,声明用的寄存器“isRight”和“isLeft”分别对应flashing_to_right 和 flashing_to_left 的“Start_Sig”。
在40行,第1~3, 9 i步
骤,执行“Flash_Right”任务。在56~62行,巧妙的利用“开始信号”和“完成信号”来执行“flashing_to_right”模块。正如下代码:
if( Right_Done_Sig )
begin i <= i + 1'b1; isRight = 1'b0; end
else isRight = 1'b1;
一开始 “isRight" 的初始值为0,所以会进入 else语句,然后“isRight”被设置为1。当“isRight"为1时,“Right_Start_Sig”被拉高(第88行),换一句话说就是“使能flashing_to_right ”模块。
在“flashing_to_right”模块执行完成之前(产生完成信号),i步骤不变。当检查到“完成信号”,i会指向下一个步骤,然后isRight设置为0(关闭flashing_to_right模块)。
即使是Flash_Left 任务,还是其他什么任务。只要涉及到“开始信号”和“完成信号”,都可以使用这样的写法,这是“低级功能模块”的编程好处。
在第30行至50行之间,这个功能模块产生的效果,如i指向的步骤那样,0时初始化,1~3,9时执行“flashing_to_right”功能,然后 4~8,10 时执行“flashing_to_left”功能等等......
最后会产生如下的效果:
“ 自左向右循环3次,自右向左循环5次,然后自左向右一次,自右向左一次,然后自左向右循环30次”
在最后两个步骤,产生完成信号。
if( isDone == 1 )
begin isDone <= 1'b0; i <= 8'b0; end
else
begin isDone <= 1'b1; i <= i + 1'b1; end
就这样,一个符合“低级建模”准则的“低级功能模块”就完成了。这个模块只是“产生控制次序而已”,还不是完成品。在下一章,当将“effect_module”和“flashing_module”组织过后,就会成为完成品。 |