always@(posedge Clk ornegedge Reset_n) begin if (!Reset_n) counter0 <= 0; elseif (counter0 == MCNT) counter0 <= 0; else counter0 <= counter0 + 1'd1; end
// 定义步骤计数器:在基本刻度结束时加1 reg [3:0] counter1; always@(posedge Clk ornegedge Reset_n) begin if (!Reset_n) counter1 <= 0; elseif (counter0 == MCNT) begin if (counter1 == 9) counter1 <= 0; else counter1 <= counter1 + 1'd1; end end
// 使用 case 语句构建“线性序列” always@(posedge Clk ornegedge Reset_n) begin if (!Reset_n) Led <= 0; elsebegin case (counter1) 0: Led <= 1'd1; 1: Led <= 1'd0; 3: Led <= 1'd1; 4,5: Led <= 1'd1; // 连续状态合并 7,8, 9: Led <= 1'd0; default: Led <= Led; endcase end end endmodule
reg [2:0] counter1; // 8状态循环 always@(posedge Clk ornegedge Reset_n) begin if (!Reset_n) counter1 <= 0; elseif (counter0 == MCNT) counter1 <= counter1 + 1'd1; // 3 位寄存器,溢出自动清零 end
always@(posedge Clk ornegedge Reset_n) begin if (!Reset_n) Led <= 0; elsebegin case (counter1) 3'd0: Led <= sw[0]; 3'd1: Led <= sw[1]; 3'd2: Led <= sw[2]; 3'd3: Led <= sw[3]; 3'd4: Led <= sw[4]; 3'd5: Led <= sw[5]; 3'd6: Led <= sw[6]; 3'd7: Led <= sw[7]; default: Led <= Led; endcase end end endmodule
// 基础计时:仅在 en_counter0 为高时工作 reg [24:0] counter0; always@(posedge Clk ornegedge Reset_n) begin if (!Reset_n) counter0 <= 0; elseif (en_counter0) begin if(counter0 == MCNT0) counter0 <= 0; else counter0 <= counter0 + 1'd1; endelse counter0 <= 0; end
// 8 位计数器(代码同上)
// 空闲计时:仅在 en_counter2 为高时工作 reg [26:0] counter2; always@(posedge Clk ornegedge Reset_n) begin if (!Reset_n) counter2 <= 0; elseif (en_counter2) begin if(counter2 == MCNT2) counter2 <= 0; else counter2 <= counter2 + 1'd1; endelse counter2 <= 0; end
// 核心:使能信号的切换逻辑 always @(posedge Clk ornegedge Reset_n) begin if(!Reset_n) begin en_counter2 <= 1'd1; // 初始进入空闲态 en_counter0 <= 1'd0; endelseif ((counter1 == 7) && (counter0 == MCNT0)) begin en_counter2 <= 1'd1; // 序列结束,开启空闲 en_counter0 <= 1'd0; endelseif (counter2 == MCNT2) begin en_counter2 <= 1'd0; // 空闲结束,开启序列 en_counter0 <= 1'd1; end end
// LED 输出 always@(posedge Clk ornegedge Reset_n) begin if (!Reset_n) Led <= 0; elseif (en_counter2 == 1) Led <= 0; elsebegin case (counter1) 3'd0: Led <= sw[0]; 3'd1: Led <= sw[1]; 3'd2: Led <= sw[2]; 3'd3: Led <= sw[3]; 3'd4: Led <= sw[4]; 3'd5: Led <= sw[5]; 3'd6: Led <= sw[6]; 3'd7: Led <= sw[7]; default: Led <= Led; endcase end end endmodule