FPGA——按键控制led灯

一、实验环境

quartus 18.1
modelsim
vscode
Cyclone IV开发板

二、实验任务

使用开发板上的四个按键控制四个LED灯。按下不同的按键时,四个LED灯显示不同效果。
在这里插入图片描述

三、系统设计

四个按键外加时钟和复位信号作为输入,两个计数器模块分别用于0.2s时间的计数和状态的计数。led模式选择模块根据状态计数器的改变,来改变四个led的状态,形成不同的样式。
在这里插入图片描述

四、实验过程

4.1 编写verilog代码

module key_led(
	input 				clk  ,//时钟50MHz
	input 				rst_n,//复位信号,下降沿有效negtive
	input 	[3:0]		key  ,//四个按键
	
	output 	reg [3:0]	led   //四个led灯
	
);

parameter TIME = 24'd10_000_000;//0.2S
reg [23:0]	cnt ;//计数器0.2S
reg [1:0]	state;//记录四个led状态

//0.2s计数器模块
always@(posedge clk or negedge rst_n)begin
	if(!rst_n)begin//复位
		cnt <= 24'd0;//计数器清0
	end 
	else if(cnt == TIME - 1)begin//记满10_000_000,0~9_999_999
		cnt <= 24'd0;//计数器清0
	end 
	else begin
		cnt <= cnt + 1'd1;//其他情况下计数器加1
	end 
end 

//状态计数模块
always@(posedge clk or negedge rst_n)begin
	if(!rst_n)begin//复位信号
		state <= 2'd0;//状态清0
	end 
	else if(cnt == TIME - 1)begin//记满10_000_000,0~9_999_999 0.2s
		state <= state + 2'd1;//状态加1
	end 
	else begin
	state <= state;//其他情况状态保持不变
	end 
end 

//状态控制led模块
always@(posedge clk or negedge rst_n)begin
	if(!rst_n)begin//复位信号
		led <= 4'b0000;//led全灭
	end 
	else if(key[0] == 0)begin//右边第1个按键按下,按键低电平0有效
		case(state)//判断状态的值
			2'd0: led <= 4'b0001;//右边第1个led灯亮
			2'd1: led <= 4'b0010;//右边第2个led灯亮
			2'd2: led <= 4'b0100;//右边第3个led灯亮
			2'd3: led <= 4'b1000;//右边第4个led灯亮
			default:;//默认情况不能忘,可以不写,但是要把stat情况考虑完
		endcase 
	end 
	else if(key[1] == 0)begin//右边第2个按键按下,按键低电平0有效
		case(state)//判断状态的值
			2'd0: led <= 4'b1000;//左边第1个led灯亮
			2'd1: led <= 4'b0100;//左边第2个led灯亮
			2'd2: led <= 4'b0010;//左边第3个led灯亮
			2'd3: led <= 4'b0001;//左边第4个led灯亮
		default:;
		endcase 
	end 
	else if(key[2] == 0)begin//右边第3个按键按下,按键低电平0有效
		case(state)
			2'd0: led <= 4'b1111;//全亮
			2'd1: led <= 4'b0000;//全灭
			2'd2: led <= 4'b1111;//全亮
			2'd3: led <= 4'b0000;//全灭
		default:;
		endcase 
	end
	else if(key[3] == 0)begin//右边第4个按键按下,按键低电平0有效
		case(state)
			2'd0: led <= 4'b1111;//全亮
			2'd1: led <= 4'b1111;//全亮
			2'd2: led <= 4'b1111;//全亮
			2'd3: led <= 4'b1111;//全亮
		default:;
		endcase 
	end
	else begin
		led <= 4'b0000;//其他情况默认4个led灯全灭
	end 
end 
endmodule 

4.2 引脚配置

在这里插入图片描述

五、仿真

5.1 仿真代码

`timescale 1ns/1ns//单位/精度
module key_led_tb();

reg 		clk  ;//时钟信号
reg 		rst_n;//复位信号
reg	 [3:0]	key  ;//按键信号

wire [3:0]	led  ;//led灯信号

parameter TIME  = 10;//间隔时间,由10_000_000变为10,便于仿真观察
parameter CYCLE = 20;//周期20ns
always #(CYCLE/2) clk = ~clk;//每10ns翻转一次,刚好模拟时钟周期50MHz

initial begin
	clk   = 1'b0;//初始时钟为低电平
	rst_n = 1'b0;//复位信号置0,下降沿有效,初始化
	#(CYCLE);//时钟20ns
	rst_n = 1'b1;//复位信号置1
	#(CYCLE * TIME * 4);//4个led灯,4个间隔,所以乘以4
	key   = 4'b1110;//按下右边第1个按键
	#(CYCLE * TIME * 4);
	key   = 4'b1101;//按下右边第2个按键
	#(CYCLE * TIME * 4);
	key   = 4'b1011;//按下右边第3个按键
	#(CYCLE * TIME * 4);
	key   = 4'b0111;//按下右边第4个按键
	#(CYCLE * TIME * 4);
	$stop;//停止
end 

//实例化模块
key_led	 #(.TIME (TIME)) u_key_led

(
.clk  		(clk)  ,//时钟50MHz
.rst_n		(rst_n),//复位信号,下降沿有效
.key  		(key)  ,//按键信号
             
.led		(led)//led灯
); 
endmodule 

5.2 仿真结果

在这里插入图片描述

六、实验结果

七、总结

本次实验除了使用了计数的寄存器,还引入了状态寄存器,使得逻辑结构更加清晰直观,但是本次实验中我们没有进行按键消抖,因此必须把按键按住不放才能实现led灯对应的状态。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验目的: 通过 FPGA 实现按键控制 LED 的亮灭,加深对 FPGA 的理解和应用。 实验器材: - FPGA 开发板(例如 DE10-Lite) - USB 线 - 按键模块 - LED 模块 实验步骤: 1. 搭建硬件电路 将按键模块和 LED 模块插入 FPGA 开发板的相应引脚上,并将 FPGA 开发板与电脑连接。 按键模块连接方式: - K1 和 K2 分别连接到 FPGA 引脚的 PIN_23 和 PIN_25 上。 - GND 连接到 FPGA 引脚的 PIN_19 上。 LED 模块连接方式: - VCC 连接到 FPGA 引脚的 PIN_3 上。 - GND 连接到 FPGA 引脚的 PIN_1 上。 - LED1 和 LED2 分别连接到 FPGA 引脚的 PIN_10 和 PIN_12 上。 2. 新建 Quartus 工程 打开 Quartus 软件,选择 File -> New Project Wizard,新建一个工程。 3. 添加 Verilog 文件 在工程目录下新建一个 Verilog 文件,将以下代码复制进去: ```verilog module key_led( input clk, input k1, input k2, output led1, output led2 ); reg [1:0] state; always @(posedge clk) begin case(state) 2'b00: begin led1 <= 1'b0; led2 <= 1'b0; if(k1) state <= 2'b01; if(k2) state <= 2'b10; end 2'b01: begin led1 <= 1'b1; led2 <= 1'b0; if(!k1) state <= 2'b00; end 2'b10: begin led1 <= 1'b0; led2 <= 1'b1; if(!k2) state <= 2'b00; end default: state <= 2'b00; endcase end endmodule ``` 这段 Verilog 代码实现了按键控制 LED 的功能,在上升沿时检测按键的状态,根据按键的状态控制 LED 的亮灭。 4. 设计约束文件 在工程目录下新建一个 SDC 文件,将以下代码复制进去: ```tcl create_clock -name clk -period 10.0 -waveform {0 5.0} [get_ports clk] set_input_delay -clock clk -max 2.0 [get_ports k1] set_input_delay -clock clk -max 2.0 [get_ports k2] set_output_delay -clock clk -max 2.0 [get_ports led1] set_output_delay -clock clk -max 2.0 [get_ports led2] ``` 这段 SDC 代码定义了时钟和输入输出的时序约束。 5. 编译工程 在 Quartus 软件中,选择 Processing -> Start Compilation,编译工程。 6. 下载到 FPGA 开发板 编译成功后,在 Quartus 软件中选择 Tools -> Programmer,将编译好的文件下载到 FPGA 开发板。 7. 运行实验 将 FPGA 开发板接通电源,按下 K1 按键,LED1 亮起;按下 K2 按键,LED2 亮起。松开按键后,LED 熄灭。 实验效果: 通过按键控制 LED 的亮灭,实现了简单的数字逻辑电路的设计和实现。 实验总结: 本实验通过 FPGA 实现按键控制 LED 的亮灭,加深了对 FPGA 的理解和应用。在设计数字逻辑电路时,需要注意时序约束的设置,确保电路能够正常工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值