数字逻辑设计:存储历史值硬件实现及八进制计算器数据通路设计问询
问题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
相关产品推荐
相关产品推荐

