산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> VHDL

VHDL에서 포트 맵 인스턴스화를 사용하는 방법

모듈은 VHDL 코드의 독립된 단위입니다. 모듈은 엔티티를 통해 외부 세계와 통신합니다. . 항구 지도 모듈의 입력과 출력이 연결될 로컬 신호를 선언하는 모듈 인스턴스화의 일부입니다.

이 시리즈의 이전 자습서에서는 기본 VHDL 파일에 모든 코드를 작성했지만 일반적으로 그렇게 하지 않습니다. 시뮬레이터가 아닌 FPGA 또는 ASIC 설계에 사용할 목적으로 로직을 생성합니다.

시뮬레이터에서 실행하기 위해 생성된 VHDL 모듈에는 일반적으로 입력 또는 출력 신호가 없습니다. 완전히 독립적입니다. 그래서 우리 디자인의 엔터티가 비어 있습니다. entity 사이에 아무 것도 없었습니다. 태그 및 end entity; 태그.

이 블로그 게시물은 기본 VHDL 자습서 시리즈의 일부입니다.

입력 또는 출력 신호가 없는 모듈은 실제 설계에 사용할 수 없습니다. 유일한 목적은 시뮬레이터에서 VHDL 코드를 실행할 수 있도록 하는 것입니다. 따라서 이를 테스트벤치라고 합니다. . 입력 및 출력 신호가 있는 모듈을 시뮬레이션하려면 인스턴스화해야 합니다. 테스트벤치에 있습니다.

모듈과 테스트벤치는 종종 쌍으로 제공되며 서로 다른 파일에 저장됩니다. 일반적인 이름 지정 체계는 테스트벤치에 "Tb"가 추가된 모듈 이름을 호출하고 아키텍처 이름을 "sim"으로 지정하는 것입니다. 모듈이 "MyModule"이라고 하면 테스트벤치는 "MyModuleTb"라고 합니다. 결과적으로 파일 이름은 "MyModuleTb.vhd" 및 "MyModule.vhd"가 됩니다.

테스트벤치 코드의 도움으로 모듈이 시뮬레이션 환경에서 올바르게 작동하는지 확인할 수 있습니다. 테스트 중인 모듈은 일반적으로 테스트 중인 기기라고 합니다. (DUT).

모듈은 다른 모듈 내에서 인스턴스화될 수도 있습니다. 코드를 모듈로 분할하면 여러 번 인스턴스화할 수 있습니다. 동일한 디자인 내에서 모듈의 여러 인스턴스를 생성할 수 있으며 여러 디자인에서 재사용할 수 있습니다.

VHDL에 포트가 있는 엔터티의 구문은 다음과 같습니다.
entity <entity_name> is
port(
    <entity_signal_name> : in|out|inout <signal_type>;
    ...
);
end entity;

다른 VHDL 파일에서 이러한 모듈을 인스턴스화하는 구문은 다음과 같습니다.
<label> : entity <library_name>.<entity_name>(<architecture_name>) port map(
    <entity_signal_name> => <local_signal_name>,
    ...
);

<label> 임의의 이름이 될 수 있으며 ModelSim의 계층 창에 표시됩니다. <library_name> 모듈은 VHDL 코드가 아니라 시뮬레이터에서 설정됩니다. 기본적으로 모든 모듈은 work로 컴파일됩니다. 도서관. <entity_name><architecture_name> 인스턴스를 생성하는 모듈과 일치해야 합니다. 마지막으로 각 엔티티 신호는 로컬 신호 이름에 매핑되어야 합니다.

VHDL에서 모듈을 인스턴스화하는 다른 방법이 있지만 이것이 명시적 인스턴스화의 기본 구문입니다.

운동

이 비디오 자습서에서는 VHDL에서 모듈을 만들고 인스턴스화하는 방법을 배웁니다.

MUX testbench의 최종 코드 :

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity T15_PortMapTb is
end entity;

architecture sim of T15_PortMapTb is

    signal Sig1 : unsigned(7 downto 0) := x"AA";
    signal Sig2 : unsigned(7 downto 0) := x"BB";
    signal Sig3 : unsigned(7 downto 0) := x"CC";
    signal Sig4 : unsigned(7 downto 0) := x"DD";

    signal Sel : unsigned(1 downto 0) := (others => '0');

    signal Output : unsigned(7 downto 0);

begin

    -- An instance of T15_Mux with architecture rtl
    i_Mux1 : entity work.T15_Mux(rtl) port map(
        Sel    => Sel,
        Sig1   => Sig1,
        Sig2   => Sig2,
        Sig3   => Sig3,
        Sig4   => Sig4,
        Output => Output);

    -- Testbench process
    process is
    begin
        wait for 10 ns;
        Sel <= Sel + 1;
        wait for 10 ns;
        Sel <= Sel + 1;
        wait for 10 ns;
        Sel <= Sel + 1;
        wait for 10 ns;
        Sel <= Sel + 1;
        wait for 10 ns;
        Sel <= "UU";
        wait;
    end process;

end architecture;

MUX 모듈의 최종 코드 :

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity T15_Mux is
port(
    -- Inputs
    Sig1 : in unsigned(7 downto 0);
    Sig2 : in unsigned(7 downto 0);
    Sig3 : in unsigned(7 downto 0);
    Sig4 : in unsigned(7 downto 0);

    Sel  : in unsigned(1 downto 0);

    -- Outputs
    Output : out unsigned(7 downto 0));
end entity;

architecture rtl of T15_Mux is
begin

    process(Sel, Sig1, Sig2, Sig3, Sig4) is
    begin

        case Sel is
            when "00" =>
                Output <= Sig1;
            when "01" =>
                Output <= Sig2;
            when "10" =>
                Output <= Sig3;
            when "11" =>
                Output <= Sig4;
            when others => -- 'U', 'X', '-', etc.
                Output <= (others => 'X');
        end case;

    end process;

end architecture;

실행을 누르고 타임라인을 확대한 후 ModelSim의 파형 창:

분석

파형에서 볼 수 있듯이 멀티플렉서(MUX) 모듈은 예상대로 작동합니다. 파형은 모듈을 사용하지 않고 생성한 이전 자습서의 파형과 동일합니다.

이제 디자인 모듈과 테스트벤치 사이에 명확한 구분이 있습니다. MUX를 포함하는 모듈은 우리가 설계에 사용하려는 것이며 테스트벤치의 유일한 목적은 시뮬레이터에서 실행할 수 있도록 하는 것입니다. 테스트벤치에 wait을 사용하는 프로세스가 있습니다. 시뮬레이션에서 인위적인 시간 지연을 생성하기 위한 명령문. 디자인 모듈은 시간 개념이 없으며 외부 자극에만 반응합니다.

테스트벤치의 아키텍처 이름을 sim로 지정했습니다. , 시뮬레이션용. 디자인 모듈의 아키텍처는 rtl로 명명되었습니다. , 레지스터 전송 수준을 나타냅니다. 이들은 단지 명명 규칙입니다. 이러한 이름의 파일을 보면 테스트벤치인지 디자인 모듈인지 즉시 알 수 있습니다. 회사마다 명명 규칙이 다를 수 있습니다.

테이크아웃

다음 튜토리얼로 이동 »


VHDL

  1. 몰리브덴은 어떻게 사용합니까?
  2. VHDL에서 문자열 목록을 만드는 방법
  3. VHDL 코드 잠금 모듈을 위한 Tcl 기반 테스트벤치를 만드는 방법
  4. VHDL 테스트벤치에서 시뮬레이션을 중지하는 방법
  5. VHDL에서 PWM 컨트롤러를 만드는 방법
  6. VHDL에서 난수를 생성하는 방법
  7. VHDL의 프로세스에서 프로시저를 사용하는 방법
  8. VHDL에서 불순 함수를 사용하는 방법
  9. VHDL에서 함수를 사용하는 방법
  10. 커터 그라인더 사용 방법