Loading [MathJax]/jax/output/HTML-CSS/config.js

#2. 8 to 1 Multiplexer

논리회로설계실험(VHDL) 2020. 12. 20. 05:14
반응형

모바일 버전으로 볼 경우, 텍스트가 깨질수 있습니다. 데스크탑 버전으로 보시는 것을 추천드립니다.

1. 배경이론



multiplexer는 입력값을 통해 출력값을 선택하는 기능을 하는 논리 회로입니다. 예를 들어 입력값을 000~111까지 지정할 수 있다면 총 8개의 출력값을 설정하여, 원하는 출력을 입력값에 따라 나타낼 수 있습니다. 아래 그림은 mux를 표현한 모식도입니다. 두가지 입력을 통해 출력을 결정하게 됩니다.

위 그림과 같이 input이 1비트면 0 과 1 두개의 출력이 가능케 됩니다. 따라서 2개의 출력을 선택할 수 있게 됩니다. 오늘은 이것을 VHDL코드로 구현해보겠습니다.

아래는 truth table과 식을 나타냈습니다.

 

2. Multiplexer 코드


이번 실습에서는 특별이 8-to-1의 mux를 구현하는 데 방법이 조금 다르게 구현합니다.
2-to-1 mux를 이용하여, component를 통해 불러온 뒤, 2-to-1 7개를 이용하여 8-to-1을 만드는 형식입니다.

 

위와 같이 4단, 2단, 1단으로 2-to-1 mux를 구현하여 총 8-to-1을 만들어줍니다.

 

2-1. 2-to-1 mux 코드


 

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity mux2 is
    Port ( mux2_i : in  STD_LOGIC_VECTOR (1 downto 0);  -- 포트구성 : 2-1 multiplexer의 입력값(2bit)
           mux2_s : in  STD_LOGIC ;                               -- 포트구성 : 2-1 multiplexer의 selection 값
           mux2_o : out  STD_LOGIC);                             -- 포트구성 : 2-1 multiplexer의 출력값
end mux2;

architecture Behavioral of mux2 is

begin

 mux2_o <= mux2_i(0) when mux2_s = '0' else mux2_i(1); -- mux2_s 의 값이 0일 땐, mux2_i(0) 값을 선택하고, 1일땐 mux2_i(1)의 값을 선택한다.

end Behavioral;

 

이렇게 만들어진 2-to-1 mux를 top module에서 불러와 줍니다.

 

2-2. 8-to-1 mux


앞서 만들어준 2-to-1을 component로 불러온 후, 포트 mapping을 해주는 과정입니다. 문법들은 구글에서 찾아보시는 것을 권합니다.

 

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;


entity mux8 is
    Port ( mux8_i : in  STD_LOGIC_VECTOR (7 downto 0);   --포트구성 : 8-1multiplexer의 입력값(8bit)
           mux8_s : in  STD_LOGIC_VECTOR (2 downto 0);   --포트구성 : 8-1multiplexer의 selection값(3bit)
           mux8_o : out  STD_LOGIC);                             -- 포트구성 : 8-1multiplexer의 출력값(1bit)
end mux8;

architecture Behavioral of mux8 is

 component mux2 port (mux2_i : in  STD_LOGIC_VECTOR (1 downto 0); mux2_s : in  STD_LOGIC ;mux2_o : out  STD_LOGIC); --component선언, mux2를 불러온다.
 end component;
 
 signal temp1 : STD_LOGIC_VECTOR(3 downto 0); --첫번째 단의 2-1multiplexer에서 나온 출력값들을 저장할 내부신호 선언(4bit)
 signal temp2 : STD_LOGIC_VECTOR(1 downto 0); --두번째 단의 2-1multiplexer에서 나온 출력값들을 저장할 내부신호 선언(2bit)

begin

 mux_1 : mux2 port map(mux8_i(1 downto 0), mux8_s(0), temp1(0)); --첫번째 단의 2-1multiplexer, mux8_s(0)에 의해 값이 선택되고, 그 값들이 temp1에 저장(4bit)
 mux_2 : mux2 port map(mux8_i(3 downto 2), mux8_s(0), temp1(1));
 mux_3 : mux2 port map(mux8_i(5 downto 4), mux8_s(0), temp1(2));
 mux_4 : mux2 port map(mux8_i(7 downto 6), mux8_s(0), temp1(3));
 
 mux_5 : mux2 port map(temp1(1 downto 0), mux8_s(1), temp2(0)); --두번째 단의 2-1multiplexer, temp1으로 부터 들어온 값들이 mux8_s(1)에 의해 값이 선택되고, 그 값들이 temp2에 저장(2bit)
 mux_6 : mux2 port map(temp1(3 downto 2), mux8_s(1), temp2(1));
 
 mux_7 : mux2 port map(temp2(1 downto 0), mux8_s(2), mux8_o);   --세번째 단의 2-1multiplexer, temp2로 부터 들어온 값들이 mux8_s(2)에 의해 값이 선택되고, mux8_o으로 출력
 
 

end Behavioral;

 

2-3. 8-to-1 mux Testbench


LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
 

 
ENTITY mux8_TB IS
END mux8_TB;
 
ARCHITECTURE behavior OF mux8_TB IS  --mux8을 기반으로 한 TestBench
 

 
    COMPONENT mux8
    PORT(
         mux8_i : IN  std_logic_vector(7 downto 0);   --mux8의 포트 구성
         mux8_s : IN  std_logic_vector(2 downto 0);
         mux8_o : OUT  std_logic
        );
    END COMPONENT;
   

   --Inputs
   signal mux8_i : std_logic_vector(7 downto 0) := (others => '0');  --mux8의 내부신호 선언
   signal mux8_s : std_logic_vector(2 downto 0) := (others => '0');

  --Outputs
   signal mux8_o : std_logic;

 
BEGIN
 
 -- Instantiate the Unit Under Test (UUT)
   uut: mux8 PORT MAP (
          mux8_i => mux8_i,
          mux8_s => mux8_s,
          mux8_o => mux8_o
        );

 

   -- Stimulus process
   stim_proc: process
 --여기서부터 실습에 주어진 입력값과 selection값이 대입됩니다. 
   begin  
 
  mux8_i<="00000001";
  mux8_s<="000";
  wait for 10ns;
  
  mux8_i<="00000010";
  mux8_s<="001";
  wait for 10ns;
  
  mux8_i<="00000100";
  mux8_s<="010";
  wait for 10ns;
  
  mux8_i<="00001000";
  mux8_s<="011";
  wait for 10ns;
  
  mux8_i<="00010000";
  mux8_s<="100";
  wait for 10ns;
  
  mux8_i<="00100000";
  mux8_s<="101";
  wait for 10ns;
  
  mux8_i<="01000000";
  mux8_s<="110";
  wait for 10ns;
  
  mux8_i<="10000000";
  mux8_s<="111";
  wait for 10ns;
  
  
    mux8_i<="00000000";
  mux8_s<="000";
  wait for 10ns;


      wait;
   end process;

END;

다음은 testbench를 돌렸을 때의 결과물입니다.

 

 위 내용들을 모두 포함한 보고서를 위 사이트에서 참조하실 수 있습니다.

 

 


반응형