热度 12
2012-3-21 17:53
2420 次阅读|
2 个评论
要实现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;