感谢“面包板社区”,给了我这个评测的机会,在 位竞争者中杀出,我很感激。
回顾一下,虽然没有“龙芯试验箱”,但这本《配套教程》还是讲解了很多开发过程。闭上眼睛回想一下,我以前掌握的哪些 FPGA的开发知识都还没有过时和落伍。
下面我们继续阅读,进入下一章..
================================================
第五章节,在流水线中添加运算类指令
booth计算 5*(-7)的例子,我居然一下子没有看懂!!...
--------------------------------------------------
不是廉颇老矣,而是这个“booth乘法器”,我以前居然没有见过!!!
应该是和抠底壳算法一样,是2010年以后流行起来码技术,正好可以刷新我的知识结构!
一本书如果能为自己带来新知识,哪怕是新增一种新技术储备,这本书就很值了!!
百度百科的解释:
布斯算法将乘数看作从最低位开始的一串二进制数字。
从最低位算起,只要这串数字为“0“,就不执行任何操作;
当这串数字遇到第一个“1”时执行一次减法,即减被乘数与该位权值的乘积,而对于其后的“1”不执行任何操作;
当这串数字再变为“0”时,则遇到第一个“0”时执行一次加法,即加被乘数与该位权值的乘积,而对其后的“0”则不执行任何操作。
如此一直进行到最高位 。
--------------------------------------------------
我理解了一下: booth 算法的原理,应该是这样的:
--------------------------------------------------
举例: 5(0000_0101) * 7(0000_0111) 乘法运算,先 按数字7 来计算,比较快一点:
(数字7: 0111 : 从右到左,从最低bit到最高位的顺序; 默认第-1位,其bit 已经是 0)
第0位 1,发生一次上跳变,累加数字: - 2^0 * 5; (0变1,负号,本地权重2^0)
第1位 1,没有跳变,累加数字0; (1变1,无变化)
第2位 1,没有跳变,累加数字0;
第3位 0,发生下跳变, 累加数字 : 2^3 *5 (1变0,为正)
再往后,都是0,没有跳变,累计数都是0
所以最终结果是: - 2^0 *5 + 2^3 *5 = -5 + 40 = 35 = 5 *7
---------------------------------
同例: 5(0000_0101) * 7(0000_0111) 乘法运算,用5计算:
(数字5: 0101 : 从右到左,从最低bit到最高位的顺序; 默认第-1位,其bit 已经是 0)
第0位 1,发生上跳变,累加数字: - 2^0 * 7; (0变1,负号,本地权重2^0)
第1位 0,发生下跳变,累加数字: 2^1 * 7; (1变0,为正)
第2位 1,发生上跳变,累加数字: - 2^2 * 7; (0变1,负号)
第3位 0,发生下跳变,累加数字: 2^3 * 7 (1变0,为正)
再往后都是0,没有跳变,累计数都是0
所以最终结果是: - 7 + 14 -28 + 56 = 35 = 5 *7
--------------------------------------------------------------
采用 booth 算法,不仅是 每个bit的1参与运算,0也参与运算;
并且连续的1,连续的0不参与运算, 理论上可以降低运算强度
特殊情况下,对于 010101 这样的交错的序列,似乎booth算法也就没什么加速了
================================================
再回到书本的例子中来,其实是一个 码制的表示和转换问题:
无符号数的加法: 可以直接用加法器运算
(缺点是进位链比较长,不在本次讨论范围部内)
有符号数减法:在计算之前先判断大小,按照大小顺序送入减法器输出结果(绝对值)
然后再根据 小减大还是大减小,确定正负符号
(缺点是非常麻烦,还要逻辑判定等,而使用补码表示就会很简单)
无符号数的乘法: 是一个循环移位累加器,逐bit左移累加,在N拍后得到累加结果
(缺点是计算时间比较长,而且不支持有符号数)
有符号数的乘法: 因为原码的乘法已经没有多少优化空间
可以先变换成 符号+原码 形式,套用无符号乘法计算绝对值乘积,
再确定最终的正负符号,码制变换成 补码形式最终输出
(乘法器的缺点很多,这也正是 booth乘法器要针对的地方!!)
----<待续>----
商业资讯 2021-8-3 15:33
yzw92 2021-7-11 08:51