以前很少用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 = 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) num = num + 1;
end
end
assign numout = num;
endmodule
综合结果(RTL视图,加法器+触发器)
综上,可以看出for循环是可以综合的,而且效率很高。但所消耗的逻辑资源较大。在对速度(时钟周期数)要求不是很高的情况下,可以多用几个时钟周期完成任务,而没有必要用for循环来做。
用户377235 2014-4-7 22:02