首页 > 编程知识 正文

补码乘法器,补码加减法是指

时间:2023-05-06 09:03:37 阅读:140440 作者:1954

一.实验原理

1. 补码的加法运算

补数的加法法则如下。 [X Y]补数=[X]补数[Y]补数

该式表示将两个码数相加后的补数,是通过先对两个个数分别求出补数后相加而得到的。 在以补数形式表现的情况下,在进行加法运算时能够将编码比特和数值比特一起运算,如果编码比特有进位,则溢出被忽略。 其结果是两个数之和的补数形式。

2 .补数减法

补数的减法律如下。 [X-Y]补数=[X]补数-[Y]补数=[X]补数[-Y]补数

该公式表明,求出[X-Y]补数这两个机械数之差的补数,是通过求出被减数补数(如[X]补数)和减数负值补数(-y )补数之和而得到的。 [-Y]补数对减数执行负操作。 负规则是反转包含符号位的所有位,然后加1。 (实际上,分别反转符号位和真值位。 因为正数和负数的符号也正好相反。

3 .基本加减法器结构如图,该加减法器完成二进制补码的加、减法运算,可用单符号位判断运算是否溢出。

FA是1比特全加法器,m是运算控制,M=0是补数加法,M=1是补数减法,S0比特的运算结果的最低位比特,Sn-2是运算结果的最高位比特,Sn是运算结果的符号比特,在上图中使用单符号位法判断溢出

四.实验现象和结果分析

输入规则对应如下。

1 .输入与开关SD15 -SD8相对应的8位操作数A7-A0

2 .开关sd7输入与sd0相对应的8位操作数B7-B0

3 .支持最低有效位进位cin的开关SA0

支持sum7-sum0等A7-A0、支持最高进位输出的指示灯A8

实现操作

操作数a

操作数b

结果

有没有溢出

M=0进行补数相加

0000 0001

0000 0010

0000 0011

1111 1111

1000 0000

1 0111 1111

M=1进行补数减法运算

0000 0011

0000 0010

0000 0001

0111 1110

1111 1001

1 0111 1111

源代码1 :

1 .全加器代码:

库IEEE;

USEieee.std_logic_1164.all;

ENTITYfull_adder IS

端口

a、b、ci : IN STD_LOGIC;

s,co :OUT STD_LOGIC

);

ENDfull_adder;

ARCHITECTURErtl OF full_adder IS

比根

s=a xor b xor ci;

co=(aandb ) or ) aandci ) or ) bandci;

END rtl;

2 .加减法器代码

库IEEE;

USEieee.std_logic_1164.all;

ENTITYadd8 IS

端口

a、b : instd _ logic _ vector (7down to 0;

M : in std_logic;

s : out STD _ logic _ vector (7down to0);

CO :OUT STD_LOGIC

);

结束添加8;

ARCHITECTURErtl OF add8 IS

COMPONENT full_adder IS

端口

  a,b,ci                  : IN   STD_LOGIC;

                    s,co           : OUT        STD_LOGIC

           );

END COMPONENT full_adder;        

signal C0,C1,C2,C3,C4,C5,C6,C7 : STD_LOGIC;

signal C :STD_LOGIC_VECTOR(7 DOWNTO 0);

BEGIN

C(0)<=M xor B(0);

C(1)<=M xor B(1);

C(2)<=M xor B(2);

C(3)<=M xor B(3);

C(4)<=M xor B(4);

C(5)<=M xor B(6);

C(6)<=M xor B(6);

C(7)<=M xor B(7);

u0:full_adder PORT MAP(A(0),C(0),M,S(0),C0);

u1:full_adder PORT MAP(A(1),C(1),C0,S(1),C1);

u2:full_adder PORT MAP(A(2),C(2),C1,S(2),C2);

u3:full_adder PORT MAP(A(3),C(3),C2,S(3),C3);

u4:full_adder PORT MAP(A(4),C(4),C3,S(4),C4);

u5:full_adder PORT MAP(A(5),C(5),C4,S(5),C5);

u6:full_adder PORT MAP(A(6),C(6),C5,S(6),C6);

u7:full_adder PORT MAP(A(7),C(7),C6,S(7),C7);

CO<=C6 xor C7;

END rtl;

源代码2:

--1位的全加器


LIBRARY ieee;
USE ieee.std_logic_1164.ALL;


ENTITY fulladder IS
PORT (
a, b    : IN std_logic;
CarryIn : IN std_logic;
CarryOut: OUT std_logic;
Sum     : OUT std_logic
);
END fulladder;


ARCHITECTURE fulladder_behav OF fulladder IS
BEGIN
CarryOut <= (a AND CarryIn) OR (b AND CarryIn) OR (a AND b);
Sum <= a XOR b XOR CarryIn;
END fulladder_behav;


--由全加器实现的8位行波进位加法器


LIBRARY ieee;
USE ieee.std_logic_1164.ALL;


ENTITY adder8 IS
PORT (
a    : IN  std_logic_vector(7 DOWNTO 0);
b    : IN  std_logic_vector(7 DOWNTO 0);
cin  : IN  std_logic;
cout : OUT std_logic;
sum  : OUT std_logic_vector(7 DOWNTO 0)
);
END adder8;


ARCHITECTURE ripple OF adder8 IS
COMPONENT fulladder
PORT(
a, b, CarryIn : INSTD_LOGIC;
Sum, CarryOut : OUTSTD_LOGIC
);
END COMPONENT;


SIGNAL carry : std_logic_vector(7 DOWNTO 1);
BEGIN
f0: fulladder PORT MAP (
a => a(0), 
b => b(0),
CarryIn => cin, 
Sum => sum(0), 
CarryOut => carry(1)
);


f1: fulladder PORT MAP (
a => a(1), 
b => b(1),
CarryIn => carry(1), 
Sum => sum(1), 
CarryOut => carry(2)
);


f2: fulladder PORT MAP (
a => a(2), 
b => b(2),
CarryIn => carry(2), 
Sum => sum(2), 
CarryOut => carry(3)
);
f3: fulladder PORT MAP (
a => a(3), 
b => b(3),
CarryIn => carry(3), 
Sum => sum(3), 
CarryOut => carry(4)
);
f4: fulladder PORT MAP (
a => a(4), 
b => b(4),
CarryIn => carry(4), 
Sum => sum(4), 
CarryOut => carry(5)
);


f5: fulladder PORT MAP (
a => a(5), 
b => b(5),
CarryIn => carry(5), 
Sum => sum(5), 
CarryOut => carry(6)
);
f6: fulladder PORT MAP (
a => a(6), 
b => b(6),
CarryIn => carry(6), 
Sum => sum(6), 
CarryOut => carry(7)
);
f7: fulladder PORT MAP (
a => a(7), 
b => b(7),
CarryIn => carry(7), 
Sum => sum(7), 
CarryOut => cout
);
END ripple;

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。