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],类似数组
本人小白,请各位大佬指正