电子技术论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1517|回复: 0

for语句在Verilog中的使用心得

[复制链接]

624

主题

627

帖子

416

积分

专栏作家

Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25

积分
416
发表于 2015-5-26 10:14:00 | 显示全部楼层 |阅读模式
以前很少用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位选择器)
RTL视图.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) num = num + 1;
  end
end

assign numout = num;

endmodule

综合结果(RTL视图,加法器+触发器)
加法器 触发器.jpg

综上,可以看出for循环是可以综合的,而且效率很高。但所消耗的逻辑资源较大。在对速度(时钟周期数)要求不是很高的情况下,可以多用几个时钟周期完成任务,而没有必要用for循环来做。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|电子技术论坛 ( 鄂ICP备09003585号-2 )

GMT+8, 2019-3-25 00:25 , Processed in 0.050187 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2018 Comsenz Inc.

快速回复 返回顶部 返回列表