当前位置:中国高校自动化网 >> fpga >> 浏览文章

Verilog HDL 教程7 - 建模模板基本结构

文章来源:不详 作者:佚名


该文章讲述了Verilog HDL 教程7 - 建模模板基本结构.

3.1 Verilog建模模板基本结构

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  "n个Task";

             .......          // "n个Task的执行任务"

         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 等于 0 的时候,多半都是用于初始化动作(选择性)。

 

正如准则的要求,“开始信号”和“完成信号”都是必须的。“开始信号”可以视为“片选信号”而“完成信号”如字面上的意思。寄存器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

 

 

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

 

相关文章:
  • Verilog HDL建模教程3 - 低级建模的思路
  • 如何配置FPGA
  • Xilinx ISE 10.x 调用Modelsim SE 6.5仿真的若干问题及其解决方法
  • 上一篇:Verilog HDL 建模教程4 - 组织的概念
    下一篇:Verilog HDL 建模技巧8 - 使用模板的建议
    最近更新