用case来选择结果感觉cnt1一直等于0或者是case只选择了cnt==0
上板后只有case语句第一个状态有用,比如按下KEY1没有从左往右亮只有左面第一个亮
module beauey_led(
input clk,
input rst,
output reg[3:0]led,
input[3:0]key
);
reg [27:0]cnt0;
reg [1:0]cnt1;
wire add_cnt1;
wire end_cnt1;
wire add_cnt0;
wire end_cnt0;
//计数器计数2秒
always@(posedge clk or negedge rst)begin
if(!rst)begin
cnt0<=0;
end
else if(add_cnt0)begin
if(end_cnt0)
cnt0<=0;
else
cnt0<=cnt0+1;
end
end
assign add_cnt0=1;
assign end_cnt0=add_cnt0&&cnt0==10_000_000-1;
//计数器用于流水灯状态选择四种状态
always@(posedge clk or negedge rst)begin
if(!rst)begin
cnt1<=1'd0;
end
else if(add_cnt1)begin
if(end_cnt1)
cnt1<=1'd0;
else
cnt1=cnt1+1'd1;
end
end
assign add_cnd1 = end_cnt0;
assign end_cnd1 = add_cnt1 && (cnt1==1'd3);
//识别按键,切换模式
always@(posedge clk or negedge rst)begin
if(!rst)begin
led<=4'b0000;
end
else if(key[0]==0)//按下key0流水灯从左往右亮
case(cnt1)
2'd0:led<=4'b0001;
2'd1:led<=4'b0010;
2'd2:led<=4'b0100;
2'd3:led<=4'b1000;
endcase
else if (key[1]==0)//按下key1流水灯从右往左亮
case(cnt1)
2'd0:led<=4'b1000;
2'd1:led<=4'b0100;
2'd2:led<=4'b0010;
2'd3:led<=4'b0001;
endcase
else if(key[2]==0)//按下key3闪烁
case(cnt1)
2'd0:led<=4'b0101;
2'd1:led<=4'b1010;
2'd2:led<=4'b0101;
2'd3:led<=4'b1010;
endcase
else if (key[3]==0)
led<=4'b1111;
else
led<=4'b0000;
end
endmodule