硬件开发板说明:
1、cyclone III:EP3C5E144C8
2、时钟24M
题目:模拟交通灯效果,设LED1为红灯,持续10S,LED2为蓝灯,保持3S,LED3为绿灯,持续15秒,前12S 一直亮,后3S闪烁。(提示,使用状态机)
代码说明:
这个是我上工程教育中级的一道题,要求使用状态机进行实现,当时老师并没有让加上复位信号来写,我就简单这样写了,下面是代码。
代码实现:
module state_machine(
input clk, //24M
output reg[2:0]led
);
// 寄存器变量
reg [1:0]state;
reg [29:0]cnt;
reg [23:0]cnt_p;
reg p;
// 常数定义
parameter T_10 = 30'd239999999;
parameter T_13 = 30'd311999999;
parameter T_25 = 30'd599999999;
parameter T_28 = 30'd671999999;
// 初始化
initial
begin
cnt <= 30'd0;
cnt_p <= 24'd0;
p <= 1'd0;
end
// 状态机实现
always @(posedge clk)
begin
case(state)
2'b00: // 状态1
begin
led <= 3'b001;
if(cnt == T_10) begin
state <= 2'b01;
end else begin
cnt <= cnt + 30'd1;
end
end
2'b01: // 状态2
begin
led <= 3'b100;
if(cnt == T_13) begin
state <= 2'b10;
end else begin
cnt <= cnt + 30'd1;
end
end
2'b10: // 状态3
begin
led <= 3'b010;
if(cnt == T_25) begin
state <= 2'b11;
end else begin
cnt <= cnt + 30'd1;
end
end
2'b11: // 状态4
begin
led[0] <= 0;
led[1] <= p; // 使用变量p作为闪烁参考
led[2] <= 0;
if(cnt == T_28) begin
cnt <= 30'd0;
state <= 2'b00;
end else begin
cnt <= cnt + 30'd1;
end
if(cnt_p == 24'd23999999) begin // 闪烁
cnt_p <= 24'd0;
p <= ~p;
end else begin
cnt_p <= cnt_p + 24'd1;
end
end
endcase
end
endmodule