verilog 按鍵控制LED的亮滅狀態

主要功能:按下按鍵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 

 

仿真分析:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章