목차
1. 개요
2. 디자인
3. 결론
4. 느낀점
2. 디자인
3. 결론
4. 느낀점
본문내용
for the Unit Under Test (UUT)
--테스트벤치에서 실험하게 될 구조체 bit4_add_sub을 정의한다.
COMPONENT bit4_add_sub
PORT(
x : IN std_logic_vector(3 downto 0);
y : IN std_logic_vector(3 downto 0);
ci : IN std_logic;
m : IN std_logic;
s : OUT std_logic_vector(3 downto 0);
co : OUT std_logic
);
END COMPONENT;
--Inputs
signal x : std_logic_vector(3 downto 0) := (others => '0');
signal y : std_logic_vector(3 downto 0) := (others => '0');
signal ci : std_logic := '0';
signal m : std_logic := '0';
--Outputs
signal s : std_logic_vector(3 downto 0);
signal co : std_logic;
BEGIN
-- Instantiate the Unit Under Test (UUT)
uut: bit4_add_sub PORT MAP (
x => x,
y => y,
ci => ci,
m => m,
s => s,
co => co
);
--실험하기 위한 프로세스로서 x, y, ci, m에 각각 원하는 입력값을 넣은 후 10ns 기다리고 다음 값을 넣게 된다.
process
begin
x<="0101";
y<="0011";
ci<='0';
m<='0';
wait for 10 ns;
x<="0011";
y<="1010";
ci<='0';
m<='0';
wait for 10 ns;
x<="0010";
y<="0011";
ci<='1';
m<='0';
wait for 10 ns;
x<="0011";
y<="0010";
ci<='0';
m<='1';
wait for 10 ns;
x<="1100";
y<="1001";
ci<='0';
m<='1';
wait for 10 ns;
x<="0100";
y<="0111";
ci<='0';
m<='1';
wait for 10 ns;
end process;
END;
포트에 구조체 bit4_add_sub을 받아 입력으로 x 와 y 벡터, ci, m을 받고 계산하여 s 벡터 및 co를 출력한 후 10ns 기다린 후에 새로운 입력 값을 받는다.
m
x
y
ci
s
co
10진수
0
0101
0011
0
1000
0
5+3=8
0
0011
1010
0
1101
0
3+10=13
0
0010
0011
1
0110
0
2+3+1=6
1
0011
0010
0
0001
1
3-2=1
1
1100
1001
0
0011
1
12-9=9
1
0100
0111
0
1101
0
4-7=-3
입력 값은 실험 전 주어진 값이며 발생해야 하는 결과 값은 위와 같다. 뺄셈 계산을 할 때에는 Co은 필요 없는 값이 되어 버리면 된다. 이제 위의 예측 값이 출력으로 나오는지 테스트 벤치를 실행하여 보면 나오는 파형은 아래와 같다.
결론.
1개의 FullAdder를 만들고 이를 4개를 이어 붙인 가산기를 구현한 후에 m 신호에 따라서 가산기 또는 감산기로 동작할 수 있도록 간단한 연산을 더하여 4비트 가 감산기를 구현하였으며 위의 파형과 예측하였던 결과 값이 동일하여 정상적으로 작동하고 있음을 알 수 있다.
느낀점
전가산기와 4비트 가산기 그리고 감산기는 논리회로시간에 배웠던 기본적인 연산기로서 크게 고민을 하지 않고 실험 시간에 임하였는데 예상과 다르게 프로그래밍 하는 부분에서 지연되었다. 코딩 자체가 복잡한 것은 아니었으나 y와 m을 모두 xor연산 해주는 것을 잊고 하나의 y만 m과 xor 연산을 해준다던지, ci는 모두 m과 xor 연산을 해버려(4비트 확장 단계에서 내부 신호의 c(0~3)과) 결과 값이 계속 엉망진창으로 나왔다. 애초에 기획했던 설계대로 y를 내부 신호로 설정해주고 1. 가산기 2. 4비트 가산기 3. y 벡터와 m의 xor 연산 하는 단계를 더해 주는 식으로 회로를 구현하였다면 이런 부분에서 실수를 하지 않았을 것이라는 점을 배웠다. 이번 실험은 단순하였기 때문에 실수 하였어도 금방 복구할 수 있었으나 분명 더 복잡한 회로를 다루게 된다면 이번 실험같이 주먹구구식으로 해결하지 않고 더 깔끔하고 교수님께서 원하시는 방향으로 회로를 vhdl로 구현할 수 있어야 한다는 점을 배웠다.
--테스트벤치에서 실험하게 될 구조체 bit4_add_sub을 정의한다.
COMPONENT bit4_add_sub
PORT(
x : IN std_logic_vector(3 downto 0);
y : IN std_logic_vector(3 downto 0);
ci : IN std_logic;
m : IN std_logic;
s : OUT std_logic_vector(3 downto 0);
co : OUT std_logic
);
END COMPONENT;
--Inputs
signal x : std_logic_vector(3 downto 0) := (others => '0');
signal y : std_logic_vector(3 downto 0) := (others => '0');
signal ci : std_logic := '0';
signal m : std_logic := '0';
--Outputs
signal s : std_logic_vector(3 downto 0);
signal co : std_logic;
BEGIN
-- Instantiate the Unit Under Test (UUT)
uut: bit4_add_sub PORT MAP (
x => x,
y => y,
ci => ci,
m => m,
s => s,
co => co
);
--실험하기 위한 프로세스로서 x, y, ci, m에 각각 원하는 입력값을 넣은 후 10ns 기다리고 다음 값을 넣게 된다.
process
begin
x<="0101";
y<="0011";
ci<='0';
m<='0';
wait for 10 ns;
x<="0011";
y<="1010";
ci<='0';
m<='0';
wait for 10 ns;
x<="0010";
y<="0011";
ci<='1';
m<='0';
wait for 10 ns;
x<="0011";
y<="0010";
ci<='0';
m<='1';
wait for 10 ns;
x<="1100";
y<="1001";
ci<='0';
m<='1';
wait for 10 ns;
x<="0100";
y<="0111";
ci<='0';
m<='1';
wait for 10 ns;
end process;
END;
포트에 구조체 bit4_add_sub을 받아 입력으로 x 와 y 벡터, ci, m을 받고 계산하여 s 벡터 및 co를 출력한 후 10ns 기다린 후에 새로운 입력 값을 받는다.
m
x
y
ci
s
co
10진수
0
0101
0011
0
1000
0
5+3=8
0
0011
1010
0
1101
0
3+10=13
0
0010
0011
1
0110
0
2+3+1=6
1
0011
0010
0
0001
1
3-2=1
1
1100
1001
0
0011
1
12-9=9
1
0100
0111
0
1101
0
4-7=-3
입력 값은 실험 전 주어진 값이며 발생해야 하는 결과 값은 위와 같다. 뺄셈 계산을 할 때에는 Co은 필요 없는 값이 되어 버리면 된다. 이제 위의 예측 값이 출력으로 나오는지 테스트 벤치를 실행하여 보면 나오는 파형은 아래와 같다.
결론.
1개의 FullAdder를 만들고 이를 4개를 이어 붙인 가산기를 구현한 후에 m 신호에 따라서 가산기 또는 감산기로 동작할 수 있도록 간단한 연산을 더하여 4비트 가 감산기를 구현하였으며 위의 파형과 예측하였던 결과 값이 동일하여 정상적으로 작동하고 있음을 알 수 있다.
느낀점
전가산기와 4비트 가산기 그리고 감산기는 논리회로시간에 배웠던 기본적인 연산기로서 크게 고민을 하지 않고 실험 시간에 임하였는데 예상과 다르게 프로그래밍 하는 부분에서 지연되었다. 코딩 자체가 복잡한 것은 아니었으나 y와 m을 모두 xor연산 해주는 것을 잊고 하나의 y만 m과 xor 연산을 해준다던지, ci는 모두 m과 xor 연산을 해버려(4비트 확장 단계에서 내부 신호의 c(0~3)과) 결과 값이 계속 엉망진창으로 나왔다. 애초에 기획했던 설계대로 y를 내부 신호로 설정해주고 1. 가산기 2. 4비트 가산기 3. y 벡터와 m의 xor 연산 하는 단계를 더해 주는 식으로 회로를 구현하였다면 이런 부분에서 실수를 하지 않았을 것이라는 점을 배웠다. 이번 실험은 단순하였기 때문에 실수 하였어도 금방 복구할 수 있었으나 분명 더 복잡한 회로를 다루게 된다면 이번 실험같이 주먹구구식으로 해결하지 않고 더 깔끔하고 교수님께서 원하시는 방향으로 회로를 vhdl로 구현할 수 있어야 한다는 점을 배웠다.
소개글