관리 메뉴

드럼치는 프로그래머

[시스템분석및설계] 7,8장 3선8선 디코더, 4입력 멀티플렉서 예비레포트 본문

★─Multi Media/☆─2학년 2학기

[시스템분석및설계] 7,8장 3선8선 디코더, 4입력 멀티플렉서 예비레포트

드럼치는한동이 2007. 10. 30. 21:39

◎ 실험 목적

3선/8선 디코더4입력 멀티플렉서의 동작을 VHDL로 기술하고, 시뮬레이션
을 통해 동작을 검증한다.

◎ 이론 설명

▶ 3선/8선 디코더

① n 비트의 입력 신호를 받아들여, 출력 신호 개를 만들어 내면서 그중에 하나(입력 신 호 비트의 십진 값에 해당하는 출력)만을 나머지 신호와 다른 값을 갖게 만들어 주는 조 합 회로를 “디코더”라 부른다.

② n선/m선 디코더라 하면 n개의 입력과 m개의 출력을 갖는 디코더를 말하며, n×m 디코 더라 부르기도 한다.

③ 3선/8선 디코더의 동작은 3개의 입력 신호의 조건에 따라 8개의 출력 신호중 하나의 출 력만이 1이된다. 즉, 입력 3비트 이진수의 십진 값에 해당하는 출력만이 다른 출려과 구 별되는 값을 갖는 것이라 할 수 있다.

④ 진리표

입 력

출 력

a2

a1

a0

d7

d6

d5

d4

d3

d2

d1

d0

0

0

0

0

0

0

0

0

0

0

1

0

0

1

0

0

0

0

0

0

1

0

0

1

0

0

0

0

0

0

1

0

0

0

1

1

0

0

0

0

1

0

0

0

1

0

0

0

0

0

1

0

0

0

0

1

0

1

0

0

1

0

0

0

0

0

1

1

0

0

1

0

0

0

0

0

0

1

1

1

1

0

0

0

0

0

0

0

 

▶ 4입력 멀티플렉서

① 멀티플렉서(MUX)는 디지털 회로에서 가장 많이 쓰이는 회로 중 하나이다.

② MUX는 n개의 입력 중 선택된 하나의 입력 값이 출력으로 전달되게 하여 주는 조합 회 로이다.

③ 어느 입력을 선택할지를 결정하여 주는 데이터 선택 신호가 반드시 필요하다.

④ 입력이 4개인 MUX를 4입력 MUX 또는 4x1 MUX라고 한다.

⑤ 진리표

데이터 선택 신호

출 력

s1

s0

out1

0

0

입력 a0

0

1

입력 a1

1

0

입력 a2

1

1

입력 a3

⑥ 선택 신호 s1, s0의 값이 각각 1, 0 이면 출력 out1의 값은 항상 입력 신호 a2와 같게 된다는 것이다.

 

◎ 실험 장비

▶ Xilinx ISE

▶ ModelSIM

▶ Rov-Lab 트레이닝 키트

 

◎ 실험 순서

▶ 3선/8선 디코더

① 3선/8선 디코더의 동작을 VHDL로 기술

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity dec3x8 is

              Port ( a : in std_logic_vector(2 downto 0);

                      d : out std_logic_vector(7 downto 0));

end dec3x8;

architecture Behavioral of dec3x8 is

begin

           process (a)

           begin

                      case a is

                                 when "000" => d <= "00000001";

                                 when "001" => d <= "00000010";

                                 when "010" => d <= "00000100";

                                 when "011" => d <= "00001000";

                                 when "100" => d <= "00010000";

                                 when "101" => d <= "00100000";

                                 when "110" => d <= "01000000";

                                 when "111" => d <= "10000000";

                                 when others => d <= "00000000";

                      end case;

           end process;

end Behavioral;

=> 이번에는 입력과 출력 신호를 정의하는데 std_logic_vector 라는 신호 data 형태를 사용 하였다. 이 형태는 버스(bus)처럼 여러 개의 신호가 뭉쳐져 있을 때 사용한다.

=> 구조(architecture)문에서는 process문을 사용하고, CASE-WHEN 명령어를 사용하였다. IF-ELSE문을 사용해도 되지만, 입출력 신호가 std_logic_vector로 선언되어 있기 때문에 CASE-WHEN 명령어가 더 쉬울 수 있기 때문이다.

 

*** Test Bench - User Defined Section ***

tb : PROCESS

BEGIN

           wait for 1000 ns; --will wait forever

END PROCESS;

PROCESS

BEGIN

           L1 : LOOP

                      a(2) <= '0';

                      wait for 200 ns;

                      a(2) <= '1';

                      wait for 200 ns;

           END LOOP L1;

END PROCESS;


PROCESS

BEGIN

           L2 : LOOP

                      a(1) <= '0';

                      wait for 100 ns;

                      a(1) <= '1';

                      wait for 100 ns;

           END LOOP L2;

END PROCESS;


PROCESS

BEGIN

           L3 : LOOP

                      a(0) <= '0';

                      wait for 50 ns;

                      a(0) <= '1';

                      wait for 50 ns;

           END LOOP L3;

END PROCESS;


*** End Test Bench - User Defined Section ***

< 3선/8선 디코더 Test Bench >

=> 여기서 보면 3개의 LOOP 명령어를 사용하여, 입력 신호 a(2), a(1), a(0)의 값을 변화 시키고 있음을 볼 수 있다.

② TestBenchWaveform으로 시뮬레이션

주어진 입력(a2, a1, a0)에 따라 출력(d7, d6, d5, d4, d3, d2, d1, d0)이 진리표대로 정확하게 출력되는지를 검증

③ 트레이닝 키트로 동작 검증

주어진 입력(a2, a1, a0)에 따라 출력(d7, d6, d5, d4, d3, d2, d1, d0)이 진리표대로 정확하게 출력되는지를 검증

 

▶ 4입력 멀티플렉서

① 4입력 멀티플렉서의 동작을 VHDL로 기술

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity mux4x1 is

           Port ( a : in std_logic_vector(3 downto 0);

                   s : in std_logic_vector(1 downto 0);

                   out1 : out std_logic);

end mux4x1;

architecture Behavioral of mux4x1 is

begin

           process ( a , s )

           begin

                      case s is

                              when "00" => out1 <= a(0);

                              when "01" => out1 <= a(1);

                              when "10" => out1 <= a(2);

                              when "11" => out1 <= a(3);

                              when others => out1 <= "0";

                      end case;

           end process;

end Behavioral;


=> 이번에도 입력과 출력 신호를 정의하는데 std_logic_vector 라는 신호 data 형태를 사용 하였다. 이 형태는 버스(bus)처럼 여러 개의 신호가 뭉쳐져 있을 때 사용하면 편하다.

=> 구조(architecture)문에서는 process문을 사용하고, CASE-WHEN 명령어를 사용하였다. 물론 IF-ELSE문을 사용해도 된다.

*** Test Bench - User Defined Section ***

tb : PROCESS

BEGIN

   wait for 4000 ns; --will wait forever

END PROCESS;

PROCESS

BEGIN

   L1 : LOOP

      a(0) <= '0';

      wait for 50 ns;

      a(0) <= '1';

      wait for 50 ns;

   END LOOP L1;

END PROCESS;

PROCESS

BEGIN

   L2 : LOOP

      a(1) <= '0';

      wait for 100 ns;

      a(1) <= '1';

      wait for 100 ns;

   END LOOP L2;

END PROCESS;

PROCESS

BEGIN

   L3 : LOOP

      a(2) <= '0';

      wait for 200 ns;

      a(2) <= '1';

      wait for 200 ns;

   END LOOP L3;

END PROCESS;

 




PROCESS

BEGIN

   L4 : LOOP

   a(3) <= '0';

   wait for 400 ns;

   a(3) <= '1';

   wait for 400 ns;

END LOOP L4;

END PROCESS;

PROCESS

BEGIN

   L5 : LOOP

      s(0) <= '0';

      wait for 1000 ns;

      s(0) <= '1';

      wait for 1000 ns;

   END LOOP L5;

END PROCESS;

PROCESS

BEGIN

   L6 : LOOP

      s(1) <= '0';

      wait for 2000 ns;

      s(1) <= '1';

      wait for 2000 ns;

   END LOOP L6;

END PROCESS;

*** End Test Bench - User Defined Section ***

 

   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 




















< 4입력 MUX Test Bench >


=> 여기서 모두 6개의 LOOP 명령어를 사용하고 있음을 볼 수 있다. 이는 동작 검증의 시각 효과를 높이기 위해 입력 4개의 신호를 서로 다른 주파수의 신호로 만들어 주고, 데이터 선택 신호 s(1), s(0)는 모두 4가지 경우의 값을 갖도록 변화시키기 위해서이다.

② TestBenchWaveform으로 시뮬레이션

주어진 데이터 선택 신호 (s1, s0)에 따라 출력 (out1)이 진리표대로 정확하게 출력되는지를 검증

③ 트레이닝 키트로 동작 검증

주어진 데이터 선택 신호 (s1, s0)에 따라 출력 (out1)이 진리표대로 정확하게 출력되는지를 검증

Comments