1、由于在运算器内通常只能完成对两数的求乘操作,则可以每求得一个相加数,就同时完成与上一次部分积相加的操作。其次是在手工计算时,各加数逐位左移,最终相加数为相乘二位数的两倍,而在计算机中,加法器的位数一般与乘法器的位数相同,而不是寄存器位数的两倍。这实际上也可以用另外的办法解决。手工计算时,各加数是逐位左移,但很容易发现,在求本次部分积之和时,前一部分积的最低一位是不再与任何数值相加的。这就意味着,若采用每求得一次部分积之后使其右移一位,则可以只用N位的加法器就能实现两个N位的数相乘j!显而易见,若前一次部分积已经右移一位,就可以用其高位部分加上被乘数或加零的方法求得本次部分积。最后一点是,手工计
2、算时,乘数每一位的值是0还是1都直接看得见,而在计算机内,采用放乘数的寄存器的每一位直接决定本次相加数是被乘数还是零是很不方便的,若均采用该寄存器的最低一位来执行这种判别就简便了。为此,只要每求一次部分积就使放乘数的寄存器执行一次右移操作即可以了。若移位时,使其最高数值位接收加法器最低位的输出,则完成乘法运算后,该寄存器中保存的是乘积的低位部分。计算机内求乘积的符号,很容易用求相乘二数符号的半加和(异或值)实现。 原码一位乘法的规则: 判断参加运算的操作数是否合格; 令乘数的最低位为判断位,若为“1”,加被乘数,若为“0”,不加被乘数(加0); 累加后的部分积以及乘数右移一位 重复n次和 ;
3、符号位单独处理,同号为正,异号为负。 通常,乘法运算需要3个寄存器。被乘数存放在B寄存器中;乘数存放在C寄存器中;A寄存器用来存放部分积与最后乘积的高位部分,它的初值为0。运算结束后寄存器C中不再保留乘数,改为存放乘积的低位部分。 例:已知:X=0.1101,Y=-0.1011,求:XY。 |X|=00.1101B,|Y|=.1011C,0A原码一位乘法示例A C 说明 00.0000 1011 +|X| 00.1101 C4=1,+|X| 00.1101 00.0110 1101 部分积右移一位 01.0011 00.1001 1110 部分积右移一位 +0 00.0000 C4=0,+0
4、00.1001 00.0100 1111 部分积右移一位 +|X| 00.1101 C4=1,+|X| 01.0001 00.1000 1111 部分积右移一位PS=XSYS=01=1X*Y=-0.10001111 原码一位乘法流程图 这里为了简便,我编写了无符号数原码的乘法运算,不考虑符号位。即实现了两个四位数相乘,结果放入一个八位数中。4、实验源代码library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity ALU isport( s
5、et:in std_logic;- 运算控制信号 code:in std_logic_vector(3 downto 0);- 操作码 cin:- 低位向高位的进位或者借位信号 opr1:in std_logic_vector(7 downto 0);- 第一操作数 opr2:- 第二操作数 result:out std_logic_vector(7 downto 0);- 运算结果 flag:out std_logic-运算结果标志位flag );end ALU;architecture behav of ALU issignal a:std_logic_vector(7 downto 0)
6、;signal b:signal c:shared variable y,x:beginprocess(b,c,temp1,set,code,cin,opr1,opr2)variable i: integer;a=00000000;bCx:temp:temp1resultflag-+ a(0)=opr1(0) and opr2(0);b(0)=opr1(0) xor opr2(0);-产生本地进位和传递条件 a(1)=opr1(1) and opr2(1);b(1)=opr1(1) xor opr2(1); a(2)=opr1(2) and opr2(2);b(2)=opr1(2) xor o
7、pr2(2); a(3)=opr1(3) and opr2(3);b(3)=opr1(3) xor opr2(3); a(4)=opr1(4) and opr2(4);b(4)=opr1(4) xor opr2(4); a(5)=opr1(5) and opr2(5);b(5)=opr1(5) xor opr2(5); a(6)=opr1(6) and opr2(6);b(6)=opr1(6) xor opr2(6); a(7)=opr1(7) and opr2(7);b(7)=opr1(7) xor opr2(7);-每四位一组,组内先行进位加法,组间串行进位加法. result(0)=b(
8、0) xor cin; c(0)=a(0) or (b(0) and cin); result(1)=b(1) xor c(0); c(1)=a(1) or (b(1) and a(0) or (b(1)and b(0)and cin); result(2)=b(2) xor c(1); c(2)=a(2) or (b(2) and a(1) or (b(2)and b(1)and a(0) or (b(2)and b(1)and b(0)and cin); result(3)=b(3) xor c(2); c(3)=a(3) or (b(3) and a(2) or (b(3)and b(2
9、)and a(1) or (b(3)and b(2)and b(1)and a(0) or (b(3)and b(2)and b(1)and b(0)and cin); result(4)=b(4) xor c(3); c(4)=a(4) or (b(4) and c(3); result(5)=b(5) xor c(4); c(5)=a(5) or (b(5) and a(4) or (b(5)and b(4)and c(3); result(6)=b(6) xor c(5); c(6)=a(6) or (b(6) and a(5) or (b(6)and b(5)and a(4) or (
10、b(6)and b(5)and b(4)and c(3); result(7)=b(7) xor c(6); flag=a(7) or (b(7) and a(6) or (b(7)and b(6)and a(5) or (b(7)and b(6)and b(5)and a(4) or (b(7)and b(6)and b(5)and b(4)and c(3);0001+1=not opr1(0);=opr1(1) xor opr1(0);=opr1(2) xor (opr1(1) and opr1(0);=opr1(3) xor (opr1(2) and opr1(1) and opr1(0
11、);=opr1(4) xor (opr1(3) and opr1(2) and opr1(1) and opr1(0);=opr1(5) xor (opr1(4) and opr1(3) and opr1(2) and opr1(1) and opr1(0);=opr1(6) xor (opr1(5) and opr1(4) and opr1(3) and opr1(2) and opr1(1) and opr1(0);=opr1(7) xor (opr1(6) and opr1(5) and opr1(4) and opr1(3) and opr1(2) and opr1(1) and op
12、r1(0);=opr1(7) and opr1(6) and opr1(5) and opr1(4) and opr1(3) and opr1(2) and opr1(0);0010-=opr1(0) and (not opr2(0);=opr1(0) xor (not opr2(0);=opr1(1) and (not opr2(1);=opr1(1) xor (not opr2(1);=opr1(2) and (not opr2(2);=opr1(2) xor (not opr2(2);=opr1(3) and (not opr2(3);=opr1(3) xor (not opr2(3);
13、=opr1(4) and (not opr2(4);=opr1(4) xor (not opr2(4);=opr1(5) and (not opr2(5);=opr1(5) xor (not opr2(5);=opr1(6) and (not opr2(6);=opr1(6) xor (not opr2(6);=opr1(7) and (not opr2(7);=opr1(7) xor (not opr2(7);=b(0) xor (not cin);=a(0) or (b(0) and (not cin);=a(1) or (b(1) and a(0) or (b(1)and b(0)and
14、 (not cin);=a(2) or (b(2) and a(1) or (b(2)and b(1)and a(0) or (b(2)and b(1)and b(0)and (not cin);=a(3) or (b(3) and a(2) or (b(3)and b(2)and a(1) or (b(3)and b(2)and b(1)and a(0) or (b(3)and b(2)and b(1)and b(0)and (not cin); c(7)=not c(7);0011-1=opr1(1)xor(not opr1(0);=opr1(2)xor(not (opr1(1)or op
15、r1(0);=opr1(3)xor(not (opr1(2)or opr1(1)or opr1(0);=opr1(4)xor(not (opr1(3)or opr1(2)or opr1(1)or opr1(0);=opr1(5)xor(not (opr1(4)or opr1(3)or opr1(2)or opr1(1)or opr1(0);=opr1(6)xor(not (opr1(5)or opr1(4)or opr1(3)or opr1(2)or opr1(1)or opr1(0);=opr1(7)xor(not (opr1(6)or opr1(5)or opr1(4)or opr1(3)
16、or opr1(2)or opr1(1)or opr1(0);=not(opr1(7)or opr1(6)or opr1(5)or opr1(4)or opr1(3)or opr1(2)or opr1(1)or opr1(0);0100*操作数为4位,结果为8位,无符号数原码乘法 -c=opr1(3 downto 0)*opr2(3 downto 0); x(0): x(1): x(2): x(3): x(4):=opr1(0); x(5):=opr1(1); x(6):=opr1(2); x(7):=opr1(3); y(0):=opr2(0); y(1):=opr2(1); y(2):=o
17、pr2(2); y(3):=opr2(3); y(4): y(5): y(6): y(7): i:=0; while (i4) loop if(y(0)=) then y:=x+y; else y:=y; end if; y(0):=y(1);=y(2);=y(3);=y(4);=y(5);=y(6);=y(7); -y(7 downto 0)=y1(7 downto 0); i:=i+1; end loop; -y(7) result15) or (opr215) then flag end if;0101-传送数据 result=opr1(7 downto 0);0110and=opr1(
18、0)and opr2(0);=opr1(1)and opr2(1);=opr1(2)and opr2(2);=opr1(3)and opr2(3);=opr1(4)and opr2(4);=opr1(5)and opr2(5);=opr1(6)and opr2(6);=opr1(7)and opr2(7);0111or=opr1(0)or opr2(0);=opr1(1)or opr2(1);=opr1(2)or opr2(2);=opr1(3)or opr2(3);=opr1(4)or opr2(4);=opr1(5)or opr2(5);=opr1(6)or opr2(6);=opr1(7
19、)or opr2(7);1000not=not opr1(1);=not opr1(2);=not opr1(3);=not opr1(4);=not opr1(5);=not opr1(6);=not opr1(7);1001xor=opr1(0)xor opr2(0);=opr1(1)xor opr2(1);=opr1(2)xor opr2(2);=opr1(3)xor opr2(3);=opr1(4)xor opr2(4);=opr1(5)xor opr2(5);=opr1(6)xor opr2(6);=opr1(7)xor opr2(7);1010SAL case opr2 is wh
20、en =opr1;00000001result(0) result(7 downto 1)=opr1(6 downto 0);00000010 result(7 downto 2)=opr1(5 downto 0);00000011 result(7 downto 3)=opr1(4 downto 0);00000100 result(7 downto 4)=opr1(3 downto 0);00000101 result(7 downto 5)=opr1(2 downto 0);00000110 result(7 downto 6)-error end case;1011SARresult(7)=opr1(7); result(6 downto 0)=opr1(7 downto
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1