17,verilog之for循环

注:学习、交流就在博主的个人weixin公众号 “FPGA动力联盟” 留言或直接+博主weixin “fpga_start” 私信~

本篇介绍目前在verilog语言中,唯一可以被综合成电路的循环:常数循环次数的for循环。for循环的一般形式是:

for(variable = start_value;continue_condition; circle_express)
begin
       operations……
end

其中,varible是一个变量名;start_value是变量的初始值;continue_condition是循环的继续条件;circle_express是每个循环的步进操作;operations是每次循环的操作。要想for循环能够被综合,循环的次数必须为确定值。

下面举例说明for循环的可综合特性:

for(loop=0; loop<10; loop=loop+1)//可综合,循环次数为10
for(loop=0; loop<10; loop=loop+2)//可综合,循环次数为5
for(loop=variable; loop<10;loop=loop+1)//初始值为变量不可综合
for(loop=0; loop

下面给出for循环实际应用于多级寄存器链的关键代码:

module DFF_link(
    input  clk,
    input  rst,
    input  [7:0] data_i,
    output [7:0] data_o
);
   localparam  Number_reg = 16;  //定义需要循环的寄存器数量
   reg[7:0] dff[Number_reg-1:0];//本例为16个寄存器

   integer loop;//循环变量最好定义成integer
                   //当定义成reg型时要注意loop位宽                   
   always@(posedge clk or negedge rst)
      if(!rst)
         begin
            for(loop= 0; loop <= Number_reg-1; loop = loop+1)
                 dff[loop]<= 8'd0
         end
      else
         begin
            dff[0]<=data_i;
            for(loop= 1; loop <= Number_reg-1; loop = loop+1)
                dff[loop]<= dff[loop-1]
         end                    
  assigndata_o = dff[15];   
endmodule

我们需要明白,在实际电路中并没有loop这个变量,它只在综合里起作用,告诉综合器软件要重复几遍for操作。

for循环在实际的工程中,有非常大的实用价值,可以极大的简化代码,提高工作效率,我们可以认为就如同c语言中for循环功能一样,但在verilog中使用时要注意它的使用规则与c语言不同。

参考文献:

1,verilog传奇——从电路出发的HDL代码设计

2,verilog编程艺术

你可能感兴趣的:(verilog,for循环)