乘法比较简单。
最简单的方法就是模拟笔算乘法的过程:
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位。