要实现8位加法,先要从1位开始。假设A,B,C_1分别为两个输入值和进位输入,S是和值,C为进位输出值,于是便有以下表达式:
S=A xor B xor C_1;
C=AB+BC_1+AC_1;
也就是说,如果三个输入中有奇数个1,则和S为1;如果三个输入中至少有两个1,则一定有进位,即C=1。
其中,上面第二式可以写成如下形式
C=AB+(A xor B)C_1;
我们把它改写一下:
C=G+PC_1,其中G=AB,P=A xor B。
于是,我们就有:
C(0)=G(0)+P(0)C_1;
C(1)=G(1)+P(1)C(0)
=G(1)+P(1)(G(0)+P(0)C_1)
=G(1)+P(1)G(0)+P(1)P(0)C_1;
C(2)=G(2)+P(2)C(1)
=G(2)+P(2)(G(1)+P(1)G(0)+P(1)P(0)C_1)
=G(2)+P(2)G(1)+P(2)P(1)G(0)+P(2)P(1)P(0)C_1;
......
其中,G(i)=A(i)B(i),P(i)=A(i) xor B(i)。
对于求和,我们有S(i)=A(i) xor B(i) xor C(i-1)。
从以上分析,我们知道,进位输出是输入进行一次逻辑运算得到,求和输出是两次逻辑运算得到,从而实现了并行。
下面为了节省资源,我们以3位加法为例,给出了VHDL的实现。
library ieee;
use ieee.std_logic_1164.all;
entity adder8 is
port(
A:in std_logic_vector(2 downto 0);
B:in std_logic_vector(2 downto 0);
C_1:in std_logic;
S:out std_logic_vector(2 downto 0);
C2:out std_logic
);
end adder8;
architecture behavioral of adder8 is
signal G,P,C:std_logic_vector(2 downto 0);
begin
G(0)<=A(0) and B(0); P(0)<=A(0) xor B(0);
G(1)<=A(1) and B(1); P(1)<=A(1) xor B(1);
G(2)<=A(2) and B(2); P(2)<=A(2) xor B(2);
C(0)<=G(0)or(P(0) and C_1);
C(1)<=G(1)or(P(1) and G(0))or(P(1) and P(0) and C_1);
C(2)<=G(2)or(P(2) and G(1))or(P(2) and P(1) and G(0))or(P(2) and P(1) and P(0) and C_1);
S(0)<=A(0) xor B(0) xor C_1;
S(1)<=A(1) xor B(1) xor C(0);
S(2)<=A(2) xor B(2) xor C(1);
C2<=C(2);
end behavioral;
用户377235 2013-3-5 00:29
sb.....用个+号不就行了。。。还一位一位搞。。
用户1615602 2012-3-27 10:29