전가산기를 아래와 같이 설계해봤습니다. 더 간단하게도 되지만 그냥 Behavioral로 이렇게 해봤어요
마치 C프로그램 짜듯이
그런데 원하는 출력값이 나오질 않습니다.
코드 설명을 잠깐 드리자면
a,b,ci 순서로 하나씩 확인해가면서 하나라도 1이 있으면 그 개수를 temp에 저장합니다.
temp가 2개 이상이면 carry가 발생하니 c=1 주고요(반대는 생략)
temp가 짝수이면 s=0 줍니다. (반대는 생략)
사용한 signal은 a,b:input ci:carry input c:carry s:sum 입니다.
k는 그냥 a,b,ci를 저장하고 for문으로 다루기위한 bit벡터입니다.
이렇게 해놓고
첨부한 파일을 보시면 a=0 b=0 ci=1일 때, s=1이어야 하는데
안맞는걸 확인하실 수 있을겁니다.
혹시나 해서 temp signal을 그냥 2만 대입해봤더니 이상하게
c, s에서 변화가 생깁니다. 아래 코드만 보면 c, s는 temp 값에의해 결정되니깐
변화가 없어야 정상인 것 같은데요.
원인이 무엇인지 도통 감이 잡히질 않습니다.
rem 연산 때문일까요??
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.NUMERIC_STD.ALL;
entity Fulladder is
Port ( a : in bit;
b : in bit;
ci : in bit;
s : out bit; ---- sum
c : out bit; ----- carry
end Fulladder;
architecture Behavioral of Fulladder is
signal k : bit_vector (1 to 3);
begin
process(a,b,ci)
variable temp : integer;
begin
temp := 0; --- temp 변수 초기화 및 for문 조작을 위해 벡터에 a,b,ci 입력
k(1) <= a;
k(2) <= b;
k(3) <= ci;
for i in 1 to 3 loop --- bit a, b, ci 중에 논리값이 1인 개수를 샌다.
if (k(i)='1') then
temp := temp + 1; --- 개수를 temp에 저장
end if;
end loop;
if ((temp rem 2)=0) then --- 짝수개이면 s=0 홀수면 s=1 : sum 결정
s <= '0';
else
s <= '1';
end if;
if (temp < 2) then --- 2개이상이면 c=1 1개이하이면 c=0 : carry 결정
c <= '0';
else
c <= '1';
end if;
end process;
end Behavioral;