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

2010-6-5 17:16 2256 7 8 分类: FPGA/CPLD

 


4. 3 建立“产生效果”的 “低级功能模块”


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

首先,我们先回顾一下“低级建模”的准则。低级建模的准则如下:


 


1. 有“组织模块”和“功能模块”之分。


2. “低级建模”中的“功能模块”均称为“低级功能模块”。


3. “低级功能模块”有如特点:有开始信号,完成信号,一个模块只有一个工能


4. 多个“低级功能模块”组织起来称为“组织模块”。


 


在上一章节,我们建立了两个“低级功能模块”,各个模块都有“开始信号”,“完成信号”,和“单一的功能”(准则2, 3),然后将两个“低级功能模块”组织了起来(准则14),



 


“ 自左向右循环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”组织过后,就会成为完成品。


PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户433387 2012-10-26 20:38

太佩服您的毅力了,学习了,谢谢

用户1696168 2012-10-2 15:37

是不是存在latch了啊!

用户322029 2010-9-27 17:29

谢谢了,受用
相关推荐阅读
用户1609127 2011-10-22 18:26
Verilog的私私细语 - 时钟化和信号的长度
目录 第2章 时钟化和信号的长度 2.01 一个时钟一块数据的概念 2.02 信号时钟化 2.03 深入了解模块的沟通 2.04 电平检测模块的整合(即时事件在时序上的不和谐)      实验八:电...
用户1609127 2011-09-08 12:47
瞎搞Time Quest 和无责任的笔记 第二章
最近整合篇的第二章的构思和灵感都累积不少了,应该是时候开工了。恰好手头上还有一本笔记还没有写完,就是这本瞎搞TimeQuest的第二章。目录笔者也懒得贴了,看过第一章的同学多少也会猜到第二章的内容是什...
用户1609127 2011-08-29 18:21
瞎搞Time Quest 和无责任的笔记 第一章
哎呀 ... 潜水了都有一段时间了,这是最近研究的成果和目标。 话说TimeQuest这个东西真的很搞怪呀,做得笔者不得不从其他的方向去研究它。 好了还是切入正题,TimeQuest用作静态时序的工具...
用户1609127 2011-07-06 17:43
Verilog的私私细语 - 整合的概念
目录         02  第1章  整合的概念          1.01  源码上的整合                   实验一:字面上的整合          1.02  时钟和步骤的定...
用户1609127 2011-06-22 10:18
VerilogHDL那些事儿 - 建模篇v4 + 时序篇v1
VerilogHDL那些事儿 - 建模篇v4 ====== v4 ====== 主要是修改了大量用法上的BUG和极限的精简内容 https://docs.google.com/leaf?id=0B...
用户1609127 2011-06-10 13:19
Verilog HDL的礼物 - Verilog HDL扫盲文
目录 02第0章 Verilog HDL语言扫盲文 030.01 各种的HDL语言 030.02 HDL语言的层次 03 0.03 RTL级和组合逻辑级 040.04 Verilog HDL语言真的那...
EE直播间
更多
我要评论
1
7
关闭 站长推荐上一条 /3 下一条