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

VHDL 상수와 제네릭 맵으로 유연한 모듈 설계하기

재사용 가능한 모듈 만들기는 효율적 VHDL 설계의 초석이지만, 사소한 변형 때문에 코드 중복이 생기곤 합니다. 제네릭과 제네릭 맵은 모듈 파라미터를 컴파일 타임에 구성하게 해 코드를 DRY(Don't Repeat Yourself)하고 유지보수하기 쉽게 만듭니다.

상수는 같은 값을 반복 하드코딩하는 걸 방지합니다. 시그널 벡터 폭이나 다른 컴파일 타임 파라미터 정의에 이상적이며, 제네릭 상수에 매핑할 수도 있습니다. 시그널이나 변수와 달리 상수 값은 엘라보레이션 후 불변이라 설계 전반에 일관성을 보장합니다.

이 글은 Basic VHDL Tutorials 시리즈의 일부입니다.

이전 튜토리얼에서 4입력 멀티플렉서를 8비트 버스 폭으로 만들었습니다. 이제 다른 폭의 비슷한 MUX가 필요하다면 전체 모듈을 복사-붙여넣기하는 게 유일한 선택은 아닙니다.

대신 원하는 버스 폭을 담는 상수를 선언하고, 그 상수를 모듈에 제네릭으로 전달하세요. 폭을 바꿀 곳은 테스트벤치의 상수 선언 한 곳뿐입니다.

VHDL에서 상수 선언 문법:

constant <constant_name> : <type> := <value>;

상수는 파일의 선언부에 시그널과 함께, 또는 프로세스 내부에서 변수와 함께 나타날 수 있습니다.

모듈에 상수를 노출하려면 엔티티 선언에 generic 키워드를 사용합니다:

entity <entity_name> is generic( <entity_constant_name> : <type> [:= default_value]; ... ); port( <entity_signal_name> : in|out|inout <type>; ... ); end entity;

다른 곳에서 제네릭 모듈을 인스턴스화할 때 제네릭 맵과 포트 맵을 씁니다:

<label> : entity <library_name>.<entity_name>(<architecture_name>) generic map( <entity_constant_name> => <value_or_constant>, ... ) port map( <entity_signal_name> => <local_signal_name>, ... );

실습

이 비디오 튜토리얼에서는 제네릭 4입력 MUX 모듈을 VHDL로 만들고 인스턴스화하는 과정을 안내합니다.

테스트벤치 – 제네릭 MUX

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 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 ); 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); -- Output 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 => Output <= (others => 'X'); end case; end process; end architecture;

시뮬레이션 실행 후 ModelSim 파형 (타임라인 확대):

VHDL 상수와 제네릭 맵으로 유연한 모듈 설계하기

분석

테스트벤치에서 DataWidth를 한 번 정의함으로써 모듈 코드 수정 없이 같은 MUX를 모든 버스 폭에 적용할 수 있습니다. 파형은 하드코딩 버전과 동일한 기능을 확인시켜 줍니다.

VHDL 상수와 제네릭 맵으로 유연한 모듈 설계하기

핵심 정리

다음 튜토리얼로 이동 »

VHDL

  1. 프로세스 내 프로시저로 VHDL FSM 설계 깔끔하게 만들기
  2. VHDL 비순수 함수 활용: FSM 가독성과 유지보수성 높이기
  3. VHDL 함수 마스터하기: 효율적 설계를 위한 실전 가이드
  4. VHDL 프로시저 활용: 재사용 코드로 설계 단순화하기
  5. VHDL 상수와 제네릭 맵으로 유연한 모듈 설계하기
  6. VHDL 포트 맵 인스턴스화 마스터하기: 실전 가이드
  7. VHDL Case-When 문 마스터하기: 효율적 멀티플렉서 설계
  8. VHDL Signed/Unsigned 타입 마스터하기: 실전 가이드
  9. 무료 VHDL 시뮬레이터 & 에디터 설정: 학생 가이드
  10. PIC18F452 마이크로컨트롤러 완벽 가이드: 특징, 핀아웃, 프로그래밍, 응용