用状态机写一个 LED流水灯的FPGA代码
采用分层结构,包括top文件,diplay文件,fenpin文件
编辑top文件
module LEDBlink(
input wire clk,
input wire rst_n,
input wire key,
output wire [5:0] led
);
wire en_1hz;
fenpin u_fenpin(
.clk (clk),
.rst_n (rst_n),
.en (en_1hz)
);
display u_display(
.clk (clk),
.rst_n (rst_n),
.en (en_1hz),
.key (key),
.led (led)
);
endmodule
编辑时钟
module fenpin(
input wire clk,
input wire rst_n,
output reg en
);
parameter CLK_FREQ = 50_000_000;
localparam CNT_MAX = CLK_FREQ - 1;
reg [25:0] cnt;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
cnt <= 0;
en <= 0;
end else begin
if (cnt == CNT_MAX) begin
cnt <= 0;
en <= 1;
end else begin
cnt <= cnt + 1;
en <= 0;
end
end
end
endmodule
编辑LED
module display(
input wire clk,
input wire rst_n,
input wire en,
input wire key,
output reg [5:0] led
);
reg [5:0] state;
reg pause_flag;
reg [2:0] key_sync;
wire key_negedge;
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
key_sync <= 3'b111;
else
key_sync <= {key_sync[1:0], key};
end
assign key_negedge = (key_sync[2:1] == 2'b10);
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
pause_flag <= 0;
else if (key_negedge)
pause_flag <= ~pause_flag;
end
# 使用状态机的思想(通过 state 的移位实现状态流转)
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
state <= 6'b000001;
end else if (en && !pause_flag) begin
state <= {state[4:0], state[5]};
end
end
always @(posedge clk) begin
led <= state;
end
endmodule
流水灯效果:
中断效果:
复位效果:
总结
天天学习。