module led_ctrl3( clk, rst_n, sw, led_out ); input clk; input rst_n; input [7:0] sw; output reg led_out; //counter0用于计数一秒钟 reg [25:0] counter0; //counter1用于计数0.25秒 reg [25:0] counter1; //counter2用于计数0到7 reg [2:0] counter2; //标记可以闪烁了 reg flag; //50M cycles parameter MCNT1S = 50_000_000; //12.5M cycles parameter MCNT025S = 12_500_000; //控制flag状态 //flag为0时为空闲状态,led熄灭,counter0开始计数到1秒 //flag为1时为忙碌状态,led动态闪烁,counter1和counter2正常计数 always@(posedge clk or negedge rst_n) begin if(!rst_n) begin flag <= 0; end elseif(counter0 == MCNT1S -1 ) begin flag <= 1; end elseif( (counter1 == MCNT025S -1) && (counter2 == 7) ) begin flag <= 0; end else begin flag <= flag; end end //计数空闲的1秒 always@(posedge clk or negedge rst_n) begin if(!rst_n) begin counter0 <= 0; end elseif(flag == 0) begin if(counter0 == MCNT1S -1)begin counter0 <= 0; end else begin counter0 <= counter0 + 1; end end end //负责在flag为1时计算0.25秒 always@(posedge clk or negedge rst_n) begin if(!rst_n) begin counter1 <= 0; end elseif(flag == 1) begin if(counter1 == MCNT025S - 1) begin counter1 <= 0; end else begin counter1 <= counter1 + 1; end end end //当flag为1时,counter2每当counter1计满时自增1 //如果counter1和counter2都计满,则进入空闲时刻 always@(posedge clk or negedge rst_n) begin if(!rst_n) begin counter2 <= 0; end elseif(flag == 1) begin if(counter1 == MCNT025S - 1) begin if(counter2 == 7) begin counter2 <= 0; end else begin counter2 <= counter2 + 1; end end end end //负责根据counter2决定led_out输出 always@(posedge clk or negedge rst_n) begin if(!rst_n) begin led_out <= 0; end else begin if(flag) begin case(counter2) 0:led_out <= sw[0]; 1:led_out <= sw[1]; 2:led_out <= sw[2]; 3:led_out <= sw[3]; 4:led_out <= sw[4]; 5:led_out <= sw[5]; 6:led_out <= sw[6]; 7:led_out <= sw[7]; endcase end end end endmodule