verilog中for循环的使用

分类: FPGA—verilog |
对于下面的for循环语句:
1 for(i=0;i<<span style="box-sizing: border-box; outline: 0px; word-break: break-all; color: rgb(128, 0, 128);">16;i++) 2 DoSomething();
reg [3:0] counter;
always @(posedge clk)
if(syn_rst)
counter<=4'b0;
else
counter<=counter+1;
always @(posedge clk)
begin
case(counter)
4'b0000:
4'b0001:
......
default:
endcase
end
http://img837.ph.126.net/C8n5BDIuS8bPhI2lQfzJFg==/776026510793208512.jpg
https://images0.cnblogs.com/blog2015/674315/201505/221114535571415.png
不过在使用了阻塞赋值语句后,得到了目的,但是由于for语句的综合效率不高,且在时序逻辑中一般采用非阻塞赋值,因此最好不能这样写
----转自特权同学《深入浅出玩转FPGA》
示例二:for用在纯组合逻辑中
举例:4位左移器(将低4位输入的数移到高4位)
综合结果(RTL视图,实际是一个4位选择器)
示例三:for不仅可以用在组合逻辑中,而且还可以用在时序逻辑中,用于在1个周期类完成整个for循环。
1 module For_Counter( 2 input wire clk, 3 input wire rst_n, 4 input wire [12:0] data, 5 output wire [3:0] numout 6 ); 7 integer i; 8 reg[3:0] num; 9 10 always @(posedge clk) 11 begin 12 if(!rst_n) 13 num = 0; 14 else 15 begin 16 for(i=0;i<<span style="box-sizing: border-box; outline: 0px; word-break: break-all; color: rgb(128, 0, 128);">13;i=i+1) 17 if(data[i]) num = num + 1; 18 end 19 end 20 21 assign numout = num; 22 23 endmodule
综合结果(RTL视图,加法器+触发器)