You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数字逻辑设计:存储历史值硬件实现及八进制计算器数据通路设计问询

问题2:八进制计算器数据通路设计方案

针对你这款24位八进制计算器,我给你梳理一个贴合需求的设计思路,一步步拆解:

核心元件定义

首先明确两个核心寄存器:

  • in_reg:24位输入寄存器,对应8个八进制位(3位二进制=1位八进制,24÷3=8),复位时清零;
  • acc:24位累加器,同样对应8个八进制位,复位时清零;
    还要加一个1位的状态寄存器c_state,用来记录C键的按下状态。

1. C键的双重功能逻辑

C键的行为要靠c_state来判断:

  • 初始状态下c_state=0,第一次按C:触发in_reg清零,同时把c_state设为1;
  • 若两次C键之间没按数字键/功能键,第二次按C:触发acc清零,同时把c_state复位为0;
  • 要是两次C键之间按了其他键,直接把c_state复位为0,下次按C只会清零in_reg。

2. 数字键(0-7)的输入逻辑

按下数字键时,in_reg要执行“左移3位+补新数字到低位”的操作:

  • 左移3位等价于八进制下的“左移一位”(因为8=2³),刚好符合计算器输入新数字时“高位左移,新数字补最右边”的逻辑;
  • 要加一个输入位数计数器digit_cnt,记录当前in_reg已经输入了多少个八进制数字,满8位后就不再响应数字键输入,避免溢出。
    硬件逻辑可以这么理解:
in_reg <= {in_reg[20:0], digit_in[2:0]}; // 左移3位,低位补当前输入的3位二进制数字(对应0-7)
digit_cnt <= digit_cnt + 1; // 位数加1,直到满8位后停止

3. 功能键(+、-、×)的运算逻辑

按下功能键时,要把in_reg和acc的内容做运算,结果存回acc,同时重置in_reg和c_state:

  • 加法:直接做24位二进制加法,若结果超过24位,设置一个溢出标志位overflow_flag,显示错误提示;
  • 减法:如果是无符号运算,先判断acc是否大于等于in_reg,不够减的话要么显示负数(用补码处理),要么触发溢出;如果是有符号运算,直接用补码减法即可;
  • 乘法:24位×24位会得到48位结果,计算器可以选择显示低24位(或者高24位),同样加溢出标志位提示超出范围。

运算完成后:

acc <= operation_result; // 运算结果存回累加器
in_reg <= 24'd0; // 输入寄存器清零,准备下一次输入
c_state <= 0; // C键状态复位

4. 显示逻辑

把in_reg和acc的24位二进制分成8组,每组3位,分别转换成八进制数字(0-7),输出到显示模块(比如7段数码管),每组对应一个八进制数位的显示。


内容的提问来源于stack exchange,提问作者aa1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:29:40