计组除法器

一、实验目的
1、理解掌握除法器的原理
二、实验原理
除法是乘法的倒数。和上个实验类似,我们先看一下十进制数的除法。为了方便起见,我们假定十进制数的各位要么为1要么为0,例如(1001010)10÷(1000)10:
1 0 0 1 10 Quotient
Divisor 1 0 0 0 10 )1 0 0 1 0 1 0 10 Dividend
- 1 0 0 0
1 0
1 0 1
1 0 1 0
- 1 0 0 0
1 0 10 Remainder
被除数(Dividend)、除数(Divisor)、商(Quotient)和余数(Remainder)的关系如下式所示: Dividend = Quotient × Divisor + Remainder
式中,Remainder比Divisor小。
除法中求商的基本方法是利用Dividend减去Divisor,看结果是正还是负,来决定商的这位是1还是0。
假定被除数和除数都是正的,因此商和余数都是非负的。操作数和结果都是32位的,忽略符号。如乘法器一样,我们将给出除法器的几个版本的大致框图以及算法流程。
1、第一代除法器
图1.7.1所示是第一代除法器的结构图,32位的商寄存器初始化为0;64位的除数寄存器的左32位初始化为除数,每一步向右移一位和被除数对齐;余数寄存器初始化为被除数。
图1.7.2所示是第一代除法器的算法流程。计算机不像人类那样聪明能预先知道除数是否比被除数小,因此必须在先减去除数(第1步),如果结果是正数,除数小于等于被除数,因此商1;如果结果是负数,下一步就是恢复被除数的值——加除数,并且商0。接着除数右移,开始下一次的循环。当操作完成时,最终商和余数就在各自的寄存器里。

图1.7.1 第一代除法器

图1.7.2 第一代除法器的流程
举个例子来说明上述除法器各个寄存器的变化。假设被除数、除数以及商、余数都是4位,710÷210,也就是(0000 0111)2÷(0010)2。
图1.7.3说明了各个寄存器值的变化,最终结果商是3,余数是1。注意第2步中余数正负的判定只需检查余数寄存器的符号位就可以了。这个算法要求n+1步(n是被除数除数的位数)。
图1.7.3 第一代除法器举例
重复 步骤 商 除数 余数
0 初始值 0000 0010 0000 0000 0111
1 1:Rem=Rem-Div 0000 0010 0000 1110 0111
2:Rem<0→+Div, sll Q, Q0=0 0000 0010 0000 0000 0111
3:Div右移一位 0000 0001 0000 0000 0111
2 1:Rem=Rem-Div 0000 0001 0000 1111 0111
2:Rem<0→+Div, sll Q, Q0=0 0000 0001 0000 0000 0111
3:Div右移一位 0000 0000 1000 0000 0111
3 1:Rem=Rem-Div 0000 0000 1000 1111 1111
2:Rem<0→+Div, sll Q, Q0=0 0000 0000 1000 0000 0111
3:Div右移一位 0000 0000 0100 0000 0111
4 1:Rem=Rem-Div 0000 0000 0100 0000 0011
2:Rem>0→sll Q, Q0=1 0001 0000 0100 0000 0011
3:Div右移一位 0001 0000 0010 0000 0011
5 1:Rem=Rem-Div 0001 0000 0010 0000 0001
2:Rem>0→sll Q, Q0=1 0011 0000 0010 0000 0001
3:Div右移一位 0011 0000 0001 0000 0001
2、第二代除法器
经过仔细观察我们可以发现,只有一半的除数寄存器内容是有效的。将余数寄存器左移来对齐比将除数寄存器右移进行对齐更可以简化除法器的硬件结构。图1.7.4所示是简化后的第二代除法器。算法终止时,余数在余数寄存器的左半部分。

图1.7.4 第二代除法器

3、第三代除法器
比较善于节省空间的人们发现,商寄存器浪费的空间正好和余数寄存器浪费的空间一样,因此,在第三代除法器中,将商寄存器和余数寄存器结合起来。图1.7.5是第三代除法器的算法流程。
跟前两个除法器一样,算法从余数寄存器左移开始。把两个寄存器的移位操作结合在一起,将会使余数寄存器左移的次数多一次,因此最后一步需要将余数寄存器的左半部分右移一位,从图1.7.7的例子中也可以看到这一点。

图1.7.5 第三代除法器的流程

图1.7.6 第三代除法器
举例如上,710÷210,从图7中我们可以看到余数寄存器中商的形成过程,以及一个移位操作中余数和商一起移位的过程。

图1.7.7 第三代除法器举例
重复 步骤 除数 余数
初始值 0010 0000 0111
0 sll Rem 0010 0000 1110
1 1:Rem=Rem-Div 0010 1110 1110
2:Rem<0→+Div 0010 0000 1110
3:sll R, R0=0 0010 0001 1100
2 1:Rem=Rem-Div 0010 1111 1100
2:Rem<0→+Div 0010 0001 1100
3:sll R, R0=0 0010 0011 1000
3 1:Rem=Rem-Div 0010 0001 1000
2:Rem>0→nop 0010 0001 1000
3:sll R, R0=1 0010 0011 0001
4 1:Rem=Rem-Div 0010 0001 0001
2:Rem>0→nop 0010 0001 0001
3:sll R, R0=1 0010 0010 0011
final Rem的左半部分右移一位 0010 0001 0011
对于有符号数的除法来说,商的符号根据被乘数和乘数的符号的异同来决定,余数的符号位和被除数的符号位相同。
三、实验步骤
1、如果未安装ByteBlaster,参照附录一第2章2.2节配置文件的安装。
2、连接JTAG和串行通信线,打开电源。
3、打开Quartus->tools->programmer,将divider.sof下载到FPGA中。注意进行programmer时,应在program/configure下的方框中打勾,然后下载。
4、 实验台上通过模式开关选择FPGA独立调试模式010。
5、将开关CLKSEL拨到0,将短路子DZ3短接且短路子DZ4断开,使FPGA-CPU所需要的时钟使用正单脉冲时钟。

四、实验现象
本实验实现4位数的除法(无符号数除法)。
输入输出规则对应如下:
1、输入的4位被除数(dividend)dd3~dd0对应开关SD11~SD8。
2、输入的4位除数(divisor)dr3~dr0对应开关SD3~SD0。
3、按单脉冲按钮,输入脉冲,也即节拍。
4、余数寄存器remainder(8位)r7~r0对应灯R7~R0。
5、当计算结束时,ready信号为1,对应实验台最上排最右边的标志位指示灯S,同时商和余数分别在灯A3~A0和A7~A4上体现出来。

以图1.7.7的算法为例,一共需要12个小步骤计算出结果。本实验也是通过12个小步骤实现的,通过按单脉冲按钮输入脉冲,观察remainder寄存器的变化,掌握除法器的原理。
1、 拨动开关SD11~SD8输入4位被除数(dd3~dd0)0111,SD3~SD0输入4位除数(dr3~dr0)0010。
2、按动单脉冲按钮,输入脉冲,对照图1.7.7观察remainder寄存器即灯R7~R0的变化情况,当灯S亮时,说明计算结束,灯A3~A0是商、A7~A4是余数,观察R7~R0与 A7~A0的差别(余数寄存器的高4位右移一位得到余数,低4位是商不变)。

根据以上操作细节,仿照图1.7.7填写表中各步骤。
进行新的除法运算时,或者说当上一次运算结束即灯S亮时,输入新的被除数、除数(拨动开关),然后按动单脉冲开关即可观察正确的寄存器结果。
1、被除数:8;除数:3
重复 步骤 除数 余数
初始值 0011 0000 1000
0 sll Rem 0011 0001 0000
1 1:Rem=Rem-Div 0011 1110 0000
2:Rem<0→+Div 0011 0001 0000
3:sll R, R0=0 0011 0010 0000
2 1:Rem=Rem-Div 0011 1111 0000
2:Rem<0→+Div 0011 0010 0000
3:sll R, R0=0 0011 0100 0000
3 1:Rem=Rem-Div 0011 0001 0000
2:Rem>0→nop 0011 0001 0000
3:sll R, R0=1 0011 0010 0001
4 1:Rem=Rem-Div 0011 1111 0001
2:Rem<0→+Div 0011 0010 0001
3:sll R, R0=0 0011 0100 0010
final Rem的左半部分右移一位 0011 0010 0010

2、被除数:15;除数:4
重复 步骤 除数 余数
初始值 0100 0000 1111
0 sll Rem 0100 0001 1110
1 1:Rem=Rem-Div 0100 1101 1110
2:Rem<0→+Div 0100 0001 1110
3:sll R, R0=0 0100 0011 1100
2 1:Rem=Rem-Div 0100 1111 1100
2:Rem<0→+Div 0100 0011 1100
3:sll R, R0=0 0100 0111 1000
3 1:Rem=Rem-Div 0100 0011 1000
2:Rem>0→nop 0100 0011 1000
3:sll R, R0=1 0100 0111 0001
4 1:Rem=Rem-Div 0100 0011 0001
2:Rem>0→nop 0100 0011 0001
3:sll R, R0=0 0100 0110 0011
final Rem的左半部分右移一位 0100 0011 0011
四、实验小结
通过本次除法器实验对,除法器的规则有了跟进一步的了解,也对之前对运算做了进一步对巩固和提升。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值