基于Verilog的FPGA扩展4x4键盘矩阵实例

概论:FPGA开发板上的按键太少,只有一个复位键,用户要进行选择操作什么的很不方便,所以扩展一个4x4矩阵键盘,本文主要是扩展矩阵键盘的Verilog程序实现过程。

关键字:FPGA        4x4矩阵键盘        Verilog HDL        I/O外设

FPGA开发板如图1所示。

图1 EP4CE6E22C8N开发板

可以看到,只有一个复位按建,对于很多需要根据用户的选择进行操作的项目来说是很不方便的,重新买一块FPGA开发板又太贵了,所以选择扩展一个矩阵键盘。

矩阵键盘如图2。

图2 4x4矩阵键盘 

扩展该矩阵键盘的Verilog代码如下:

module key4x4
#(
    parameter   CNT_MAX=16'd50_000
)
(
    input    wire           sys_clk     ,
    input    wire           sys_rst_n   ,
    input    wire    [3:0]  key_in      ,//此信号为从键盘传到FPGA开发板的信号
    output   reg     [3:0]  key_out     ,//此信号为从FPGA开发板传到键盘上的信号
    output   reg     [3:0]  led_out      //注意信号灯为低信号时会亮
);

reg     [15:0]      cnt         ;
reg                 cnt_clk     ;
reg     [1:0]       q           ;

always @ (posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n==1'b0)
    cnt<=16'd0;
    else if (cnt==CNT_MAX)
    cnt<=16'd0;
    else  cnt<=cnt+16'd1;

always @ (posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n==1'b0)
    cnt_clk<=1'b0;
    else if (cnt==CNT_MAX-16'd1)
    cnt_clk<=1'b1;
    else  cnt_clk<=1'd0;

always @ (posedge cnt_clk or negedge sys_rst_n)
    if(sys_rst_n==1'b0)
    begin
    q<=2'd0;
    key_out<=4'b1110;
    led_out<=4'b1111;
    end
    else
    begin
    q<=q+2'd1;
    case(q)
    //分别对每一行row输入扫描信号
    2'd0:key_out<=4'b1110;
    2'd1:key_out<=4'b1101;
    2'd2:key_out<=4'b1011;
    2'd3:key_out<=4'b0111;
    default:key_out<=4'b0000;
    endcase
    case ({key_out,key_in})
    //按下第1个按键后则全灭,0000 -> 1111,按下第16个按键后全部的灯亮,1111 -> 0000。
    //每一行扫描信号,对应的扫描信号灯输出
    8'b1110_1110:begin led_out<=4'b1111;  end
    8'b1110_1101:begin led_out<=4'b1110;  end
    8'b1110_1011:begin led_out<=4'b1101;  end
    8'b1110_0111:begin led_out<=4'b1100;  end
    
    8'b1101_1110:begin led_out<=4'b1011;  end
    8'b1101_1101:begin led_out<=4'b1010;  end
    8'b1101_1011:begin led_out<=4'b1001;  end
    8'b1101_0111:begin led_out<=4'b1000;  end
    
    8'b1011_1110:begin led_out<=4'b0111;  end
    8'b1011_1101:begin led_out<=4'b0110;  end
    8'b1011_1011:begin led_out<=4'b0101;  end
    8'b1011_0111:begin led_out<=4'b0100;  end
    
    8'b0111_1110:begin led_out<=4'b0011;  end
    8'b0111_1101:begin led_out<=4'b0010;  end
    8'b0111_1011:begin led_out<=4'b0001;  end
    8'b0111_0111:begin led_out<=4'b0000;  end
    8'b0000_1111:begin led_out<=4'b1111;  end
    default:     begin led_out<=4'b1111;  end
    endcase
    end

endmodule

本文是用Quartus和Modelsim实现联合仿真,所以还要写一个仿真测试代码,如下所示:

`timescale 1ns/1ns
module tb_key4x4 ();
reg             sys_clk     ;
reg             sys_rst_n   ;
reg     [3:0]   key_in      ;        
wire    [3:0]   key_out     ;
wire    [3:0]   led_out     ;

initial
    begin
    sys_clk=1'b1;
    sys_rst_n<=1'b0;
    key_in<=4'b1110;
    #50
    sys_rst_n<=1'b1;
    #2000
    key_in<=4'b1101;
    #2000
    key_in<=4'b1011;
    #2000
    key_in<=4'b0111;
    end

always #10 sys_clk = ~sys_clk   ;

key4x4 
#(
    .CNT_MAX    (16'd2)
)
key4x4_inst1
(
    .   sys_clk    (sys_clk  )  ,
    .   sys_rst_n  (sys_rst_n)  ,
    .   key_in     (key_in   )  ,//此信号为从键盘传到FPGA开发板的信号
    
    .   key_out    (key_out  )  ,//此信号为从FPGA开发板传到键盘上的信号
    .   led_out    (led_out  )   //注意信号灯为低信号时会亮
);

endmodule

仿真验证的波形如图3所示:

图3 仿真波形

仿真结果的话,可以观看我在bilibili(哔哩哔哩)上传的视频:用FPGA扩展4x4矩阵键盘,并分别简单控制LED灯,key4x4_哔哩哔哩_bilibili

  • 7
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
KEY_4x4扫描键盘FPGAVerilog逻辑源码Quartus工程文件,FPGA为CYCLONE4系列中的EP4CE6E22C8. 完整的工程文件,可以做为你的学习设计参考。 module KEY_4x4 ( input sys_clk, //50MHZ input sys_rst_n , input [3:0] key_row , //�� //output wire [3:0] key_col , //�� output reg [3:0] key_col , //�� output wire [7:0] LED , //��ʾ��ֵ output reg [3:0] key_value //��ֵ ); reg [5:0] count;//delay_20ms reg [2:0] state; //״̬��־ reg key_flag; //������־λ reg clk_500khz; //500KHZʱ���ź� reg [3:0] key_col_reg; //�Ĵ�ɨ����ֵ reg [3:0] key_row_reg; //�Ĵ�ɨ����ֵ always @(posedge sys_clk or negedge sys_rst_n) begin if (!sys_rst_n) begin clk_500khz <= 0 ; count<=0 ; end else begin if ( count >= 50 ) begin clk_500khz <= ~clk_500khz ; count<=0; end else count <= count + 1; end end always @(posedge clk_500khz or negedge sys_rst_n) if(!sys_rst_n) begin key_col<=4'b0000; state<=0; end else begin case (state) 0: begin key_col[3:0]<=4'b0000; key_flag<=1'b0; if(key_row[3:0]!=4'b1111) begin //�м����£�ɨ����һ�� state<=1; key_col[3:0]<=4'b1110; end else state<=0; end 1: begin if(key_row[3:0]!=4'b1111) //�ж��Ƿ��ǵ�һ�� state<=5; else begin state<=2; key_col[3:0]<=4'b1101; //ɨ���ڶ��� end end 2: begin if(key_row[3:0]!=4'b1111) //�ж��Ƿ��ǵڶ��� state<=5; else begin //ɨ�������� state<=3; key_col[3:0]<=4'b1011; end end 3: begin if(key_row[3:0]!=4'b1111) //�ж��Ƿ��ǵ���һ�� state<=5; else begin state<=4; key_col[3:0]<=4'b0111; end //ɨ�������� end 4: begin if (key_row

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值