原创 [Verilog HDL 建模技巧 :低级建模 仿顺序操作·思路篇] 7 - 模板基本结构

2010-6-5 13:48 2679 6 6 分类: FPGA/CPLD

3.1 模板基本结构



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


module Template


(


    CLK, RSTn,


    ...... ,  // "n个输入输出"


    Start_Sig , Done_Sig 


);



       input CLK;


       input RSTn;


       input Start_Sig;


       input Done_Sig;


       ......  // "n个输出输入声明"



       /*******************************************/



      reg [3:0]i;


      reg isDone;



      always @ ( posedge CLK or negedge RSTn )


           if( !RSTn )


               begin


                   i <= 4'd0;  isDone <= 1'b0;


                   ......   // 任何复位的动作


               end


           else if( Start_Sig )


               case( i )           


                   4'b0 :  // 一般都是用于初始化 


                   Init;



                   ......   // 任何相关的步骤



                   4'b n + 1, 4'b n + 2 :  //最后两个步骤用来产生完成信号


                   Done;                             


               endcase



         /*******************************************/



         task Init;



             begin 


                ......          //任何初始化的动作


                i <= 1 + 1b'1;  //指向下一个步骤


             end



         endtask



         /*******************************************/



         task  "nTask";


             .......          // "nTask的执行任务"


         endtask



         /*******************************************/



        task Done; //产生Done信号



            if( isDone == 1 ) begin isDone <= 1'b0; i <= 4'd0; end


            else begin isDone <= 1'b1; i <= i + 1'b1; end   


        endtask



        /*******************************************/



        assign Done_Sig = isDone;


        ......  // 相关的输出



    endmodule



从上述中,模板的基本结构有以下的特征:


 


1) Start_Sig 和 Done_Sig是固定的。


2) 寄存器i用于控制次序步骤。


3) 最后两个i步骤用于产生完成信号。


4) 等于 的时候,多半都是用于初始化动作(选择性)。


 


正如准则的要求,“开始信号”和“完成信号”都是必须的。“开始信号”可以视为“片选信号”而“完成信号”如字面上的意思。寄存器i有一个重要的功能,它指向任何下一个步骤,而通常所编写的格式如下:


 


      i <= i + 1;


 


除此之外该模板还引入了 “task - endtask”。目的是为了提升和 “结构性” 。新手们应该知道,使用V语言如果没有良好的编程风格,代码的 “可读性” 是非常的糟糕。


 


在这里我先简单复习一下,“task - endtask” 的用法 :


 




  


  reg [3:0]i;


  reg isDone;


  reg [7:0]rData;



  always @ ( posedge CLK or negedge RSTn)


  if( !RSTn )


      begin


          i <= 4'd0


          isDone <= 1'b0;


          rData <= 8'd0;


      end


  else 


      case ( i )



          4'd0 : i <= i + 1;



              ......



      endcase




  


  reg [3:0]i;


  reg isDone;


  reg [7:0]rData;



  always @ ( posedge CLK or negedge RSTn )


  if( !RSTn )


      begin


          i <= 4'd0;


          isDone <= 1'b0;


          rData <= 8'd0;


      end


  else


      case( i )


      


          4'd0 : Next;



          ......


    


      endcase



  /**********************************/



  


  task Next


 


     i <= i + 1'b1;


 


  endtask




 


上面的两个写法都是等价的。如果模块是小功能,那么左边的写法很适合。但是一旦模块的功能很复杂,那么右边的写法会凸显出优势。


PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条