FPGA按键控制LED

  • 软件
  • 芯片
  • 功能
  • 代码
    • 代码解释

软件

软件使用的是ISE14.6(因为穷没买7系列,劝大家买个7系列的板子,这个软件装着还挺费事,不如Vivado好用,且6和7软件不通用)

芯片

芯片使用的是spartan6系列的开发板

功能

本来想控制流水灯,其中的按键状态没有完全读懂,也没完全写明白,结果只写出来个控制LED,虽然这样控制LED性价比不高,但我写着写着就瓢了·····

代码

哭辽,又是自己死抠的一天,脑阔疼,又菜又爱玩,,,

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date:    14:58:12 11/13/2021 
// Design Name: 
// Module Name:    keyRunLed 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
////				1
//				^
//		3<<	00	>>4
//				v
//				2
//
module keyRunLed(input extrst,input extclk,input pushKey,input [4:0] singelKey,output reg [7:0] led);//按键消抖程序
wire keyMode;				//定义按键触发标志位
reg [3:0] keyValueReg;		//定义按键键值寄存器assign keyMode = singelKey[0] & singelKey[1] & singelKey[2] & singelKey[3] & singelKey[4];//按键按下时的状态量,按键按下为低电平,是&的关系,因此,当一个或者多个按键按下时,keyMode为0,以此来检测按键是否按下//按键键值寄存器处理
always @ (posedge extclk or negedge extrst)if(!extrst) keyValueReg <= 4'b1111;else keyValueReg <= {keyValueReg[2:0],keyMode};//keyValueReg每次左移装载keyModewire keyPressUp = keyValueReg[3] & ~keyValueReg[2];//按键抬起标志位(按键抬起为高电平)
wire keyPressDn = ~keyValueReg[3] & keyValueReg[2];//按键按下标志位(按键按下为低电平)reg [19:0] cnt;always @ (posedge extclk or negedge extrst)if(!extrst) cnt <= 20'd0;else if(keyPressUp || keyPressDn) cnt <= cnt + 1'b1;//按键按下进入计时else if(cnt < 20'hfffff) cnt <= cnt + 1'b1;//若计时未满,继续else cnt <= 20'd0;reg [4:0] keyValue[1:0];always @ (posedge extclk or negedge extrst)if(!extrst)beginkeyValue[0] <= 5'b11111;keyValue[1] <= 5'b11111;endelse if(cnt == 20'hfffff)			//beginkeyValue[0] <= {singelKey[0],singelKey[1],singelKey[2],singelKey[3],singelKey[4]};keyValue[1] <= keyValue[0];//键值传递endelse ;wire [4:0] keyFinVaule = keyValue[1] & ~keyValue[0];//这个我不确定,回去再想想reg ledEnable;always @ (posedge extclk or negedge extrst)if(!extrst) ledEnable <= 1'b0;else if(!pushKey) ledEnable <= 1'b1;else ledEnable <= 1'b0;reg [19:0] delay;always @ (posedge extclk or negedge extrst)if(!extrst) delay <= 20'd0;else delay <= delay + 1'b1;always @ (posedge extclk or negedge extrst)if(!extrst) led <= 8'b1111_1110;else if(delay == 24'hfffff)beginif(keyFinVaule[0] & ledEnable) led[1] <= ~led[1];else if(keyFinVaule[1] & ledEnable) led[2] <= ~led[2];else if(keyFinVaule[2] & ledEnable) led[3] <= ~led[3];else if(keyFinVaule[3] & ledEnable) led[4] <= ~led[4];else if(keyFinVaule[4] & ledEnable) led[5] <= ~led[5];else ;endelse;	
endmodule

代码解释

reg [4:0] keyValue[1:0];

定义一个 两个五位的寄存器类型参数
前面的[4:0]代表定义参数的位数,后面的[1:0]代表是keyValue[0]和keyValue[1],类似数组

本人小白,请各位大佬指正