名称:6x6矩阵键盘控制设计Verilog代码Quartus仿真
软件:Quartus
语言:Verilog
代码功能:6x6矩阵键盘控制
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
1.要求
功能就是实现六乘六键盘输入
2.键盘电路,以4X4键盘为例
其中H0~H3为FPGA输出,L0~L3为FPGA输入,采用行扫描法。
在上电默认情况下,L[3:0] =1111,因为上拉了3.3V,而默认情况下H[3:0]为低电平;一旦有某一个按键被按下,则对应L会拉低。因此可以通过对每一行H输出的控制,来检索是哪一个按键被按下了。
3.工程文件
4.程序代码
5.程序综合编译
6.RTL图
7.状态机图
8.仿真
Testbench
仿真图
部分代码展示:
module key_6x6 ( clk_500KHz,//500KHZ rst_n, //低电平复位 L_row, //列 H_col, //行 key_number//输出键值 ); input clk_500KHz;//500KHZ input rst_n; //低电平复位 input [5:0] L_row;//列 output [5:0] H_col;//行 output [5:0] key_number;//输出键值 reg [5:0] H_col=6'd0; reg [5:0] key_number=6'd0; //定义状态 parameter s_L_all=3'd0; parameter s_L_row1=3'd1; parameter s_L_row2=3'd2; parameter s_L_row3=3'd3; parameter s_L_row4=3'd4; parameter s_L_row5=3'd5; parameter s_L_row6=3'd6; parameter s_LH=3'd7; reg [2:0] state=s_L_all; //状态标志 reg key_flag=0; //按键标志位 reg [5:0] H_col_reg=6'd0; //寄存扫描行值 reg [5:0] L_row_reg=6'd0;//寄存扫描列值 /************************************************************************ 逐行扫描原理 ************************************************************************/ always @(posedge clk_500KHz or negedge rst_n) if(!rst_n) begin H_col<=6'b000000; H_col_reg<=6'b000000; L_row_reg<=6'b000000; state<=s_L_all; end else begin case (state) s_L_all:begin H_col[5:0]<=6'b000000; //行输出0 key_flag<=1'b0; if(L_row[5:0]!=6'b111111) begin state<=s_L_row1; H_col[5:0]<=6'b011111;//有键按下,扫描第一行 end else state<=s_L_all; end s_L_row1:begin if(L_row[5:0]!=4'b111111) begin state<=s_LH;//判断是否是第一行 end else begin state<=s_L_row2; H_col[5:0]<=6'b101111; //扫描第二行 end end s_L_row2:begin if(L_row[5:0]!=4'b111111) begin state<=s_LH;//判断是否是第二行 end else begin state<=s_L_row3; H_col[5:0]<=6'b110111;//扫描第三行 end end s_L_row3:begin if(L_row[5:0]!=6'b111111) begin state<=s_LH;//判断是否是第三行 end else begin state<=s_L_row4; H_col[5:0]<=6'b111011;//扫描第四行 end end s_L_row4:begin if(L_row[5:0]!=6'b111111) begin state<=s_LH;//判断是否是第四行 end else begin state<=s_L_row5; H_col[5:0]<=6'b111101;//扫描第五行 end end s_L_row5:begin if(L_row[5:0]!=6'b111111) begin state<=s_LH;//判断是否是第五行 end else begin state<=s_L_row6; H_col[5:0]<=6'b111110;//扫描第六行 end end
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=981
阅读全文
698