基于FPGA的键盘扫描电路EDA课程设计.docx
《基于FPGA的键盘扫描电路EDA课程设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的键盘扫描电路EDA课程设计.docx(13页珍藏版)》请在冰点文库上搜索。
基于FPGA的键盘扫描电路EDA课程设计
4心得体会———————————————————————12
1.课程设计综述
1.1课程设计的题目
基于FPGA的键盘扫描电路。
1.3题目要求
(1)、键盘按钮数为4,系统时钟10MHz。
(2)、能识别出所按按钮。
(3)、按钮被按下后,视为此按钮输入一次,若按钮长时间不松,(时限1S)后每隔0.5S视为再次输入,直至按钮松开。
(4)、要求能对按钮按下时指令的抖动能正确处理。
对持续时间小于50ms的输入不作响应。
(5)、各键设置不同优先级,多键同时按下时,视为优先级较高的按键被按下。
2.方案选择
根据题目要求,需要4个按钮的键盘,通过查阅资料我选择通用的2*2行列式键盘,判断键盘中有无按键按下是通过行线送入扫描信号,然后从列线读取状态得到的。
其方法是依次给行线送低电平,检查列线的输入。
如果列线信号全为高电平,则代表低电平信号所在的行中无按键按下;如果列线有输入为低电平,则低电平信号所在的行和出现低电平的列的交点处有按键按下。
原理框图如下所示:
由题知输入的是10MHz的系统时钟,我们需要通过一个分频器来输出一个1KHz的计数频率来扫描键盘以及一个40Hz(即25ms)的消除抖动的频率来计算是否属于抖动按键,计数值用来计算当前键盘扫描值,4按钮的话计数值则是00、01、10和11,若有按键信号发生则送计数值到按键检测电路和按键编码电路供确定按键位置用。
键盘扫描电路提取列按键并和计数值进行比较得到哪一行被按下,并可通过对计数值的分解得打哪一列有按键,提取该值供计数器电路和消抖电路使用。
我们用一个状态机来实现消抖电路,按键抖动为50ms,我们通过对按键进行两次采样判断是否属于抖动,则输入时钟用40Hz(25ms),通过两次采样得到50ms的判断值,若按键信号一直有效则属于有效按键。
键盘编码电路实现了计数值到对应编码的转换。
3.整体电路的设计及分析
3.1顶层电路图
3.2各模块功能原理分析
3.2.1分频模块(SCAN_GEN)
该模块的模型如左所示,输入信号为系统时钟信号10MHz,输出为两个分频后的信号。
具体代码如下所示:
对键盘扫描的分频我们定义的计数器为13位(8192大于5000)才能实现一万分频得到1KHz的信号,对于消抖电路的计数器则设为17位(131072>125000)才能实现二万五千分频得到40Hz的信号,由于该模块要求的分频数太高,软件仿真不出,所以实际仿真的时候我们改成了100个时钟信号分频为10个和25个时钟信号的模拟。
该电路仿真图如下所示:
我们把CLK设置为100个时钟,由图可知,当CLK发生5个上升沿变化时,scan_f发生一次翻转,实现了10分频,当CLK发生10个上升沿变化时,scan_dd发生一次翻转,实现了20分频。
从而实现了该电路的基本功能。
3.2.2计数电路(SCAN_COUNT)
该模块的模型如左所示,输入信号为分频电路产生的键盘扫描频率以及键盘扫描电路产生的按键信号,输出的是供键盘扫描电路和编码电路使用的计数值。
具体代码如下所示:
由于是2*2的键盘,我们只需要定义计数值为2位(00、01、10、11)即可表示所有的键位,当按键信号是高电平即无按键输入时,计数值一直在00、01、10和11中循环,当有按键输入时,把此时的计数值输出供键盘扫描电路和按键编码电路使用。
3.2.3键盘扫描模块(KEY_SCAN)
该模块的模型如左所示,输入信号为按键产生的列信号,并和另一个从计数模块输入的计数信号进行比较得到该按键在哪一行,并产生按键信号和优先列信号。
具体代码如下所示:
该电路的主要思路在于计数值、列信号和行信号的对应关系,如下表所示:
第二列
第一列
计数值
A
B
第一行
10
1
0
0
0
0
1
0
1
第二行
01
1
0
1
0
0
1
1
1
表中A判断在第几行,0表示在第一行,1表示在第二行,B判断哪一列有按键供按键信号的赋值,0表示第一列,1表示第二列。
仿真图如下所示:
第一个100ns内,计数值为00,输入为00,即两列都有按键输入,则是第一行的两个键都被按下,第一行为低电平且按键信号变为低电平,我们设置的是第一列优先,所以输出的第一列是低电平,第二列是高电平。
第二个100ns内,计数值为01,输入为01,则是第一行的第二列被按下且按键信号为低电平。
第4个100ns到第6个100ns内,输入的列信号是11,则无按键输入,按键信号为高电平。
3.2.4消抖模块(DEBOUNCE)
该模块的模型如左所示,从分频电路得到消抖需要的40HZ(25ms)的时钟信号,并从键盘扫描电路得到按键信号,并判断该按键是否有效。
消抖电路的原理是:
对一个按键信号,对它进行取样,如果连续两次取样都为低电平,则认为信号已经处于稳定状态,这时输出一个低电平的按键信号。
否则只要有一次取样不为低电平,则认为是抖动,将其丢弃。
为了实现此目的,我们可以设置一个状态机如下所示:
x/y:
表示输入和输出。
‘/’左侧的为输入信号,‘/’右侧的为输出信号。
当按键按下时,为低电平。
按键松开后为高电平。
具体代码如下所示:
设定一个状态机,有S0、S1、S2这3个状态,我们进行两次采样,采样间隔为25ms,则总采样时间为50ms,完成了题目要求,S0是初态,按键真值为1,当采样信号的上升沿到来时,我们对按键值进行判断,若为0则表示按下,跳入S1状态,若为1则保持在S0状态,此时输出按键真值为1。
若进入S1状态,下一个上升沿到来时继续对按键值进行判断,若为0则表示还是按住的,进入S2状态,若为1则表示已经松开,为抖动按键,再次进入S0状态。
S2状态后,此时已经过了两个采样周期(50ms),则说明此按键为有效按键,输出有效按键为0,在S2状态若继续得到按键为0则表示连续输入,则按键一直被按下,直到得到按键为1的信号重新进入S0状态。
仿真波形如下所示:
可以看到,当两个采样周期内按键信号都有效时,在下一个上升沿到来时按键信号为有效,当只有一个采样周期内有效则按键真值输出的还是无效电平,当一只按键则按键真值一直有效。
3.2.5键盘编码模块(CODE_TRAN)
该模块的模型如左所示,取的是系统时钟信号以及供编码用的计数信号,输出的是编码后的按键对应值。
具体代码如下所示:
计数值和按键编码的关系如下表所示:
计数值
编码后的值
00
001
01
010
10
011
11
100
仿真后的波形如下所示:
当输入的计数值为0、1、2、3即00、01、10、11时,输出的是1、2、3、4即001、010、011和100,完成了编码的要求。
3.2.6顶层模块
模块模型如3.1所示,仿真波形如下所示:
当输入信号是00时,在SCAN_F的上升沿到来时开始电路开始扫描,此时计数值为10,则为第二行,ROW1和ROW0为01。
输入信号经过了两个采样周期,则为有效的按键信号,则按键真值信号在下一个采样信号的上升沿变为有效低电平,00的编码是011,是第二行的第一列,该位的按键编码值为3。
初步完成了整体的要求。
4.心得体会
通过本次课程设计,让我受益颇丰。
拿到题目时,我并没有太多的头绪,经过大量相关方面的书籍查阅和对读秀中各种相关方便资料的查阅之后才有了一定的设计思路。
本次实验的模块很多,各个模块的联系和产生的信号以及所用的信号之间的关系有点复杂,在做本次课程设计时需要一个清晰的头脑才能完成。
本次设计中了解到太高频率的分频是难以仿真实现的,只能通过低频率的模拟才能仿真出波形,实验中还遇到了很多常识性的问题,如更改器件中的内容之后需要把该器件生成的原先的文件删除之后再仿真才能得到正确的模型。
课程设计中了解到了很多以前不知道的知识,如状态机的设置,消抖电路的实现等关键电路的设计。
本次实验的成功也使得我对学习EDA的热情高涨,不足和不懂之处还有许多,望老师能够多加指导。
参考文献:
[1]潘松黄继业•EDA技术实用教程——VHDL版(第四版)•科学出版社,2011
[2]罗力凡等•基于VHDL的FPGA开发快速入门技巧实例•人民邮电出版社,2009
[3]杨晓慧杨永健•基于FPGA的EDA/SOPC技术与VHDL•国防工业出版社,2007