集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 857|回复: 1

Verilog HDL 建模技巧 低级建模 仿顺序操作·思路篇11 - 产生效果的低级功能模块

[复制链接]
羽蒙 发表于 2014-8-15 15:33:33 | 显示全部楼层 |阅读模式
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”组织过后,就会成为完成品。
Sunlife 发表于 2014-8-15 21:42:08 | 显示全部楼层
建立另一个“低级功能模块”,用来产生如上的效果
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-12-26 13:34 , Processed in 0.056278 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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