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位选择器) (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视图,加法器+触发器) 综上,可以看出for循环是可以综合的,而且效率很高。但所消耗的逻辑资源较大。在对速度(时钟周期数)要求不是很高的情况下,可以多用几个时钟周期完成任务,而没有必要用for循环来做。
|
|