FPGA矩阵键盘的扫描方法

module keyscan(kbrow,seg7_out,scan,clk,start,kbcol);
output [3:0] kbrow;                                            //列扫描信号
output [6:0] seg7_out;
output [7:0] scan;
input clk,start;
input [3:0] kbcol;
reg [3:0] kbrow;
reg [6:0] seg7_out;
reg [7:0] scan;
reg [1:0] count;
reg [1:0] sta;
reg [6:0] seg7;
reg [4:0] dat;
reg fn;            //按键标志位,判断是否有键被按下
initial scan<='b10000000;                            //只使用一个数码管显示
always@(posedge clk)                                    //循环扫描计数器
begin
if(start==0)
  begin seg7<='b0000000;end
else
  begin
      count<=count+1;
      case(count)                                            //循环列扫描
      2'b00: begin kbrow<='b0001;sta<='b00;end
      2'b01: begin kbrow<='b0010;sta<='b01;end
      2'b10: begin kbrow<='b0100;sta<='b10;end
      2'b11: begin kbrow<='b1000;sta<='b11;end
      endcase
      case(sta)                                              //行扫描译码
      2'b00: begin
                    case(kbcol)
                    4'b0001: begin seg7<='b1111001;dat<='b00011;end
                    4'b0010: begin seg7<='b1101101;dat<='b00010;end
                    4'b0100: begin seg7<='b0110000;dat<='b00001;end
                    4'b1000: begin seg7<='b1111110;dat<='b00000;end
                    default: begin seg7<='b0000000;dat<='b11111;end
                    endcase
                    end
      2'b01:begin
                  case(kbcol)
                  4'b0001: begin seg7<='b1110000;dat<='b00111;end
                  4'b0010: begin seg7<='b1011111;dat<='b00110;end
                  4'b0100: begin seg7<='b1011011;dat<='b00101;end
                  4'b1000: begin seg7<='b0110011;dat<='b00100;end
                  default: begin seg7<='b0000000;dat<='b11111;end
                  endcase
                  end
      2'b10:begin
                  case(kbcol)
                  4'b0001: begin seg7<='b0011111;dat<='b01011;end
                  4'b0010: begin seg7<='b1110111;dat<='b01010;end
                  4'b0100: begin seg7<='b1111011;dat<='b01001;end
                  4'b1000: begin seg7<='b1111111;dat<='b01000;end
                  default: begin seg7<='b0000000;dat<='b11111;end
                  endcase
                  end
      2'b11:begin
                  case(kbcol)
                  4'b0001: begin seg7<='b1000111;dat<='b01111;end
                  4'b0010: begin seg7<='b1001111;dat<='b01110;end
                  4'b0100: begin seg7<='b0111101;dat<='b01101;end
                  4'b1000: begin seg7<='b1001110;dat<='b01100;end
                  default: begin seg7<='b0000000;dat<='b11111;end
                  endcase
                  end
      default: seg7<='b0000000;
      endcase                               
  end
end
always
  begin fn<=~(dat[0]&dat[1]&dat[2]&dat[3]&dat[4]);end //产生按键标志位,用于存储按键信息
always@(posedge fn)          //按键信息存储
  begin seg7_out<=seg7;end
endmodule

 
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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
以下是一个使用Verilog语言实现的FPGA矩阵键盘加法的代码示例,仅供参考: ```verilog module keyboard_adder( input clk, input [7:0] key_matrix, // 矩阵键盘输入 output reg [7:0] result // 计算结果输出 ); reg [7:0] key_state; // 保存键盘状态 reg [7:0] last_key_state; // 保存上一个状态 reg [3:0] row; // 当前扫描的行 reg [3:0] col; // 当前扫描的列 reg [7:0] operand1; // 第一个操作数 reg [7:0] operand2; // 第二个操作数 reg [1:0] sum; // 两个操作数的和 reg [1:0] carry; // 进位 parameter ROWS = 4; parameter COLS = 4; // 状态机定义 parameter IDLE = 2'b00; parameter SCAN = 2'b01; parameter READ = 2'b10; parameter ADD = 2'b11; reg [1:0] state; always @(posedge clk) begin case (state) IDLE: begin // 空闲状态 key_state <= 8'hFF; if (key_matrix != 8'hFF) begin state <= SCAN; end end SCAN: begin // 扫描键盘 last_key_state <= key_state; key_state <= {~key_matrix[7:row*COLS+col], key_matrix[7:row*COLS+col+1]}; col <= col + 1; if (col == COLS) begin col <= 0; row <= row + 1; if (row == ROWS) begin row <= 0; state <= READ; end end end READ: begin // 读取操作数 operand1 <= last_key_state; operand2 <= key_state; state <= ADD; end ADD: begin // 进行加法计算 {sum, carry} <= operand1 + operand2; result <= sum; state <= IDLE; end endcase end endmodule ``` 这段代码使用4x4的矩阵键盘,每个键对应一个8位二进制码。在时钟的上升沿触发状态机,状态机分为四个状态:空闲状态、扫描键盘状态、读取操作数状态和进行加法计算状态。在扫描键盘状态下,使用行列扫描的方式获取按键信息。在读取操作数状态下,将上一次和这一次扫描到的按键信息作为两个操作数,然后进行加法计算,并输出结果。最后,返回到空闲状态等待下一次按键事件的发生。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值