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

VHDL에서 상수 및 일반 맵을 사용하는 방법

모듈을 만드는 것은 코드를 재사용하는 좋은 방법이지만 디자인 전체에 걸쳐 더 작은 변형을 가진 동일한 모듈이 필요한 경우가 많습니다. 이것이 제네릭과 제네릭 맵의 용도입니다. 이를 통해 모듈의 특정 부분을 컴파일 타임에 구성할 수 있습니다.

상수는 같은 값을 반복해서 입력하지 않으려는 경우에 사용됩니다. 컴파일 타임에 신호 벡터의 비트 너비를 정의하는 데 사용할 수 있으며 일반 상수에도 매핑할 수 있습니다. 상수는 코드의 어느 곳에서나 신호 및 변수 대신 사용할 수 있지만 컴파일 시간 이후에는 값을 변경할 수 없습니다.

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

이전 자습서에서는 버스 너비가 8비트인 4입력 멀티플렉서 모듈을 만들었습니다. 그러나 다른 버스 너비를 가진 유사한 MUX도 필요하다면 어떻게 될까요? 코드를 복사하여 새 모듈에 붙여넣고 숫자를 변경하는 유일한 솔루션입니까?

다행히 없습니다.

다음 구문을 사용하여 VHDL에서 상수를 생성할 수 있습니다.
constant <constant_name> : <type> := <value>;

상수는 VHDL 파일의 선언 부분에서 신호와 함께 선언하거나 프로세스에서 변수와 함께 선언할 수 있습니다.

generic를 사용하여 엔티티를 통해 모듈에 상수를 전달할 수 있습니다. 예어. 일반 상수를 허용하는 모듈의 엔터티를 만드는 구문은 다음과 같습니다.
entity <entity_name> is
generic(
    <entity_constant_name> : <type> [:= default_value];
    ...
);
port(
    <entity_signal_name> : in|out|inout <type>;
    ...
);
end entity;

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

운동

이 비디오 자습서에서는 VHDL에서 일반 상수를 사용하여 모듈을 만들고 인스턴스화하는 방법을 배웁니다.

일반 MUX testbench의 최종 코드 :

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

entity T16_GenericMapTb is
end entity;

architecture sim of T16_GenericMapTb is

    constant DataWidth : integer := 8;

    signal Sig1 : signed(DataWidth-1 downto 0) := x"AA";
    signal Sig2 : signed(DataWidth-1 downto 0) := x"BB";
    signal Sig3 : signed(DataWidth-1 downto 0) := x"CC";
    signal Sig4 : signed(DataWidth-1 downto 0) := x"DD";

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

    signal Output : signed(DataWidth-1 downto 0);

begin

    -- An Instance of T16_GenericMux with architecture rtl
    i_Mux1 : entity work.T16_GenericMux(rtl)
    generic map(DataWidth => DataWidth)
    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 T16_GenericMux is
generic(DataWidth : integer);
port(
    -- Inputs
    Sig1 : in signed(DataWidth-1 downto 0);
    Sig2 : in signed(DataWidth-1 downto 0);
    Sig3 : in signed(DataWidth-1 downto 0);
    Sig4 : in signed(DataWidth-1 downto 0);

    Sel  : in signed(1 downto 0);

    -- Outputs
    Output : out signed(DataWidth-1 downto 0));
end entity;

architecture rtl of T16_GenericMux 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 모듈을 만들었습니다. 이제 버스 너비는 testbench 파일의 한 곳에서만 지정됩니다. 버스 폭이 다른 MUX를 생성하도록 쉽게 변경할 수 있습니다.

파형을 이전 자습서의 파형과 비교하면 동작이 동일함을 알 수 있습니다. 이는 코드 동작을 전혀 변경하지 않았기 때문입니다.

테이크아웃

다음 튜토리얼로 이동 »


VHDL

  1. VHDL의 프로세스에서 프로시저를 사용하는 방법
  2. VHDL에서 불순 함수를 사용하는 방법
  3. VHDL에서 함수를 사용하는 방법
  4. VHDL에서 프로시저를 사용하는 방법
  5. VHDL에서 상수 및 일반 맵을 사용하는 방법
  6. VHDL에서 포트 맵 인스턴스화를 사용하는 방법
  7. VHDL에서 Case-When 문을 사용하는 방법
  8. VHDL에서 서명된 것과 서명되지 않은 것을 사용하는 방법
  9. VHDL 시뮬레이터 및 편집기를 무료로 설치하는 방법
  10. PIC18 마이크로컨트롤러:정의 및 사용 방법