오늘은 Increment, Decrement, 비교 연산 회로에 대해서 알아보기로 하겠습니다. 그런데 Increment가 무엇인지 모르면 곤란하죠.

Increment는 입력을 받으면 +1을 해서 출력으로 내보는 것입니다. 원래 ALU의 기능에 포함되지만 독립적으로 해석해 보겠습니다. 클럭을 입력받아야 하지만 클럭의 기능은 빼고 시작하겠습니다. Decrement는 그 반대로 -1의 기능을 수행합니다. 예를 들자면 입력이 3이라고 가정하면 Increment는 4를 출력할 것이고, Decrement는 2을 출력할 것입니다. 비교기는 간단히 말해 그 입력을 비교하는 것입니다. 여기서는 a가 b보다 크면 1을 출력할 것이고 b가 크면 0을 출력할 것입니다. 간단한 논리 회로입니다. 간단하다고 생각되지만 이 기능이 나중에 큰 기능을 담당합니다.

ex1)

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_signed.all;

entity inc is

port ( pc_in  : in std_logic_vector(4 downto 0);

pc_out : out std_logic_vector(4 downto 0));

end inc;

architecture rtl of inc is

begin

pc_out <= pc_in + 1;

end rtl;

여기에서는 결과 파형을 조금 살펴봅시다.

입력이 0, 1, 3, 1f, 3으로 되어 있습니다. 파형을 관찰할 때 주의 할 점은 모든 구간의 영역을 다 살펴보아야 합니다. 5비트 입력이므로 0h에서 1fh까지 모두 살펴보아야 하지만 사실 그러기는 어렵죠. 그래도 시작점과 끝부분 그리고 입력이 바뀔 수 있는 부분은 모두 체크해야 합니다. 그리고 이 그림에서 알 수 있는데 delay라는 것을 느낄 수가 있죠. 그리고 왜 입력이 4비트가 이니라 5비트인가? 이 점에 대해서 살펴보아야 할 것입니다. Intel의 기본은 8비트입니다. 그러나 이 8비트는 4비트 두 개가 모여서 8비트를 이루는 것입니다. 4비트 연산을 위해서는 5비트의 공간이 필요합니다. 여기에서 보면 11111이 입력입니다. 출력은 00000으로 나와 있지만 값은 원래 값은 100000이 될 것입니다. 그러면 왜 출력을 6비트로 정의하지 않았느냐 하는 질문을 할 수 있을 것입니다. 그러나 상태 Flag에서 이 값을 체크해 carry로 그 값을 보낼 것입니다. 지금은 간단하게 5비트 입력, 5비트 출력 이렇게 되어 있지만, 다음에 살펴볼 ALU에서 입력이 4비트 출력이 4비트인 회로를 설계할 것입니다. 그 때는 내부 Siganl이라는 것을 이용하게 될 것입니다. 내부 시그널은 다음, 다음 시간에 배우게 될 것입니다.

우리가 지금까지 사용하지 않은 구문이 있군요.

use ieee.std_logic_signed.all;

사용하는 Values가 signed 값을 사용한다는 의미입니다. 여기서는 그렇게 큰 의미는 없지만 unsigned 값을 사용한다면 달라지겠죠.

다음은 Decrement 회로를 정의해 볼까요.

ex2)

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_signed.all;

entity dec is

port ( pc_in  : in std_logic_vector(4 downto 0);

pc_out : out std_logic_vector(4 downto 0));

end dec;

architecture rtl of dec is

begin

pc_out <= pc_in - 1;

end rtl;

+, - 기호 하나만 바꾸면 됩니다.

그리고 결과는 다음과 같습니다.

만약 signed package가 없다면 어떻겠습니까?

-- use ieee.std_logic_signed.all;

주석으로 처리한 후 컴파일을 해보세요. 결과가 어떻게 나오는지?

ex3) less than 비교연산 회로

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_signed.all;

entity less is

port ( a, b  : in std_logic_vector(1 downto 0);

z   : out std_logic);

end less;

architecture rtl of less is

begin

process(a, b)

begin

if (a < b) then

z <= '1';

else

z <= '0';

end if;

end process;

end rtl;

간단한 비교기를 보았는데 less than만 될까요? 아닐 것 같지요. 그럼 변형을 해봅시다.

if (a < b) then  -- b가 a보다 크다면

if (a > b) then  -- a가 b보다 크다면

if (a <= b) then  -- b가 a보다 크거나 같다면

if (a >= b) then  -- a가 b보다 크거나 같다면

if (a = b) then  -- a와 b가 같다면

if (a /= b) then  -- a와 b가 같지 않다면

한 줄을 바꿈으로서 6개의 회로를 설계할 수 있습니다.

관계 연산자는 위의 6가지 형태입니다. 유용하게 쓰일 때가 있을 것입니다.

오늘은 간단하게 끝내겠습니다. 제가 좀 피곤해서요.

다음 시간에는 D Flip-flop에 대해서 설계하도록 하겠습니다. FF과 Latch의 차이점을 미리 알아두시는 것이 편할 것입니다.