無按鍵按下時, 全滅;
按鍵1按下時, 自右向左的流水效果;
按鍵2按下時, 自左向右的流水效果;
按鍵3按下時,閃爍;
按鍵4按下時, 全亮;
//***********Copyright (c)************//
//-------------------------------------
// File name: my_key_led
// Last modified Date: 2020/6/10 22:30
// Last Version: V1.1
// Descriptions: 按鍵控制LED
// 無按鍵 全滅
// key0 右-左流水燈
// key1 左-右流水燈
// key2 全閃爍
// key3 全亮
//-------------------------------------
// LED流水燈引腳分配,高電平點亮
// LED0 D11
// LED1 C11
// LED2 E10
// LED3 F9
// sys_clk E1
// sys_rst_n M1
// key0 E16
// key1 E15
// key2 M2
// key3 M16
//-------------------------------------
//*************************************//
module my_key_led
(
input sys_clk, //系統時鐘50MHZ
input sys_rst_n, //復位,低電平有效
input [3:0] key, //4個key
output reg [3:0] led //4個LED燈
);
//reg define
reg [23:0] counter ; //定時200ms,需要24位。
reg [1:0] led_ctrl ; //led_ctrl led控制
//計數器對系統時鐘計數,計時0.2秒。0.2s/20ns=1000_0000(d)
always @(posedge sys_clk or negedge sys_rst_n) //時鐘上升沿,復位下降沿
begin
if (!sys_rst_n) //如果復位
counter <=24'd0; //計數器清0,重新開始計時
else //if嵌套
if (counter<24'd1000_0000) //沒有計時到0.2s
counter<=counter+1'b1; //計數器加1
else
counter<=24'd0; //到0.2s,計數器清0
end
//狀態計數器[1;0] 兩位二進制,用於選擇led燈四個狀態
always @(posedge sys_clk or negedge sys_rst_n)
begin
if(!sys_rst_n)
led_ctrl<=2'd0;
else
if(counter==24'd1000_0000)
led_ctrl<=led_ctrl+1'b1;
else
led_ctrl<=led_ctrl;
end
//按鍵改變LED狀態
always @(posedge sys_clk or negedge sys_rst_n)
begin
if(!sys_rst_n)
led<=4'b0000;
else
if(key[0]==1'b0) //右-左流水燈
case(led_ctrl)
2'd0: led<=4'b1000;
2'd1: led<=4'b0100;
2'd2: led<=4'b0010;
2'd3: led<=4'b0001;
endcase
else if(key[1]==1'b0) //左-右流水燈
case(led_ctrl)
2'd0: led<=4'b0001;
2'd1: led<=4'b0010;
2'd2: led<=4'b0100;
2'd3: led<=4'b1000;
endcase
else if(key[2]==1'b0) //全閃爍
case(led_ctrl)
2'd0: led<=4'b0000;
2'd1: led<=4'b1111;
2'd2: led<=4'b0000;
2'd3: led<=4'b1111;
endcase
else if(key[3]==1'b0) //全亮
led<=4'b1111;
else
led<=4'b0000; //無按鍵按下時, LED熄滅
end
endmodule