FPGA学习之按键控制led

按键控制led

设计要求:通过8个按键分别控制一个led的亮灭。

 

该实验有两个模块:按键缓存模块和由按键值控制led模块

按键缓存模块:通过二级缓存,将按键值存入key_r1,防止按键时产生的尖峰脉冲影响按键值。

由按键值控制led模块:采用case语句,一一对应控制led的亮灭。

 

顶层代码:

module keyled(clk,rst_n,key,led);

 

input clk;

input rst_n;

input [7:0]key;

output [7:0]led;

 

//二级缓存按键数据

reg [7:0]key_r0,key_r1;

always @(posedge clk or negedge rst_n)

    if(!rst_n)begin

        key_r0 <= 8'd0;

        key_r1 <= 8'd0;

    end

    else begin

        key_r0 <= key;

        key_r1 <= key_r0;

    end

   

reg [7:0]led_r;

always @(key_r1)begin

    case(key_r1)

        8'b1111_1110:led_r = 8'b1111_1110;

        8'b1111_1101:led_r = 8'b1111_1100;

        8'b1111_1011:led_r = 8'b1111_1000;

        8'b1111_0111:led_r = 8'b1111_0000;

        8'b1110_1111:led_r = 8'b1110_0000;

        8'b1101_1111:led_r = 8'b1100_0000;

        8'b1011_1111:led_r = 8'b1000_0000;

        8'b0111_1111:led_r = 8'b0000_0000;

        default:led_r = 8'b1111_1111;

    endcase

end

   

assign led = led_r;

 

endmodule

 

 

测试文件:除了clk,rst_n信号外,还设置了8+1种不同的key值(最后一种是乱序的按键),以便观察led。

代码:

`timescale 1ns/1ns

`define clk_period 20

 

module keyled_tb;

 

reg clk;

reg rst_n;

reg [7:0]key;

wire [7:0]led;

 

keyled keyled(

        .clk(clk),

        .rst_n(rst_n),

        .key(key),

        .led(led)

        );

 

initial clk=1;

always#(`clk_period/2)clk=~clk;

 

initial begin

    rst_n=0;

    key=0;

    #(`clk_period*20+1);

    rst_n=1;

    #`clk_period;

    key=8'b1111_1110;

    #(`clk_period*10);

   

    key=8'b1111_1101;

    #(`clk_period*10);

    

    key=8'b1111_1011;

    #(`clk_period*10);

   

    key=8'b1111_0111;

    #(`clk_period*10);

   

    key=8'b1110_1111;

    #(`clk_period*10);

   

    key=8'b1101_1111;

    #(`clk_period*10);

   

    key=8'b1011_1111;

    #(`clk_period*10);

   

    key=8'b0111_1111;

    #(`clk_period*10);

   

    key=8'b1101_1110;

    #(`clk_period*10);

       

end

       

endmodule

 

 

仿真波形图:

波形图.jpg
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值