代码如下:
module led (
input clk,
input rst_n,
output reg [3:0] led
);
// 状态定义
parameter BLINK = 2'b00;
parameter FLOW = 2'b01;
parameter FILL_UP = 2'b10;
// 状态变量
reg [1:0] state, next_state;
// 计时器
reg [27:0] state_timer;
reg [25:0] display_timer;
// 显示相关寄存器
reg toggle;
reg [3:0] flow_led;
reg [3:0] fill_led;
// 状态切换控制
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
state <= BLINK;
else if (state_timer >= 28'd200_000_000)
state <= next_state;
end
// 下一个状态逻辑
always @(*) begin
case (state)
BLINK: next_state = FLOW;
FLOW: next_state = FILL_UP;
FILL_UP: next_state = BLINK;
default: next_state = BLINK;
endcase
end
// 计时器逻辑
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
state_timer <= 28'd0;
display_timer <= 26'd0;
end else begin
if (state_timer >= 28'd200_000_000)
state_timer <= 28'd0;
else
state_timer <= state_timer + 1;
if (display_timer >= 26'd25_000_000)
display_timer <= 26'd0;
else
display_timer <= display_timer + 1;
end
end
// LED 模式逻辑
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
led <= 4'b0000;
toggle <= 1'b0;
flow_led <= 4'b0001;
fill_led <= 4'b0001;
end else if (display_timer == 26'd25_000_000) begin
case (state)
BLINK: begin
toggle <= ~toggle;
led <= toggle ? 4'b1111 : 4'b0000;
end
FLOW: begin
led <= flow_led;
if (flow_led == 4'b1000)
flow_led <= 4'b0001;
else
flow_led <= flow_led << 1;
end
FILL_UP: begin
led <= fill_led;
if (fill_led != 4'b1111)
fill_led <=fill_led+1;
end
endcase
end
end
endmodule
代码功能说明:
3个状态对应led的三种点亮模式,以此循环往复。
核心要点:
状态位实现led灯的模式变化。
总结:
并行执行,关键在于对于目标的把握。