当前位置:文档之家› 键盘控制器设计

键盘控制器设计

集成电路课程设计(报告)题目:键盘控制器设计一、技术规范1 概述本文主要研究参考8279来进行键盘控制器的设计,实现利用键盘控制器对4*4矩阵键盘的自动扫描,并识别键盘上闭合键的键号,这样可以大大节省CPU 对键盘的操作时间,从而减轻CPU的负担,程序简单,不会出现错误操作。

使用它可简化系统的软件设计,提高CPU的工作效率,在工程设计中将有很大的好处。

本次课程设计使用EDA工具完成,包括NC-Verilog、DC、PT等。

2 接口定义接口定义与说明见下表。

表1.1 接口定义与说明引脚名称宽度方向引脚描述clk 1 输入上升沿有效reset 1 输入低电平复位row 4 输入键盘扫描行col 4 输出键盘扫描列key_value 4 输出键盘的键值3 功能说明本次设计的主要思想是:当有按键按下时进行键盘行(row)和键盘列(col)扫描,其中键盘的行和列则对应键盘本身,当行列键盘值为一下数据时则对应的键盘值如下:4 关键接口时序电路时序如图1.1所示。

5 环境、工具、单元库说明本设计使用Verilog HDL语言进行描述,在Linux下的vim文本编辑器中进行编写。

二、总体设计方案1 概述本设计采用键盘工作方式参照8279,在键盘工作方式时,可设置为双键互锁方式和N键循回方式。

键互锁方式:若有两个或多个键同时按下时,不管按键先后顺序如何,只能识别最后一个被释放的键,并把该键值送入FIFO RAM中。

N键循回方式:一次按下任意个键均可被识别,按键值按扫描次序被送入FIFO RAM中。

2 总体结构图及其说明键盘控制器的各种工作方式都要通过对命令寄存器的设置来实现。

其中共有8种命令,通过这些命令设置工作寄存器,来选择各种工作方式。

命令寄存器共8位,格式为:D7 D6 D5 D4 D3 D2 D1 D0命令类型命令内容命令寄存器图如上图,键盘控制器的一条命令由两大部分组成,一部分表征命令类型,为命令特征位,由命令寄存器高3位D7---D5决定。

D7---D5三位的状态可组合出8种形式,对应8类命令。

另一部分为命令的具体内容,由D4---D0决定。

每种特征所代表的命令如表2-1所示表2-1 键盘控制器命令特征表下面详细说明各种命令中,D4---D0各位的设置方法,以便确定各种命令字。

特征位D7 D6 D5=000D4、D3两位用来设定4种显示方式,D2---D0三位用以设定8种键盘/显示扫描方式,如表2.2所示。

表2-2 键盘/显示扫描方式3子模块1-微控制器模块规范数据缓冲器是双向缓冲器,连接内、外总线,用于传送CPU和键盘控制器之间的命令或数据;I/O控制线是CPU对键盘控制器进行控制的引线。

CS是键盘控制器的片选信号,CS=0时,控制器才被允许读出或写入信息。

WR、RD为来自CPU的控制信号。

A0用于区别信息特性:A0=1时,表示数据缓冲器输入为指令、输出为状态字;A=0时,输入、输出皆为数据。

4子模块2-键盘功能模块规范回复缓冲器、键盘去抖及控制来自RL0~RL3的8根回复线的回复信号,由回复缓冲器缓冲并锁存。

在键盘工作方式中,回复线作为行列式键盘的行列输入线。

在逐行列输入时,在逐行列扫描时,回复线用来搜索每一行列中闭合的键。

当某一键闭合时,去抖电路被置位,延时等待10ms后,再检验该键是否继续闭和,并将该键的地址和附加的移位、控制状态一起形成键盘数据被送入键盘控制器内部FIFO(先进先出)存储器。

键盘数据格式如下:D7 D6 D5 D4 D3 D2 D1 D0控制移位扫描回复控制和移位(D6、D7)的状态由两个独立的附加开关决定,而扫描(D5、D4、D3)和回复(D2、D1、D0)则是被按键置位的数据。

D5、D4、D3来自动扫描计数器,是按下键的行列编码,而(D7D7D7)则来自行/列计数器,它们是根据回复信号而确定的行/列编码。

在传感器开关状态矩阵方式中,回复线的内容直接被送往和相应的传感器RAM(即FIFO存储器)。

在选通输入方式中,回复线的内容在CNTL/STB线的脉冲上升沿被送入FIFO存储器。

5 子模块3-键盘控制器的译码和编码模块规范键盘控制器的译码和编码参考8297,内、外译码由键盘/显示命令字的最低位D0选择决定。

D0=1选择内部译码,也称为译码方式,SL0—SL3每时刻只能有一位为低电平。

此时键盘控制器只能接4×4矩阵式键盘。

D0=0选择内部编码,也称为编码方式,SL0—SL3为计数分频式波形输出,键盘方式可接2—4译码器,构成4×4矩阵式键盘。

8297命令功能如下:三、验证方案1 概述主要对键盘控制器模块进行验证,通过编写激励,观察键盘控制器模块的输出。

2 验证结构采用门级结构进行验证。

3 验证项目说明以键盘控制为例,编写激励,控制时钟和控制信号,期望每1个时间单位观察键盘输出值。

激励如下:module test;reg clk, rst_n,RESET,key_clk,key_data;wire FLGA0;wire key_pressed;wire[7:0] DATA;top_eda s1(.clk(clk), .key_clk(key_clk),.RESET(RESET),.key_data(key_data),.DATA(DATA),.FLGA0(FLGA0),.key_pressed(key_pressed));initial begin#1 clk = 1'b0;forever #2 clk = ~clk;endinitial begin#1 key_clk = 1'b0;forever #2 key_clk = ~key_clk;endinitial begin#0 RESET = 1'b0;#10 RESET = 1'b1;endinitial begin#0 key_data = 1'b1;forever #4 key_data = ~key_data;endendmodule键盘控制器的设计代码如下:module key(clk, reset,row, col, key_value );input clk,reset;input [3:0] row;output [3:0] col;output [3:0] key_value;reg [3:0] col;reg [3:0] key_value;reg [5:0] count;//delay_20msreg [2:0] state; //状态标志reg key_flag; //按键标志位reg clk_500khz; //500KHZ时钟信号reg [3:0] col_reg; //寄存扫描列值reg [3:0] row_reg; //寄存扫描行值always @(posedge clk or negedge reset)if(!reset) begin clk_500khz<=0; count<=0; endelsebeginif(count>=50) begin clk_500khz<=~clk_500khz;count<=0;endelse count<=count+1;endalways @(posedge clk_500khz or negedge reset)if(!reset) begin col<=4'b0000;state<=0;endelsebegincase (state)0:begincol[3:0]<=4'b0000;key_flag<=1'b0;if(row[3:0]!=4'b1111) begin state<=1;col[3:0]<=4'b1110;end //有键按下,扫描第一行else state<=0;end1:beginif(row[3:0]!=4'b1111) begin state<=5;end //判断是否是第一行else begin state<=2;col[3:0]<=4'b1101;end //扫描第二行end2:beginif(row[3:0]!=4'b1111) begin state<=5;end //判断是否是第二行else begin state<=3;col[3:0]<=4'b1011;end //扫描第三行end3:beginif(row[3:0]!=4'b1111) begin state<=5;end //判断是否是第三一行else begin state<=4;col[3:0]<=4'b0111;end //扫描第四行end4:beginif(row[3:0]!=4'b1111) begin state<=5;end //判断是否是第一行else state<=0;end5:beginif(row[3:0]!=4'b1111)begincol_reg<=col; //保存扫描列值row_reg<=row; //保存扫描行值state<=5;key_flag<=1'b1; //有键按下endelsebegin state<=0;endendendcaseendalways @(clk_500khz or col_reg or row_reg)beginif(key_flag==1'b1)begincase ({col_reg,row_reg})8'b1110_1110:key_value<=0;8'b1110_1101:key_value<=1;8'b1110_1011:key_value<=2;8'b1110_0111:key_value<=3;8'b1101_1110:key_value<=4;8'b1101_1101:key_value<=5;8'b1101_1011:key_value<=6;8'b1101_0111:key_value<=7;8'b1011_1110:key_value<=8;8'b1011_1101:key_value<=9;8'b1011_1011:key_value<=10;8'b1011_0111:key_value<=11;8'b0111_1110:key_value<=12;8'b0111_1101:key_value<=13;8'b0111_1011:key_value<=14;8'b0111_0111:key_value<=15;endcaseendendendmodule四、综合报告1 概述综合工具:Synopsys的逻辑综合工具Design Compiler,即DC综合环境:Linux服务器2 综合约束(1)时钟定义:create_clock -name clkin -period 20(2)I/O端口时序:set_input_delay 0 -clock clkin -add_delay $in_portsset_output_delay 0 -clock clkin -add_delay [all_outputs](3)时序例外:set_false_path -from [get_clocks CLK] -to [get_clocks clkin] set_false_path -from [get_clocks clkin] -to [get_clocks CLK]3 综合结果综合结果如图4.1所示。

相关主题