[verilog | VHDL]

[VHDL] 1비트 가감산기 설계(half / full, adder / subtractor)

시그널보내 2022. 4. 19. 15:50
반가산기(Half adder)

한자리 2진수 2개를 입력해 합(sum)과 올림수(carry)를 계산하는 덧셈 회로이다.

진리표와 논리회로는 다음과 같다.

and게이트와 xor게이트를 사용하기 때문에 구조적모델링을 이용하여 컴포넌트를 불러오는 방식으로 코드를 작성하면 다음과 같다. (현재 작업중인 디렉토리에 and, xor게이트에 대한 .vhd파일을 저장해야 한다.)

library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity half_adder is
	Port (X : in STD_LOGIC;
			Y : in STD_LOGIC;
			S : out STD_LOGIC;
			C : out STD_LOGIC);
end half_adder;

architecture Structural of half_adder is

	component AND_Gate
		port(A, B : in std_logic;
				C : out std_logic);
		end component;
		
	component XOR_Gate
		port(A, B : in std_logic;
				C : out std_logic);
		end component;
		
begin

	ANDG: AND_Gate port map(A => X, 
									B => Y, 
									C => C);
	XORG: XOR_Gate port map(A => X, 
									B => Y, 
									C => S);
	
end Structural;

시뮬레이션을 돌려보면 다음과 같이 합과 캐리를 확인 할 수 있다.


전가산기(Full adder)

- 반가산기와 동일한 동작이지만 하위자리에서 발생한 캐리를 추가로 고려한 덧셈회로 이다.

- 두개의 반가산기를 이용하여 만들 수 있다.

2개의 반가산기를 이용하기 때문에 구조적 모델링을 이용하여 반가산기, or게이트를 컴포넌트로 사용하는 방식으로 코드를 작성하면 다음과 같다.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity full_adder_1 is
	Port( X : in STD_LOGIC;
			Y : in STD_LOGIC;
			Ci : in STD_LOGIC;
			S : out STD_LOGIC;
			Co : out STD_LOGIC);
end full_adder_1;

architecture Structural of full_adder_1 is

signal temp1: std_logic;
signal temp2: std_logic;
signal temp3: std_logic;
	
	component half_adder is
	port( X, Y: in std_logic;
			S, C : out std_logic);
	end component;
	
	component OR_VHDL is
	port( A, B: in std_logic;
			C : out std_logic);
	end component;
	
begin
	HALF1 : half_adder port map( X => X, 
											Y => Y, 
											S => temp1, 
											C => temp2);
	HALF2 : half_adder port map( X => temp1, 
											Y => Ci, 
											S => S, 
											C => temp3);
	ORG: OR_VHDL port map( A => temp3, 
									B => temp2, 
									C => Co);
end Structural;

마찬가지로 시뮬레이션을 돌려보면 하위자리 캐리를 함께 고려한 전가산기 파형을 알 수 있다.


반감산기(Half Subtractor)

 - 한자리 2진수 2개를 입력하여 차(D)와 상위자리수에서 빌림수(B)를 계산하는 뺄셈 회로이다.

자료흐름적 모델링을 적용하면 다음과 같이 작성할 수 있다.

library ieee;
use ieee.std_logic_1164.all;

entity half_subtracter is
	port( X : in std_logic;
			Y : in std_logic;
			D : out std_logic;
			Bo : out std_logic);
end half_subtracter;

architecture Dataflow of half_subtracter is
begin
	D <= (X xor Y);
	Bo <= ((not X) and Y);
end Dataflow;

시뮬레이션을 돌리면 다음과 같은 결과가 나온다.

100ns부근을 보면 0에서 1을 빼기 때문에 상위자리 빌림수 B0가 발생하여 최종 결과가 1이 된 것을 알 수 있다.


전감산기(Full Subtractor)

 - 하위자리에서 빌려간 빌림수(Bin)를 추가로 고려한 뺄셈회로

 - input으로 X, Y, Bin / output은 D(차), Bout(상위자리에서 빌린 빌림수)

 - 진리표를 쉽에 이해하기 위해서 X - Y - Bin을 했다고 생각하고 D는 차이, Bout은 빌림수라고 생각하자.

 - 빨간색 네모칸 중 0-0-1을 하면 차이가 발생하고 빌림수도 있기 때문에 출력 모두 1이 나오게 된다.

 - 마지막 결과도 1-1-1이기 때문에 차이 1, 빌림수또한 있어서 1이 된다.

논리회로를 배경으로 vhdl코드로 구조적모델링 설계를 하면 다음과 같다.

library ieee;
use ieee.std_logic_1164.all;

entity full_subtracter is
	port( X : in std_logic;
			Y : in std_logic;
			Bi : in std_logic;
			D : out std_logic;
			Bo : out std_logic);
end full_subtracter;

architecture structural of full_subtracter is

signal temp1: std_logic;
signal temp2: std_logic;
signal temp3: std_logic;

	component half_subtracter is
	port( A, B : in std_logic;
			D, Bo : out std_logic);
	end component;
	
	component OR_VHDL is
	port( A, B: in std_logic;
			C : out std_logic);
	end component;
	
begin
	HALF1: half_subtracter port map( A => X, 
						B => Y, 
						D => temp1, 
						Bo => temp2);
	HALF2: half_subtracter port map( A => temp1, 
						B => Bi,
						D => D,
						Bo => temp3);
	ORG: OR_VHDL port map( A => temp3,
			B => temp2, 
			C => Bo);
	
end structural;

해당 코드를 시뮬레이션 결과는 다음과 같다.