앞 가산기의 캐리출력을 다음 가산기의 캐리입력으로 사용하는
Ripple Adder는 가산기 횟수 만큼의 지연이 생깁니다.
그 지연을 없애기 위해서 캐리를 독립적으로 따로 계산하는
방법을 사용하는데... 그것이 CLA 입니다.
이 소스에서는..
- Carry Generate 와 Carry Propagate 를 구현한 컴포넌트
- Carry Lookahead 컴포넌트
- Sum 을 계산하는 컴포넌트
이렇게 3가지 컴포넌트를 써서 CLA를 구현합니다.
library ieee;
use ieee.std_logic_1164.all;
entity cgcpu is
-- cgcpu (Carry Generate & Carry Propagate 회로) ;
-- 공식에 입력 값으로 들어가는 G와 P를 구하는 회로
port(
a, b : in std_logic_vector(3 downto 0);
g, p : out std_logic_vector(3 downto 0)
);
end cgcpu;
architecture dataflow of cgcpu is
begin
g<=a and b;
p<=a xor b;
end;
library ieee;
use ieee.std_logic_1164.all;
entity clbu is
--clbu (Carry Look-ahead Block 회로) ;
--G와 짶를 이용해서 캐리를 출력하는 회로
port(
c0 : in std_logic;
g, p : in std_logic_vector (3 downto 0);
c : out std_logic_vector (4 downto 1)
);
end clbu;
architecture dataflow of clbu is
begin
c(1)<=g(0) or (c0 and p(0));
c(2)<=g(1) or (g(0) and p(1)) or (c0 and p(0) and p(1));
c(3)<=g(2) or (g(1) and p(2)) or (g(0) and p(1) and p(2))
or (c0 and p(0) and p(1) and p(2));
c(4)<=g(3) or (g(2) and p(3)) or (g(1) and p(2) and p(3))
or (g(0) and p(1) and p(2) and p(3)) or (c0 and p(0) and p(1) and p(2) and p(3));
end;
library ieee;
use ieee.std_logic_1164.all;
entity csu is
--csu (Sum Add 회로) ; Sum 값을 구하는 회로
port(
c : in std_logic_vector(3 downto 0);
p : in std_logic_vector(3 downto 0);
s : out std_logic_vector(3 downto 0)
);
end csu;
architecture behav of csu is
begin
process (p, c)
variable i : integer;
begin
loop1 : for i in 0 to 3 loop s(i)<=p(i) xor c(i);
end loop;
end process;
end;
library ieee;
use ieee.std_logic_1164.all;
entity cla is
port(
a, b : in std_logic_vector(3 downto 0);
cin : in std_logic;
s : out std_logic_vector(3 downto 0);
cout : out std_logic
);
end cla;
architecture structural of cla is
signal c_tmp : std_logic_vector(4 downto 1);
signal g_tmp, p_tmp : std_logic_vector(3 downto 0);
-- cgcpu component
component cgcpu
port(
a, b : in std_logic_vector(3 downto 0);
g, p : out std_logic_vector(3 downto 0)
);
end component;
-- clbu component
component clbu
port(
c0 : in std_logic;
g, p : in std_logic_vector(3 downto 0);
c : out std_logic_vector(4 downto 1)
);
end component;
-- csu component
component csu
port(
c : in std_logic_vector(3 downto 0);
p : in std_logic_vector(3 downto 0);
s : out std_logic_vector(3 downto 0)
);
end component;
-- 3가지 컴포넌트를 이용해서 사용하는 부분
begin
cgcpu_b : cgcpu port map (a, b, g_tmp, p_tmp);
clbu_b : clbu port map (cin, g_tmp, p_tmp, c_tmp);
csu_b : csu port map (c(0)=>cin, c(3 downto 1)=>c_tmp(3 downto 1), p=>p_tmp, s=>s);
cout<=c_tmp(4);
end;