verilog是可以使用for但是功能和C是有点不一样的。
看如下代码,这个语法的意思是把led[0]-led[7]同时置0,实际从电路方面理解是就把赋值这个回路复制了8次,所以这里特别注意也是并行执行的。
for(i=0;i<8;i=i+1)
led_r[i] <= 0;
module led(
input clk,
input rst_n,
input dir,
output [7:0] led
);
reg [31:0] cnt;
reg [7:0] led_r;
reg [7:0] i;
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
cnt <= 0;
led_r <= 1;
end
else
begin
if(cnt == 50_000)
begin
cnt <= cnt + 1;
for(i=0;i<8;i=i+1)
led_r[i] <= 1;
end
else if(cnt >= 100_000)
begin
cnt <= 0;
for(i=0;i<8;i=i+1)
led_r[i] <= 0;
end
else
begin
cnt <= cnt + 1;
end
end
end
assign led = led_r;
endmodule
②看下仿真的结果,可以看到CNT到100_000的时候,LED的8都被置0了。
虽然说可以用for,但是一般情况下尽量不要用,
for(i=0;i<8;i=i+1)
led_r[i] <= 1;
比如上面这个语法可以写成 led_r = 8'b1111_1111;效果是一样的。
少用for循环,避免和C语言进行混淆