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
수많은 Arduino 프로젝트를 실행합니까? 그리고 엄청난 양의 중요한 정보와 로그 데이터를 저장해야 합니까? 해결책은 Arduino SD 카드를 사용하는 것입니다. 어떻게 작동합니까? 이 문서에서는 기기가 무엇인지, 연결하는 방법, 사용하는 방법 등 기기에 대해 알아야 할 모든 정보를 제공합니다. 계속 읽어서 알아야 할 모든 정보를 찾아보세요. Arduino에서 SD란 무엇입니까? 아두이노 SD 카드 이미지 출처:Pixlr SD 카드 또는 마이크로 SD 카드는 두 가지 주요 구성 요소가 있는 장치입니다. 그리고 이러한
전통적인 제조 기술은 균일한 단면의 기본 모양을 효과적으로 생성할 수 있지만 속이 빈 내부 또는 복잡한 형상으로 부품을 생성하는 것은 고유한 과제를 안고 있습니다. 그러나 희생적인 도구를 사용하면 설계자와 엔지니어가 모양이나 재료 무결성을 타협할 필요가 없습니다. 희생 툴링은 용해성 재료에 구조를 인쇄한 다음 복잡한 구조를 만드는 데 사용됩니다. 이 기술을 통해 설계자와 엔지니어는 다양한 재료로 부드러운 내부를 사용하여 모든 종류의 언더컷이 있는 복잡하거나 속이 빈 구조를 쉽게 만들 수 있습니다. 희생 툴링은 일반적으로 높은 정확