【FPGA基础快速入门4】实战-----按键控制LED的学习

这篇博客介绍了使用FPGA进行按键控制LED灯的基础知识,包括硬件设计和程序编写。硬件部分涉及5个按键,其中1个用于复位,4个用于控制LED灯的不同效果。程序设计中,利用计数器和状态计数器实现了0.2秒间隔的LED灯模式切换,按键0至3分别对应不同流水灯方向和闪烁效果。通过Verilog HDL编写了相应的控制模块。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【FPGA基础快速入门4】按键控制LED学习

按键的硬件设计

在这里插入图片描述
正点原子开发板中的按键模块的硬件设计如上图所示,由五个按键,第一个是 FPGA主芯片的复位按键,下面四个是控制按键。按键按下的时候会呈现一个低电平,这样话电路就导通。

按键实现的效果

按键状态LED显示效果
无按键按下四个LED灯全灭
按下KEY0自右向左的流水灯
按下KEY1自左向右的流水灯
按下KEY2四个LED灯同时闪烁
按下KEY3四个LED灯全亮

系统框图

在这里插入图片描述
FPGA的主芯片,输入50Hhz的系统时钟和rst复位信号,然后由四个按键控制LED灯的动作。每隔0.2S就对LED灯状态进行动作,所以需要一个0.2s的计数器和一个状态计数器,然后通过选择LED模式进行控制四个LED灯的每种模式状态。

程序编写

// 按键控制LED包括三个模块:计数器、状态计数器、按键控制LED模块
module key_led(
    input               clk,            //定义系统时钟
	 input              rst_n,          //定义复位信号
	 
	 input      [3:0]   key,            //定义4位的按键信号的寄存器变量
	 output reg [3:0]   led             //定义4个LED灯的寄存器类型变量
);
//reg define
reg [23:0]  cnt;                        //定义24位的计数,算出方法:系统频率50Hz,周期为20ns,而计数器为0.2s,得到计数次数为0.2s/20ns=10000000,转换成二进制就是24位
reg [ 1:0]  led_ctrl;                   //led的每个灯的状态控制

//0.2s的计数器
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)
	     cnt <= 24'd0;                  //复位时计数置零
	 else 
	    if(cnt < 24'd1000_0000)
		     cnt <= cnt + 1'b1;          //小于0.2s时,计数累加
		 else 
		     cnt <= 24'd0;               //等于0.2s时,计数置零  
end


//每隔0.2s改变LED四个灯状态计数器
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)
	     led_ctrl <= 2'd0;                 //复位按下,led四个等全部熄灭
	 else 
	    if(cnt == 24'd1000_0000)
		     led_ctrl <= led_ctrl + 1'b1;  //计数等于0.2s时,led四个灯依次状态累加
		 else 
		     led_ctrl <= led_ctrl;          //计数小于0.2s时,led四个灯状态不变
end

//根据按键来改变各个状态下所有点亮的LED
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)
	     led <= 4'b0;                 //复位按下,四个灯熄灭
	 else 
	     if(key[0] == 1'b0)           //按键0按下,从右向左流水灯
		     case(led_ctrl)           //由四个灯的状态决定
			  2'd0: led <= 4'b1000;   //开发板上的灯的高位是在右边,所以程序里面从右开始置1
			  2'd1: led <= 4'b0100;
			  2'd2: led <= 4'b0010;
			  2'd3: led <= 4'b0001;
			  endcase
		  else if(key[1] == 1'b0)      //按键1按下,从左向右的流水灯
		     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)       //按键2按下,4个LED灯进行闪烁
		      case(led_ctrl)
			  2'd0: led <= 4'b1111;      
			  2'd1: led <= 4'b0000;
			  2'd2: led <= 4'b1111;
			  2'd3: led <= 4'b0000;
			  endcase
			else if(key[3] == 1'b0)      //按键3按下,全亮
			  led <= 4'b1111;
			else 
			  led <= 4'b0000;            //无按键按下时,全灭
			  
end

endmodule
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周猿猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值