河北大学 计算机组成原理 实验报告
学院 年级 专业
学号 姓名
实验日期 实验地点 指导老师
实验项目 不恢复余数阵列除法器 经济学人论坛 成绩
一、 实验目的:
理解除法器的原理。
二、实验原理:
这次实验实现原码不恢复余数法的阵列除法器算法(余数左移除数固定),详细计算过程如下。
例题:X=0.10110,y=0.111,求[x/y]原。则[x]补=0.10110,[y*]补=0.111,[-y*]补=1.001
| 被除数 | 商 | 步骤说明 |
+ | 00.101 100 11.001(减去除数) | | 关雎翻译减去除数 |
+ | 11.110 100 11.101 000(左移一位) 00.111(加上除数) | 0 | 余数为负,商上0,左移一位,加上[y*]补,此时count=3 |
+ | 00.100 000 01.000 000(左移一位) 11.001(减去除数) left是什么意思 | 01 | cabi 余数为正,商上1,左移一位,减去除数,此时count=2 |
+ | 00.001 000 00.010 000(左移一位) 11.001(减去除数) | 011 | 余数为正,商上1,左移一位,减去除数,此时count=1 |
+ | 11.011 000 00.111(加上除数) | 0110 | 余数为负,商上0,此时count=0,停止运算,发现余数小于0,加上[y*]补恢复 |
| 00.010 000 | | |
| | | |
由于除数被除数都为正,因此最后结果为正,直接在最后的结果加上“+”,商为+0.110,但是由于除数在计算的过程中被逻辑左移了3次,所以要乘以2^-5进行恢复,故余数为0.000 010 000。
原码不恢复余数法原理说明:
①符号位单独处理,参加运算的是除数和被除数的绝对值的补码,除数的绝对值用y*表示;
②合法的除法运算中,被除数必须小于除数,因此第一次上商肯定是r6=0,否则溢出,停止运算;
③原码恢复余数法来源于手算的竖式除法。若余数为正,表示够减,商上1,左移一位,减去[y*]补,也就是加上[-y*]amenity补;若余数为负,表示不够减,商上0,恢复余数(加上除数),变成减去除数之前的结果,继续左移一位,加上[-y*]补。
④原码不恢复余数法建立在原码恢复余数法的基础之上,假设当前的余数为R。当余数大于0时,下一步余数是先左移一位再减去除数,即下一步余数应该为R’=2R-y*;当余数小于
0时先恢复余数,然后再左移一位再减去除数,假设当前余数为R,那么下一步余数应该为R’=2(R+y*)-y*=2R+y*。以上两个式子将恢复余数法的步骤定量化了,也就是说,要么左移一位加上y*,要么左移一位减去y*,这就是加减交替的含义。
⑤除数和被除数具有3位尾数的合法的除法,需要逻辑移位3次,上商3+1=4次。可以设置一个计数器count来控制循环次数,达到3次就停止。
⑥若最后一步为负,表示不够减,商上0,需要恢复余数,即加上除数,否则不需要。
接下来介绍原码不恢复余数阵列除法器
①可控加法/减法(CAS)单元
原理是利用一个可控加法/减法 CAS 单元所组成的流水阵列来实现的它有四个输出端和 四个输入端。当输入线 P=0 时,CAS 作加法运算;当 P=1 时,CAS 作减法运算。逻辑结构图 如图所示。 不恢复余数阵列除法器的逻辑结构图 CAS 单元的输入与输出的关系可用如下一组逻辑方程来表示:
Si=Ai⊕(Bi⊕P)⊕C,Ci+1=(Ai+Ci)· (Bi⊕P)+AiCi
当 P=0 时,就是一个全加器,如下式: Si=Ai⊕Bi⊕Ci ,Ci+1=AiBi+betisBiCi+AiCi 当 P=1 ns时,则得求差公式: Si=Ai⊕非Bi⊕Ci ,Ci+1=AiBi+BiCi+AiCi ,其中 非Bi=Bi⊕1。 在减法情况下,输入 Ci 称为借位输入,而 Ci+1 称为借位输出。
②不恢复余数的除法(加减交替法)
在不恢复余数的除法阵列中,每一行所执行的操作究竟是加法还是减法,取决于前一行输出的符号与被除数的符号是否一致。当出现不够减时, 部分余数相对于被除数来说要改变符号。这时应该产生一个商位“0”,除数首先沿对角线右移,然后加到下一行的部分余数上。当部分余数不改变它的符号时,即产生商位“1”,下一行的操作应该是减法。
本实验就采用加减交替的方法设计这个阵列除法器。
被除数为x= X0.x6x5x4x3x2x1(这里需要右移,是双倍长);除数为y=Y0.y3y2y1。其中 X0 和 Y0 是被除数和除数的符号位,在本次设计中 X0 和 Y0 为零,商的符号位恒为零,商为q4.q3q2q1,余数为0.00r6r5r4r3。字长n+1=4
由图看出,该阵列除法器是用一个可控加法/减法(CAS)单元所组成的流水阵列来实现的。推广到一般情况,一个(n+1)位除(n+1)位的加减 交替除法阵列由(n+1)2个fusionCAS单元组成,其中两个操作数(被除数与除数) 都是正的。
(1)单元之间的互连是用n=3的阵列来表示的。这里被除数x是一 个6位的小数(双倍长度值):x= X0.x6x5x4x3x2x1它是由顶部一行和最右边的对角线上的垂直输入线来提供的。
(2)除数y是一个3位的小数:y=0.y3y2y1它沿对角线方向进入这个阵列。这是因为,在除法中所需要的部分 余数的左移,可以用下列等效的操作来代替:即让余数保持固定,而将除数沿对角线右移。
(3)商q是一个3位的小数: q=0.q1q2q3 它在阵列的左边产生。
(4)余数r是一个6位的小数: r=0.00r3r4r5r6 它在阵列的最下一行产生。
最上面一行所执行的初始操作经常是减法。因此最上面一行的控制 线P固定置成“1”。减法是用2的补码运算来实现的,这时右端各CAS单元上的反馈线用作初始的进位输入。每一行最左边的单元的进位输出决定着商的数值。将当前的商反馈到下一行,我们就能确定下一行的操作。由于进位输出信号指示出当前的部分余数的符号,因此,它将决定下一行的操作将进行加法还是减法。 innocent
对不恢复余数阵列除法器来说,在进行运算时,沿着每一行都有进位(或借位)传播,同时所有行在它们的进位链上都是串行连接。而每个CAS单元的延迟时间为3T单元,因此,对
一个2n位除以n位的不恢复余数阵列除法器来说,单元的数量为(n+1)2,考虑最大情况下的信号延迟,其除法执行时间为 td=3(n+1)2T
三、实验步骤:
(1)打开Quartys II。
(2)将子板上的JTAG端口和PC机的并行口用下载电缆连接。打开实验台电源。(3)执行Tool→Programmer命令,将adder8.sof下载到FPGA中。注意在执行Programmer中,应在program/configure下的方框中打钩,然后下载。
(4)在实验台上通过模式开关选择FPGA-CPU独立调试模式010。
四、实验现象及分析:
本实验实现4位除4位阵列除法器。
输入输出规则对应如下:
(1)输入被乘数A和乘数B,A和B分别是x= X0.x6x5x4x3x2x1和 y=Y0.y3y2y1
(2)输出的结果是商为q4.q3q2q1,余数为0.00r6r5r4r3。
输入输出范例:
被除数A | 除数B | 商 | 余数 |
0.101100 | 0.111 | 0.111 | 1.111011 |
110 000 | 111 | 0.110 | 1111 |
010 110 | 110 | 0.011 | 0100 |
| | | |
五、实验过程中遇到问题及解决方法:
问题一:阵列除法器采用的过程是什么
解决方法:余数固定除数右移。余数左移除数固定的算法适合除数和被乘数尾数为n的运算,余数固定除数右移的将例题稍作修改即可。
问题二:阵列除法器是如何做到减去除数,即加上[-y*]补的?
解决方法:变补的法则是:对[y*]补包括符号位“求反且最末位加1”即可得到[-y*]补。阵列除法器只能做加法,通过图中的“非Bi=Bi⊕1”实现 求反,通过某一行最右侧的Ci (借位输入)为1实现最末位加1。
问题三:实验现象中第一行的运算结果中,余数是1011,是除法器在逗吗?
解决方法:阵列除法器并没有在逗你,采取余数固定除数右移是得到的余数是1.111011,这表明不够减,解决方法是恢复余数,得到余数为0.000 010,或者再算两次,得到余数为0.000 000 01,此时商为0.110 01。而在硬件层面上不实现这个功能。如果允许余数为负数,结果就是对的。
问题四:直接将整个CAS连接起来可以吗?
gretchen wilson
解决方法:像
--不恢复余数阵列除法器(4位除4位阵列除法器)
library ieee;
u ieee.std_logic_1164.all;
entity composition_7_2_non_restoring_array_divider is
port( x:in std_logic_vector(6 downto 1); --这里编号顺序与课本不同
y: in std_logic_vector(3 downto 1);
q: out std_logic_vector(4 downto 1);
r:out std_logic_vector(6 downto 3));
end composition_7_2_non_restoring_array_divider;
architecture s_div of composition_7_2_non_restoring_array_divider is
component CAS is port(
A,B,Ci,P : IN STD_LOGIC;
--P,B :inout std_logic;
Pout,Bout,Si,CoPlus : OUT STD_LOGIC
);
end component;
signal p1out:std_logic_vector(1 to 16); --CAS的右上部分为加减法控制输出
signal b1out:std_logic_vector(1 to 16); --CAS的右下部分为输入的B的输出
signal s1:std_logic_vector(1 to 12); --CAS的竖线方向为余数输出
signal co1plus:std_logic_vector(1 to 16); --CAS的左下部分为进位输出
--signal gnd:std_logic := '0'; --'0'