主要功能:按下按鍵0,從左到右點亮led;按下按鍵1,從右到左點亮led;按下按鍵2時,四個led間隔亮滅;按下按鍵3時,點亮全部led。亮滅間隔時間爲0.5s,時鐘爲50MHz.
//author :bronceyang
//time :2020年4月16日
//version: 1.0
//功能:實現按鍵控制led的亮滅
module key_led(
input sys_clk,
input sys_rst_n,
input [3:0]key,
output reg [3:0]led
);
//parameter define
parameter COUNTER_T=25'd25_000_000;
//reg define
reg [24:0]cnt_time;
reg [1:0]led_control;
//wire define
//*******************************************
// main()
//*******************************************
//產生0.5s的計數器
always @(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)
cnt_time<=25'd0;
else if (cnt_time<COUNTER_T)
cnt_time<=cnt_time+1'b1;
else
cnt_time<=25'd0;
end
//led 狀態的選擇
always @(posedge sys_clk or negedge sys_rst_n)begin
if (!sys_rst_n)
led_control<=2'b00;
else if (cnt_time==COUNTER_T)
led_control<=led_control+1'b1;
else
led_control<=led_control;
end
//識別按鍵輸入,輸出相應的led狀態
always@(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)
led<=4'b0000; //LED 高電平點亮,低電平熄滅
else if (key[0]==1'b0) //按鍵按下輸出低電壓
case(led_control)
2'b00:led<=4'b1000;
2'b01:led<=4'b0100;
2'b10:led<=4'b0010;
2'b11:led<=4'b0001;
default:led<=4'b0000;
endcase
else if (key[1]==1'b0)
case(led_control)
2'b00:led<=4'b0001;
2'b01:led<=4'b0010;
2'b10:led<=4'b0100;
2'b11:led<=4'b1000;
default:led<=4'b0000;
endcase
else if (key[2]==1'b0)
case(led_control)
2'b00:led<=4'b1111;
2'b01:led<=4'b0000;
2'b10:led<=4'b1111;
2'b11:led<=4'b0000;
default:led<=4'b0000;
endcase
else if (key[3]==1'b0)
led<=4'b1111;
else
led<=4'b0000;
end
endmodule
testbench:
`timescale 1 ns/ 1 ns
module key_led_tb();
parameter T = 20;
reg [3:0] key ;
reg sys_clk ;
reg sys_rst_n;
reg key_value;
wire [3:0] led;
initial begin
key <=4'b1111;//按鍵初始狀態爲全斷開
sys_clk <=1'b0; //初始時鐘爲低電平
sys_rst_n <=1'b0; //復位信號初始爲低電平
#T sys_rst_n <=1'b1; //一個時鐘週期後復位信號拉高
#600_000_020 key[0] <=0; //0.6s時按下按鍵1
#2000_000_000 key[0] <=1;
key[1] <=0; //2s後鬆開按鍵1,按下按鍵2
#2000_000_000 key[1] <=1;
key[2] <=0; //2s後鬆開按鍵2,按下按鍵3
#2000_000_000 key[2] <=1;
key[3] <=0; //2s後鬆開按鍵3,按下按鍵4
#2000_000_000 key[3] <=1; //2s後鬆開按鍵4
end
仿真分析: