基于VHDL的矩阵键盘及显示电路设计
如图1所示,全部代码由7个进程(process)组成。其中,进程P1和P2用于对列扫描输入信号kbrow进行读取,并通过或非运算产生行扫描使能控制信号en对行扫描输出信号kbcol进行控制,并生成一个与kbcol对应的状态信号state。若没有按键被按下(即kbrow=0000),则en= '1',行扫描输出信号kbcol不断循环扫描各行;若有按键被按下,en=‘O’,则行扫描停止,并锁存当前kbcol的值。进程P1和P2的代码如下:
进程P3使用“case…when”语句,根据状态信号state的值(即kbcol的值)和列扫描输入信号kbrow的值进行按键值译码,生成一个4位二进制按键数值信号dat,用以记录当前按键值。例如,当kbcol=“0010”,kbrow=“0001”时,“B”键按下,dat=“1011”。进程P3的代码在此不再赘述。
进程P4和P5用于按键的防抖和按键值的移位寄存。通过将行扫描使能控制信号en不断赋给一个8位二进制变量reg8,再将reg8赋给8位二进制信号key,实现对按键状态的记录,然后通过对key的各位数值进行与运算,生成防抖控制信号fnq。一旦有按键按下,en=‘O’,则即便是按键在抖动,key中至少也有1位数值为‘0’,从而使fnq=‘O’。只有当按键再次弹起,并且在连续8个时钟周期内不再有新的按键按下,key的数值全为‘1’,则fnq=‘1’,fnq产生一个上升沿,从而触发按键数值信号dat进入数值寄存信号temp(32位二进制数)的第0~3位,并将temp原来的第0~27位左移到第4~31位,实现1次按键按下的数值存储。进程P4和P5的代码如下:
进程P6用于将数值寄存信号temp的32位二进制数分配给8个数码管,从而生成数码管地址扫描输出scan,以及数码管数值信号data(4位2进制数)。进程P6代码如下:
评论