二:FPGA按键控制流水灯

设计要求:初始状态LED全灭;四个按键分别能够控制LED灯呈现不同的花样显示。

//----------------------------------------------------------------------------------------
// Created by:         Active_Zmw
// File name:          fkey_led
// Descriptions:       按键控制LED灯
//content:			   源代码+仿真
//----------------------------------------------------------------------------------------
//源代码
module key_led(
    input               sys_clk  ,    //50Mhz系统时钟
    input               sys_rst_n,    //系统复位,低有效
    input        [3:0]  key,          //按键输入信号
    output  reg  [3:0]  led           //LED输出信号
    );

//reg define     
reg  [23:0] cnt;
reg  [1:0]  led_control;

//用于计数0.2s的计数器
always @ (posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        cnt<=24'd9_999_999;
    else if(cnt<24'd9_999_999)
        cnt<=cnt+1;
    else
        cnt<=0;
end 

//用于led灯状态的选择
always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n)
        led_control <= 2'b00;
    else if(cnt == 24'd9_999_999) 
        led_control <= led_control + 1'b1;
    else
        led_control <= led_control;
end

//识别按键,切换显示模式
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n) begin
          led<=4'b 0000;
    end
    else if(key[0]== 0)  //按键1按下时,从右向左的流水灯效果
        case (led_control)
            2'b00   : led<=4'b1000;
            2'b01   : led<=4'b0100;
            2'b10   : led<=4'b0010;
            2'b11   : led<=4'b0001;
//led_control共2位,一直累加到11后再次累加会恢复到00,以此来达到控制效果
            default  : led<=4'b0000;
        endcase
    else if (key[1]==0)  //按键2按下时,从左向右的流水灯效果
        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]==0)  //按键3按下时,LED闪烁
        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]==0)  //按键4按下时,LED全亮
        led<=4'b1111;
    else
        led<=4'b0000;    //无按键按下时,LED熄灭     
end

endmodule 
//仿真
1  `timescale 1 ns/ 1 ns
2  module tb_key_led();
3  
4  parameter T = 20;
5  
6  reg  [3:0]  key      ;
7  reg         sys_clk  ;
8  reg         sys_rst_n;
9  reg         key_value;
10 
11 wire [3:0]  led;
12 
13 initial begin   
14      key                <=4'b1111;//按键初始状态为全断开
15      sys_clk            <=1'b0;   //初始时钟为低电平
16      sys_rst_n          <=1'b0;   //复位信号初始为低电平
17 #T   sys_rst_n          <=1'b1;   //一个时钟周期后复位信号拉高
18 
19 #600_000_020 key[0]     <=0;      //0.6s时按下按键1
20 #800_000_000 key[0]     <=1;    
21 key[1]                  <=0;      //0.8s后松开按键1,按下按键2
22 #800_000_000 key[1]     <=1;   
23 key[2]                  <=0;      //0.8s后松开按键2,按下按键3
24 #800_000_000 key[2]     <=1;   
25 key[3]                  <=0;      //0.8s后松开按键3,按下按键4    
26 #800_000_000 key[3]     <=1;      //0.8s后松开按键4
27 
28 end 
29 
30 always # (T/2) sys_clk <= ~sys_clk;
31 key_led   u_key_led(
32       .sys_clk(sys_clk),       
33       .sys_rst_n(sys_rst_n),     
34       .key(key),                  
35       .led(led)          
36       );
37 
38 endmodule

在上述设计中,必须使得按键一直按下流水灯才会被触发,如何更改为按键只按一次,流水定就会按照设定的按键模式进行运行。即一个按键控制一种模式,且按键按下生效,抬起按键依然有效。
思考emmmmmm。。。。。。。。。。后续补充一节完善代码。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值