FPGA学习日记之一

《简易计算器设计验证(四则运算)》

(加、减、乘、除 四则运算计算器设计过程实录)


一, 设计要求

设计验证的这款计算器能够进行四则运算(加减乘除),也可以进行累积运算。通过数码管显示需要进行四则运算的数据,最终显示运算后的结果。进行四则运算的数字需要通过矩阵键盘产生,四则运算的选择也通过矩阵键盘产生。

二, 设计分析

利用矩阵键盘0到9的按键产生需要进行计算的操作数和被操作数,A到D表示四则运算符(加减乘除),E表示等于。

forum.jpg

仿真modelsim波形验证

该计算器进行四则运算的规则为:

对于数码管显示的操作数需要进行左移动作,每对按键进行一次数据的输入,数码管显示的数据进行左移四位。那么数码管数据的表示方式为:show_data= {show_data[19:0],key_value};//{20’d0,key_value};

数码管显示的数据不能够直接用来进行四则运算,现在我们需要考虑产生四则运算的数据方式:假设我们用num1表示操作数,num2表示被操作数,当我们对数字按键进行操作时,操作数num1 = num1 *10 + key_value;被操作数num2的产生方式和操作数相同。

在我们进行四则运算时,输入的操作数显示在数码管上,当我们对操作符(四则运算按键)进行操作时,数码管上显示的数据清零,操作数保持不变,接着可以输入被操作数,数码管显示方式和显示操作数方式相同,被操作数的产生方式与操作数相同;

对等于号(按键E)进行操作,数码管显示清零,操作数和被操作数进行对应的四则运算,对应的四则运算需要在产生被操作数前将我们进行操作的运算符按键值寄存起来,将num1和num2进行对应的四则运算,由于我们需要将运算结果显示在数码管上,那么我们就需要对四则运算的结果进行转码(bcd码),转码完成后给到数码管显示数据。

累积运算是将上一次运算的结果作为操作数,如果是对运算符号进行一次操作,那么上一次运算的结果就作为本次运算的操作数;如果是对数字进行操作,那么表示进行新的一次四则远算,其他按键保持当前运算结果。

forum.jpg

电路视图数码管

根据指定的规则,我们需要如何进行计算器的设计?

利用有限状态机进行设计:

第一步:产生操作数状态,数码管显示数据show_data = {show_data[19:0],key_value};操作数num1 = num1 *10 + key_value;进行这样的数据产生动作需要将矩阵键盘驱动模块产生的标志信号寄存一拍,将寄存一拍后的标志信号作为数码管显示数据和操作数的标志信号。跳转条件为:对运算符按键进行操作,需要定义一个运算符寄存器code[3:0],将运算符按键键值寄存起来。在跳转的同时需要将数码管显示的操作数数据清零。num1保持不变。

第二步:产生被操作数,数码管显示数据show_data = {show_data[19:0],key_value};被操作数num2 = num12*10 + key_value;num1保持不变。运算符寄存器code[3:0]保持不变,跳转条件为:对等于号按键进行操作,数码管显示数据清零。

第三步:进行四则运算,根据运算符寄存器code[3:0]的值进行四则运算,运算完成后进入的转码状态,该状态持续时间只有一个驱动时钟周期。需要定义一个运算结果寄存器result。

第四步:转码状态,对运算出来的结果进行result转码,该状态持续时间只有一个驱动时钟周期。

第五步:显示运算结果状态,等待再次计算:包含重新开始计算和累积运算。如果我们对数字按键进行操作,表示重新开始计算,那么操作数num1 = {19’d0,key_vaule};被操作数清零,数码管显示数据show_data = {19’d0,key_vaule};状态跳转到第一步;如果我们对运算符按键进行操作,上一次运算结果要作为操作数num1,num1= result,数码管显示数据清零,被操作数num2清零,运算符寄存器code将现在操作的运算符按键键值寄存起来,状态跳转到第二步。

状态转移图:

forum.jpg

状态转移图STG