利用Altera公司的FPGA做为主控设计一款简易计算器。简易计算器可以计算简单的千位以内加减乘除计算,通过矩阵键盘输入数字及运算符,并将计算结果显示在数码管上。
设计中采用Altera的飓风第4代产品家族中的EP4CE6E22C8N为主控,矩阵键盘作为计算器输入,共阳数码管作为计算器输出。
基本实现原理是通过矩阵键盘进行输入,通过判断按下的按键是数字还是运算符,如果是数字则进行数字处理,若为运算符则保存此运算符,在进行输入第二个数,在第二次遇到运算符时则运算,把运算结果给num1,把num2清零,显示num1。这样就完成了简单的加减乘除运算。
矩阵按键原理图如下图所示,
按键设置在行列线交叉点,行、列线分别连接到按键开关的两端。列线通过上拉电阻接+5V的电压,即列线的输出被钳位到高电平状态。行线与按键的一个引脚相连,列线与按键的另一个引脚相连。判断键盘中有无按键按下是通过行线送入扫描信号,然后从列线读取状态得到的。其方法是依次给行线送低电平,检查列线的输入。如果列线信号全为高电平,则代表低电平信号所在的行中无按键按下;如果列线有输入为低电平,则低电平信号所在的行和出现低电平的列的交点处有按键按下。
共阳数码管:
共阴极数码管是把所有led的阴极连接到共同接点com,而每个led的阳极分别为a、b、c、d、e、f、g及dp(小数点),如下图所示。图中的8个led分别与上面那个图中的a~dp各段相对应,通过控制各个led的亮灭来显示数字。
共阳数码管动态显示就是轮流向各位数码管送出字形码和相应的位选,利用发光管的余晖和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示,而实际上多位数码管是一位一位轮流显示的,只有轮流的速度非常快,人眼已经无法分辨出来,在FPGA中是通过一定的频率循环输出对应的位选和段选以达到多位数码管同时显示的。
把总工程分为五个部分分别为按键检测及消抖动、数字输入、转码、显示、运算。
(1)按键检测模块通过轮流给每一列输出低电平,然后通过扫描每行是否有低电平,若有低电平则更改键值并把低电平所在行信号传递给按键消抖模块,否则继续循环输出低电平。消抖模块是采用状态机对按键按下动作的按下阶段和释放阶段进行计数延时以达到消抖的目的。
(2)数字输入模块通过按键消抖得到的按键按下标志信号,当按键标志为按键按下时让这个数字乘十加上现在的键值如此循环便可输入一个数字。
(3)转码模块通过左移、判断是否大于四、是否加三得到该数的个十百千位的四位二进制码,共十六位。
(4)显示模块分别把转码得到的各十百千的十六位传递给动态数码管显示,并由dis_flagp判断显示num1还是num2。
(5)计算模块通过opera_flag储存运算符,并在第二次按到运算符时进行运算。
上图是矩阵按键及消抖的仿真图,如图可以看出,当按键无按下时也就是key_r全为1时,key_c在给四位循环置零以实现列扫描,当按key_r不全为1时,扫描停止,并把键值输出给key_out。
把key_r的低电平位作为key_filter模块的输入信号,进行消抖其中图1是按键下降沿,图2是按键上升沿。由仿真时序图可以看出按键下降沿可用(key_flay && key_state)表示,按键上升沿可用(key_flag && (!key_state))表示。
上图是FPGA内部电路结构图,由于整体太复杂无法看清因此在接下来我会从左到右依次介绍
上图中key_array是矩阵案件模块,key_filter是按键消抖模块,再通过en寄存器来同步按键的值key_num寄存器,图中还有两个寄存器分别是dis_flag和opera_flag寄存器,他们分别是显示标志和运算符保存,它是通过后面的opera模块来控制的。
上图中add模块是输入数字模块,opera是运算模块,当key_num为数字时进入add更改dis_flag所对应的数字,当key_num为运算符时进入opera进行更改opera_flag、dis_flag、num_a、num_b。中间那些选择器是判断把add更改的值给num_a还是num_b的。
上图中左边的选择器是选择把num_a还是num_b给bcd_d模块,bcd_d模块是把二进制码转换成四位十进制千位,四位十进制百位,四位十进制十位,四位十进制个位,在把这些信号传给数码管,让数码管动态显示出所选的数。
输入数据99,再按加法键,输入第二个数字99,按等号键,数码管显示数字198;按减号键,输入第三个数字8,按等号键,数码管显示数字190;按乘号键,输入第四个数字2,按等号键,数码管显示数字390;按除号键,输入第五个数字10,按等号键,数码管显示最后的结果为39。最后按复位键清零。
有没写明白的地方请大家见谅,QQ群317635311欢迎来问,我会耐心解答的。
由于FPGA模块过多所以没有贴出代码,请自行在百度云下载工程文件。
链接:https://pan.baidu.com/s/1uuKzC2lXogIS0Hc1691NKg
提取码:okaj
复制这段内容后打开百度网盘手机App,操作更方便哦