Verilog For

posted Apr 6, 2014, 6:22 PM by 葉宏
http://bbs.ednchina.com/BLOG_ARTICLE_3019676.HTM?click_from=8800020767,8914786776,2014-04-07,EDNCOL,NEWSLETTER

 [博客大赛]Verilog之for语句发布时间:2014-03-25 12:03:07
技术类别:CPLD/FPGA

以前很少用for语句,以为是不可综合的。在印象中好像只用循环生成(for...generate)语句综合过多个模块。最近在仔细研读《轻松成为设计高手——Verilog HDL使用精解》这本书,才知道for语句在组合逻辑中大有用处。

 
(1)for用在纯组合逻辑中
举例:4位左移器(将低4位输入的数移到高4位)
//Leftshift for 4 bits
module For_Leftshift(
input wire [3:0]inp,
input wire L_EN,
output reg [7:0]result
);
 
integer i;
always@(inp or L_EN)
begin
 result[7:4] = 0;
 result[3:0] = inp;
 if(L_EN == 1)
 begin
  for(i=4;i<=7;i=i+1)
  begin
   result[i] = result[i-4];
  end
  result[3:0] = 0;
 end
end
 
endmodule
 
综合结果(RTL视图,实际是一个4位选择器)
1.jpg
(2)for不仅可以用在组合逻辑中,而且还可以用在时序逻辑中,用于在1个周期类完成整个for循环。
举例:在一个周期类完成对输入总线中高电平位的计数,则利用for循环实现加法器
module For_Counter(
input wire clk,
input wire rst_n,
input wire [12:0] data,
output wire [3:0] numout
);
integer i;
reg[3:0] num;
 
always @(posedge clk)
 begin
 if(!rst_n)
  num = 0;
 else
  begin
  for(i=0;i<13;i=i+1)
   if(data[i]) num = num + 1;
  end
 end
 
assign numout = num;
 
endmodule
 
综合结果(RTL视图,加法器+触发器)
 
2.jpg
 
综上,可以看出for循环是可以综合的,而且效率很高。但所消耗的逻辑资源较大。在对速度(时钟周期数)要求不是很高的情况下,可以多用几个时钟周期完成任务,而没有必要用for循环来做。



Comments