VHDL 타입 변환 종합 가이드: Numeric_Std와 Std_Logic_Arith 패키지
Numeric_Std와 Std_Logic_Arith 패키지 파일 모두 활용
아래에서 가장 자주 쓰이는 VHDL 타입 변환을 확인할 수 있습니다. 기사는 두 섹션으로 나뉩니다: 첫 번째는 현대적인 numeric_std 패키지 기반 변환, 두 번째는 레거시 std_logic_arith 패키지 동등 변환. 많은 설계자가 여전히 std_logic_arith를 쓰지만, 업계 모범 사례는 명확성과 이식성 측면에서 numeric_std를 권장합니다.
많은 예제가 VHDL 속성 'length를 사용하는데, 이는 벡터 폭 변경 시 코드가 자동 적응하게 해 재사용 가능하고 유지보수하기 쉬운 설계를 위한 핵심 전략입니다.
Numeric_Std 사용 변환 예제
- Integer → Signed
- Integer → Std_Logic_Vector
- Integer → Unsigned
- Std_Logic_Vector → Integer
- Std_Logic_Vector → Signed
- Std_Logic_Vector → Unsigned
- Signed → Integer
- Signed → Std_Logic_Vector
- Signed → Unsigned
- Unsigned → Integer
- Unsigned → Signed
- Unsigned → Std_Logic_Vector
Std_Logic_Arith 사용 변환 예제
- Integer → Signed
- Integer → Std_Logic_Vector
- Integer → Unsigned
- Std_Logic_Vector → Integer
- Std_Logic_Vector → Signed
- Std_Logic_Vector → Unsigned
- Signed → Integer
- Signed → Std_Logic_Vector
- Signed → Unsigned
- Unsigned → Integer
- Unsigned → Signed
- Unsigned → Std_Logic_Vector
Numeric_Std로 Integer를 Signed로 변환
to_signed 함수는 변환할 정수와 원하는 벡터 폭 두 인수를 받습니다. 'length 속성 사용으로 코드 유연성 확보.
signal input_3 : integer; signal output_3 : signed(3 downto 0); output_3 <= to_signed(input_3, output_3'length);
Numeric_Std로 Integer를 Std_Logic_Vector로 변환
정수 범위가 부호 있는지 없는지 판단. 양수만 쓰는 경우 to_unsigned, 부호 있는 경우 to_signed 사용. 둘 다 값과 목표 폭을 인수로 받음.
signal input_1 : integer; signal output_1a : std_logic_vector(3 downto 0); signal output_1b : std_logic_vector(3 downto 0); -- 양수만 output_1a <= std_logic_vector(to_unsigned(input_1, output_1a'length)); -- 부호 있거나 없거나 output_1b <= std_logic_vector(to_signed(input_1, output_1b'length));
Numeric_Std로 Integer를 Unsigned로 변환
signal input_2 : integer; signal output_2 : unsigned(3 downto 0); output_2 <= to_unsigned(input_2, output_2'length);
Numeric_Std로 Std_Logic_Vector를 Integer로 변환
데이터 의미에 따라 벡터를 unsigned 또는 signed로 캐스팅 후 to_integer 적용.
signal input_4 : std_logic_vector(3 downto 0); signal output_4a : integer; signal output_4b : integer; -- Unsigned 경우 output_4a <= to_integer(unsigned(input_4)); -- Signed 경우 output_4b <= to_integer(signed(input_4));
Numeric_Std로 Std_Logic_Vector를 Signed로 변환
signal input_6 : std_logic_vector(3 downto 0); signal output_6 : signed(3 downto 0); output_6 <= signed(input_6);
Numeric_Std로 Std_Logic_Vector를 Unsigned로 변환
signal input_5 : std_logic_vector(3 downto 0); signal output_5 : unsigned(3 downto 0); output_5 <= unsigned(input_5);
Numeric_Std로 Signed를 Integer로 변환
signal input_10 : signed(3 downto 0); signal output_10 : integer; output_10 <= to_integer(input_10);
Numeric_Std로 Signed를 Std_Logic_Vector로 변환
signal input_11 : signed(3 downto 0); signal output_11 : std_logic_vector(3 downto 0); output_11 <= std_logic_vector(input_11);
Numeric_Std로 Signed를 Unsigned로 변환
signal input_12 : signed(3 downto 0); signal output_12 : unsigned(3 downto 0); output_12 <= unsigned(input_12);
Numeric_Std로 Unsigned를 Integer로 변환
signal input_7 : unsigned(3 downto 0); signal output_7 : integer; output_7 <= to_integer(input_7);
Numeric_Std로 Unsigned를 Signed로 변환
signal input_9 : unsigned(3 downto 0); signal output_9 : signed(3 downto 0); output_9 <= signed(input_9);
Numeric_Std로 Unsigned를 Std_Logic_Vector로 변환
signal input_8 : unsigned(3 downto 0); signal output_8 : std_logic_vector(3 downto 0); output_8 <= std_logic_vector(input_8);
Std_Logic_Arith로 Integer를 Signed로 변환
signal input_3 : integer; signal output_3 : signed(3 downto 0); output_3 <= conv_signed(input_3, output_3'length);
Std_Logic_Arith로 Integer를 Std_Logic_Vector로 변환
signal input_1 : integer; signal output_1 : std_logic_vector(3 downto 0); output_1 <= conv_std_logic_vector(input_1, output_1'length);
Std_Logic_Arith로 Integer를 Unsigned로 변환
signal input_2 : integer; signal output_2 : unsigned(3 downto 0); output_2 <= conv_unsigned(input_2, output_2'length);
Std_Logic_Arith로 Std_Logic_Vector를 Integer로 변환
signal input_4 : std_logic_vector(3 downto 0); signal output_4a : integer; signal output_4b : integer; -- Unsigned 경우 output_4a <= conv_integer(unsigned(input_4)); -- Signed 경우 output_4b <= conv_integer(signed(input_4));
Std_Logic_Arith로 Std_Logic_Vector를 Signed로 변환
signal input_6 : std_logic_vector(3 downto 0); signal output_6 : signed(3 downto 0); output_6 <= signed(input_6);
Std_Logic_Arith로 Std_Logic_Vector를 Unsigned로 변환
signal input_5 : std_logic_vector(3 downto 0); signal output_5 : unsigned(3 downto 0); output_5 <= unsigned(input_5);
Std_Logic_Arith로 Signed를 Integer로 변환
signal input_10 : signed(3 downto 0); signal output_10 : integer; output_10 <= conv_integer(input_10);
Std_Logic_Arith로 Signed를 Std_Logic_Vector로 변환
signal input_11 : signed(3 downto 0); signal output_11 : std_logic_vector(3 downto 0); output_11 <= std_logic_vector(input_11);
Std_Logic_Arith로 Signed를 Unsigned로 변환
signal input_12 : signed(3 downto 0); signal output_12 : unsigned(3 downto 0); output_12 <= unsigned(input_12);
Std_Logic_Arith로 Unsigned를 Integer로 변환
signal input_7 : unsigned(3 downto 0); signal output_7 : integer; output_7 <= conv_integer(input_7);
Std_Logic_Arith로 Unsigned를 Signed로 변환
signal input_9 : unsigned(3 downto 0); signal output_9 : signed(3 downto 0); output_9 <= signed(input_9);
Std_Logic_Arith로 Unsigned를 Std_Logic_Vector로 변환
signal input_8 : unsigned(3 downto 0); signal output_8 : std_logic_vector(3 downto 0); output_8 <= std_logic_vector(input_8);