优化1:两个关键点:
- 每个寄存器的当前保存结果即为瞬时输出结果,不影响下一次内容改变;
- 加法器中保存的结果在下一个时钟上升沿来临之前,不会对乘积寄存器有任何改变。
结论:移位和加法器可以同步进行
图1
优化2:计算机进行乘法运算的每一轮产生的中间结果不相互影响,可以一次性算出所有的中间结果直接相加。
结论:减少不必要的硬件资源
- “被乘数寄存器”8位宽带左移,但其中有效数字始终只有4位;
- “乘数寄存器”4位宽带右移,但其中有效数字每周期减少1位;
- “乘积寄存器”8位宽,但初始时有效数字只有4位,而且每周期增加1位;
- “加法器”8位宽,但参与运算的有效数字实际只有4位。
图2
优化方案:
-
“被乘数寄存器”缩减为4位而且取消左移功能(削减了空间,相应的要减少分配给它的任务)
图3 -
“乘积寄存器”增加右移功能,乘积初始值置于其中高4位,随着运算过程不断右移(保留了你的地盘,相应的给你增加一点任务。被乘数左移是为了和中间的结果进行对齐,以便进行运算,这个任务交给乘积寄存器来做。因为左移变成了右移,所以要把乘积初始值置于高4位。)
图4 -
取消“乘数寄存器”,乘数初始置于 “乘积寄存器” 低4位(注意看第2步,乘积寄存器的初始值被置于高4位,并且增加了右移功能。而乘数寄存器刚好是4位寄存器并且带有右移功能,那么可以把乘数寄存器和乘积及存取合并,并把乘数寄存器的4位数置于乘积寄存器的低4位,同时能保证乘数的对齐。)
图5 -
“加法器”缩减为4位宽,“乘积寄存器”只有高4位参与运算(被乘数已被削减位4位,相应的,加法器也调整为4位。)
图6
最终得到的改进版架构:
图7
同理得到N位乘法器的架构:
图8