`timescale 1ns / 1ps
module chun1(
input syck,
input rest_n,
output reg [3:0] led,
input key,
input key1
);
//独热码
parameter idle = 3'b001,
s1 = 3'b010,
s2 = 3'b100;
reg [26:0] cnt;
reg [1:0] mm;//表示月份
//内部声明
reg [3:0] cur_state,next_state;
reg [27:0] cnt1;
reg [26:0] cnt2;
parameter delay1=125_000_000; //1s
parameter delay=125_000_0; //20ms
parameter delay20=125_000_0; //20ms//1s计时器
always@(posedge syck or negedge rest_n)begin
if(!rest_n)
cnt1<=0;
else if(cnt1==delay1-1)
cnt1<=0;
else
cnt1<=cnt1+1;
end
//key消抖
always@(posedge syck or negedge rest_n)begin
if(!rest_n)
cnt<=0;
else if(key==1)begin
if(cnt==delay-1)
cnt<=cnt;
else
cnt<=cnt+1;
end
else
cnt<=0;
end//key1消抖
always@(posedge syck or negedge rest_n)begin
if(!rest_n)
cnt2<=0;
else if(key1==1)begin
if(cnt2==delay20-1)
cnt2<=cnt2;
else
cnt2<=cnt2+1;
end
else
cnt2<=0;
endassign flag1 =(cnt==delay-2)?1:0;
assign flag2 =(cnt2==delay20-2)?1:0;
//二段式状态机 描述总状态跳转,现态,次态
always@(posedge syck or negedge rest_n)begin
if(!rest_n)
cur_state<=idle;
else
cur_state<=next_state;
end
//led计数器
always@(posedge syck or negedge rest_n)begin
if(!rest_n)
mm<=0;
else if(cnt1==delay1-1)
mm<=mm+1;
else
mm<=mm;
end
//三段式 描述跳转,条件
always@(*)begin
if(!rest_n)
next_state=idle;
else
case(cur_state)
idle : begin
if (flag1==1 )
next_state = s1;
else if (flag2==1)
next_state = s2;
else
next_state = cur_state; //net_state = idle
end
s1: begin
if (flag1==1)
next_state = s2;
else
next_state = s1;
end
s2: begin
if (flag2==1)
next_state = s1;
else
next_state = s2;
enddefault: next_state = idle;
endcase
end
//三段式状态机动作
always@(posedge syck or negedge rest_n)begin
if(!rest_n)
led<=4'b0000;
else begin
case(cur_state)
idle: led<=4'b1111;
s1: case(mm)
0: led<=4'b1000;
1: led<=4'b0100;
2: led<=4'b0010;
3: led<=4'b0001;
default: led<=4'b0000;
endcase
s2: case(mm)
0: led<=4'b0001;
1: led<=4'b0010;
2: led<=4'b0100;
3: led<=4'b1000;
default: led<=4'b0000;
endcasedefault: led<=4'b0000;
endcase
end
end
endmodule
连接配置: