四则运算计算器设计

AI summary
设计一个四则运算计算器,要求包括16个按键(数字、运算符和赋值号),支持显示计算结果并处理超出范围的错误。计算过程包括输入两个操作数和运算符,输出结果,并支持重复计算。设计采用有限状态机(FSM)实现,并进行了仿真测试和下板验证。
Last edited time
Sep 24, 2024 03:04 PM
Last edited by
Tags
Calculator Design
Finite State Machine
Arithmetic Operations

一:设计要求

在昨天矩阵键盘驱动基础之上,实现一个四则运算计算器功能。
+ - * /
  1. 矩阵键盘上一共按键个数16个,操作数(0~9:10个按键),操作符(+/-/*/:4个按键),赋值号(结果:1个按键),四则运算最起码需要15个按键。
    1. 多余的1个按键可以设置一些清除功能/其它运算功能。
      notion image
  1. 数码管显示限制
    1. 显示有一定的限制,显示设备拓展:TFT/VGA/HDMI/LCD…
      123 + 234 = 357 999999+1=1000000
      9999 * 9999 = 99,980,001 24位计算结果:16,777,216
      可以在超出计算/显示范围时,设置计算ERROR功能。
  1. 计算问题
    1. 正常计算:
      1+1=2 2*2=4
      异常计算:
      1++(1+) ++1(0+1) 1+1+1(1+1=2+1=3)

二:设计分析

  1. 按键的键值数据显示在数码管上
    1. 参考练习3。
      show_data[23:0]={show_data[19:0], key_data[3:0]}; //数码显示按键键值数据
  1. 表示操作数(表示操作数和显示键值数据保持一致)
    1. key_data[3:0]=1 key_data[3:0]=2 key_data[3:0]=3
      显示时:show_data[23:0]=24’h000123
      1 12 123
      num1(第一个操作数)=num1 * 10 + key_data;
      num1=1 num1=12 num1=123
      无论操作数多/少,表示方式一样。
  1. 正常显示情况下,计算过程
    1. 1+1=2
      首先确定第一个操作数1(显示和表示),然后确定操作符+(不显示:显示全0),再次确定第二个操作数1(显示和表示),最后输出计算结果(1+1=2)。

三:设计架构

notion image

四:计算模块逻辑分析和实现

  1. 一次计算过程:
    1. num1(第一个操作数) opcode(操作符) num2(第二个操作数) =(赋值号)
      result(计算结果)
  1. 当一次计算结果结束后,考虑重复计算可能:
      • 第二次计算时会将第一次计算结果作为第一个操作数;
        • 1+1=2*4=8
      • 第二次计算时,不使用上次计算结果,重新输入第二次第一个操作数会覆盖之前的计算结果。
        • 1+1=2 5/4=1
  1. 第一次计算过程和重复计算
      • 首先划分操作数(num1和num2)和操作数(opcode);可以将矩阵键盘按键0~9设置为操作数,abcd设置为操作符(+ - * /),e/f任意一个设置为赋值号。
      • 产生第一个操作数(num1)
        • 判断矩阵键盘上的按键是否按下,然后判断按键键值数据,如果键值数据<10,可以认为是操作数。
      • 产生操作符(opcode)
        • 判断矩阵键盘上的按键是否按下,然后判断按键键值数据,如果键值数据>=10&&<14,可以认为是操作符。
      • 产生第二个操作数(num2)
        • 判断矩阵键盘上的按键是否按下,然后判断按键键值数据,如果键值数据<10,可以认为是操作数。
      • 产生赋值号(=)
        • 判断矩阵键盘上的按键是否按下,然后判断按键键值数据,如果键值数据=14/15,可以认为是赋值号。
      • 判断当前具体是哪一种运算
        • 10 : result = num1 + num2; //+
          11 : result = num1 - num2; //-
          12 : result = num1 * num2; //*
          13 : result = num1 / num2; ///
      • 对计算结果进行转码(对10求余)
        • result / 100000 % 10 //十万位(显示在数码管最高位)
      • 1~7过程完成一次计算过程,后续考虑重新计算。
        • 第二次计算时会将第一次计算结果作为第一个操作数;
          1+1=2*4=8
          第二次计算时,不使用上次计算结果,重新输入第二次第一个操作数会覆盖之前的计算结果。
          1+1=2 5/4=1
  1. 采用FSM实现
    1. notion image
  1. 仿真测试结果
    1. notion image
  1. 下板验证
    1. notion image
Loading...