FPGA拾忆_(9):按键控制流水灯实验回顾

1.硬件特征:轻触式(回弹式)按键                                自锁式按键

                 

按键开关是一种电子开关,属于电子元器件类。我们的开发板上有两种按键开关: 第一种是本实验所使用的轻触式按键开关,简称轻触开关。 使用时以向开关的操作方向施加压力使内部电路闭
合接通,当撤销压力时开关断开,其内部结构是靠金属弹片受力后发生形变来实现通断的;第二种是自锁按键, 自锁按键第一次按下后保持接通,即自锁,第二次按下后,开关断开,同时开关按钮弹出来, 开发板上的电源键就是这种开关。;

2.原理图:

3.端口:时钟,复位,按键输入,led输出

4.代码技巧: 

  //空语句“   ;  ”等同于信号自赋值,即信号保持

always@(posedge sys_clk or negedge sys_rst_n)begin

  if(!sys_rst_n)

    led_flag <= 2'd0;

  else if(cnt == CNT_MAX - 25'd1)

    led_flag <= led_flag + 2'd1;

  else

    ; //效果等同于led_flag <= led_flag

end

//例化过程中的参数传递的使用格式   #(

                                                                .变量名(要赋予的值)

                                                                )

key_led     #(

                .CNT_MAX(25)  //500ns

            )

            key_led_1(

                .sys_clk(sys_clk),

                .sys_rst_n(sys_rst_n),

                .led(led),

                .key(key)

            );

5.代码: 

/*
实现功能:四个按键控制四个led输出不同效果,时间间隔为500ms
key[3:0] == 4'b0000;  led[3:0]  == 4'b0000;
key[3:0] == 4'b0001;  led[3:0]  == 4'b0001; -->led[3:0]  == 4'b0010;-->led[3:0]  == 4'b0100; 500ms
key[3:0] == 4'b0010;  led[3:0]  == 4'b0001; -->led[3:0]  == 4'b1000;-->led[3:0]  == 4'b0100; 500ms
key[3:0] == 4'b0100;  led[3:0]  == 4'b0000; -->led[3:0]  == 4'b1111;-->led[3:0]  == 4'b0000; 500ms
key[3:0] == 4'b1000;  led[3:0]  == 4'b1111;
*/
module key_led(
    input               sys_clk,
    input               sys_rst_n,
    input      [3:0]    key,
    output reg [3:0]    led    
);
    parameter CNT_MAX = 25'd25_000_000;
    reg [24:0] cnt;
    reg [1:0] led_flag;

    //计数时间0.5s
always@(posedge sys_clk or negedge sys_rst_n)begin
  if(!sys_rst_n)
    cnt <= 25'd0;
  else if(cnt <= CNT_MAX - 25'd1)
    cnt <= cnt+1;
  else  
    cnt <=25'd0;
end

    //led_flag信号,每计数到24_999_999时,led_flag信号+1
always@(posedge sys_clk or negedge sys_rst_n)begin
  if(!sys_rst_n)
    led_flag <= 2'd0;
  else if(cnt == CNT_MAX - 25'd1)
    led_flag <= led_flag + 2'd1;
  else
    ; //效果等同于led_flag <= led_flag
end

//led控制逻辑
always@(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)
    led[3:0] <= 4'd0000;
else 
        begin
        case(key[3:0])  
         4'b1111: led[3:0] <= 4'b0000; //全灭
         4'b1110:
          begin 
            case(led_flag)
            2'b00:  led <= 4'b0001;
            2'b01:  led <= 4'b0010;
            2'b10:  led <= 4'b0100;
            default:led <= 4'b1000;
            endcase
          end
         4'b1101:
         begin
          case(led_flag)
            2'b00:  led <= 4'b0001;
            2'b01:  led <= 4'b1000;
            2'b10:  led <= 4'b0100;
            default:led <= 4'b0010;
          endcase
         end
         4'b1011:
         begin
          case(led_flag)
            2'b00:  led <= 4'b0000;
            2'b01:  led <= 4'b1111;
            2'b10:  led <= 4'b0000;
            default:led <= 4'b1111;
          endcase
         end
         default :led <= 4'b1111;
        endcase
         end
end

endmodule

6.仿真与验证:

功能验证正确,其中led信号变化总是比led_flag的变化慢一拍,这是正常的,也就是这里反映了时序上的延迟,即只有在后一拍,led才能稳定采集到led_flag的变化并相应做出改变 。

7.易错点与总结:

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值