乘法器实现



乘法比较简单。






最简单的方法就是模拟笔算乘法的过程:






     1101 A


*    1011 B


---------


     1101


    1101


   0000


  1101


---------


10001111






具体过程:1、累加器清零;2、由乘数B的末位确定是否把A加到累加器中;3、A左移1位、B右移1位;4、重复1。






改进一下:乘数B右移的时候空出的高位,可以利用来存放结果的低位,即移位的时候,A不需要移动,而是把累加结果右移1位,移出的部分进入乘数B的空位中,这样最终结果的高位放在累加器中,低位放在B中。这样做的好处是,A、B、累加器的位数一样,容易在计算机体系中运算。
回复 举报
judy58


8
主题
0
好友
335
积分
游客
莫元335
发消息
8楼
 发表于 2005-12-30 11:24:34 |只看该作者
AVR ALU 与32 个通用工作寄存器直接相连。寄存器与寄存器之间、寄存器与立即数之间的ALU 运算只需要一个时钟周期。ALU 操作分为3 类:算术、逻辑和位操作。此外还提供了支持无/ 有符号数和分数乘法的乘法器.


avr有只需两个时钟周期的硬件乘法器
回复 举报
qwernet


77
主题
0
好友
2082
积分
金牌会员
Rank: 6Rank: 6
莫元1772
发消息
9楼
 发表于 2005-12-30 11:25:56 |只看该作者
再改进,每次乘两位!






根据乘数末两位确定被乘数如何加到累加器中:






末位| 操作


----------


00    不加


01    加一次被乘数


10    加被乘数的两倍(左移1位)


11    加被乘数的3倍(左移2位,减去自己)






然后累加器和乘数均右移2位,同样累加器移出的部分补入乘数空出的高位中。






其中加被乘数的3倍比较麻烦,一次算不了,可以先暂时减一次被乘数,在下个步骤补回加上4倍被乘数就行了,可以设置一个触发器C来实现:






末位| C | 操作


--------------


00    0   不加,C保持0


01    0   加1倍被乘数,C保持0


10    0   加2倍被乘数,C保持0


11    0   减1倍被乘数,set C=1


00    1   加1倍被乘数,set C=0


01    1   加2倍被乘数,set C=0


10    1   减1倍被乘数,C保持1


11    1   不加,C保持1










再改进,一次乘4位……




回复 举报
yuhuashan


44
主题
0
好友
302
积分
中级会员
Rank: 3Rank: 3
莫元302
发消息
10楼
 发表于 2005-12-30 12:05:43 |只看该作者
各位大虾能在详细的讲讲除法吗?


多谢了
回复 举报
qwernet


77
主题
0
好友
2082
积分
金牌会员
Rank: 6Rank: 6
莫元1772
发消息
11楼
 发表于 2005-12-30 12:18:06 |只看该作者
除法一般不好优化,直接按照笔算步骤来算就可以了:






1、根据被除数(余数)和除数的大小来上商;


2、被除数(余数)低位补0,再减去右移后的除数,也可以改为左移余数,减去除数,这样可以确保参与运算的寄存器具有相同的位数;


3、商写到寄存器的最低位,然后商左移1位。

你可能感兴趣的:(架构设计)