《CPU设计实战》-(4) Wallace tree 乘法器
感谢“面包板社区”的评测机会,让我可以刷新自己的知识架构。
回顾一下:
================================================
我们目前还是停留在 第五章: 在流水线中添加运算类指令
================================================
用 FPGA 做逻辑设计时, 逻辑运算 其实并不是问题,即便逻辑表达非常复杂,也不成为是问题:
方法是利用 查找表 来破解: 事前把所有输入全部展开,并且计算出所有的运算结果,并写入查找表。
--可以强制 把这一个步骤比喻成“训练阶段”; 而且真正的工作是“推理阶段”,只要把输入作为查找表的地址,一步就能查找得预存的结果。
根本不需要与或非门来硬件实现哪些组合逻辑!
这种方法结构简单,通用,几乎适应所有复杂情况,而且时序很好。
唯一的缺点是 编译器 需要做大量的工作: 编译器需要实际展开逻辑表达式的每一路分支,展开所有的逻辑,得到最后的真值表。
但是让编译器 忙一点累一点,又有什么关系呢!
其实,用 FPGA 做逻辑设计时,唯一需要害怕的是: 时序!! 另一个比较关心的是 资源 !!
不过 资源 和要实现的对象的规模, 是直接相关的,很难被进一步压缩;另一方面,资源使用得 很滥 的情况,其实是很难发生的。
而时序则不同:时序和实现对象的规模几无关联:好时序也可以继续被优化;而一个不留神,综合出来的时序则可能非常得差劲!很好则非常难得!!
比如: 用Verilog 做逻辑设计做全加法器逻辑设计,最害怕的并不是用多少个加法器,占用多少资源;而是进位链 带来的时序问题。
特别是 例如 0xFFFF_FFFF + 0xFFFF_FFFF, 从最低位一路进位到最高位的进位情况。会极大拉低了整体时序!
百度“Wallace tree”,说是2018年公布,难怪我不知道呢!
华莱士(C.S. Wallace)于1964年提出的用多个保留进位加法器组成树形结构以实现快速乘法的一种结构。
其方法的要点是:
1)基本元素是 三加数的加法器, 输出 S 改位结果 和 C 进位结果
2)长加法,可以分为多段,都用 三加数加法器实现。 进位结果也参与加法运算
3)一直分段叠加,增加三加数加法器,直到最后得出最终结果
还是老样子,举例来说明: 考虑乘法1011 X 1110,计算过程如下:
1 0 1 1
x 1 1 1 0
------------------------------
0 0 0 0 PP1
1 0 1 1 PP2
1 0 1 1 PP3
1 0 1 1 PP4
------------------------------
中间结果有4个:PP1、PP2、PP3、PP4。
由于 只能用 三加法器,现在有 4个数据,所以,需要两个 三加法器。
第一个加法器:PP1 + PP2 +PP3的加法 == S1, C1
第二个加法器:PP3 + S1+ C1 == S2,C2
最后还需要一盒加法器, 把 S2+C2 计算出来。 这次用普通加法器就行了!
第一个加法器
PP1: 0 0 0 0
PP2: 1 0 1 1 0
PP3: 1 0 1 1 0 0
---------------------------------------
sum1 1 1 1 0 1 0
c1 0 0 0 1 0 0
第二个加法器
carry_in: 1 0 1 1 0 0 0
sum1 0 1 1 1 0 1 0
c1 0 0 0 1 0 0 0
---------------------------------------
sum2: 1 1 0 1 0 1 0
c2: 0 0 1 1 0 0 0
第三个普通加法器:
sum2: 1 1 0 1 0 1 0
c2: 0 1 1 0 0 0 0
---------------------------------------
product 1 0 0 1 1 0 1 0
商业资讯 2021-8-3 15:33