<?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 "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 |
上面的两个写法都是等价的。如果模块是小功能,那么左边的写法很适合。但是一旦模块的功能很复杂,那么右边的写法会凸显出优势。
文章评论(0条评论)
登录后参与讨论