FPGA学习之按键控制led

    xiaoxiao2026-04-14  3

    按键控制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

     

     

    仿真波形图:

    相关资源:基于Verilog实现旋转按钮控制八个LED灯
    最新回复(0)