VHDL : INTEGER 유형에서 STD_LOGIC_VECTOR로 변환


28

나는 mod-16 카운터를 만들고 출력 결과는 INTEGER입니다 (내가 본 모든 예제는 INTEGER를 사용했습니다).

16 대 7 세그먼트 디스플레이 디코더를 만들었고 입력은 STD_LOGIC_VECTOR입니다 (진실 테이블을 쉽게 매핑 할 수 있기 때문에 그렇게 작성했습니다).

카운터의 출력을 디코더의 입력에 연결하고 싶지만 QuartusII에서 컴파일하려고 할 때 '유형 불일치'오류가 발생합니다.

VHDL 목록에서 INTEGER 유형을 STD_LOGIC_VECTOR 유형으로 변환하는 방법이 있습니까?

답변:


20

다른 사람들이 말했듯이, ieee.numeric_stdnever을 사용하십시오 ieee.std_logic_unsigned. 실제로는 IEEE 패키지가 아닙니다.

그러나 VHDL 2008 지원 도구를 사용 ieee.numeric_std_unsigned하는 경우 기본적으로 std_logic_vector서명되지 않은 것처럼 작동 하는 새 패키지를 사용할 수 있습니다 .

또한 명시 적으로 언급되지 않았으므로 다음은 부호없는 정수에서 다음으로 변환하는 실제 코드 예제입니다 std_logic_vector.

use ieee.numeric_std.all;
...
my_slv <= std_logic_vector(to_unsigned(my_int, my_slv'length));

16

LoneTech는 use ieee.numeric_std친구입니다. a std_logic_vector를 로 변환 할 수 integer있지만 컴파일러가 의미하는 바를 모르기 때문에 signed또는 로 캐스팅해야합니다 unsigned. VHDL은 강력한 형식의 언어입니다. 나는 한 개 작성 이 주제에 내 블로그에

근본적으로, 나는 7seg 변환기를 integer(또는 실제로 natural양의 숫자 만 처리한다는 점 을 고려하여) 받아들이도록 변경합니다 . 변환은 간단한 배열 조회입니다. 변환이 포함 된 상수 배열을 설정하고 엔터티에서 사용하는 정수를 입력으로 사용하여 색인을 생성하십시오.


고마워 당신의 의견을 대단히 감사합니다. 저는 TA 개념에있었습니다. VHDL을 배우면서 프로페셔널이 프로그래밍 개념에 약간 동요하는 것을 시작하도록 도와주었습니다. 우리가 사용한 교과서는 VHDL '도덕성'질문에 대해서는 다루지 않았습니다.
J. Polfer

1
일관성을 보장하는 것보다 '도덕성'문제가 아닙니다. numeric_std lib는 IEEE가 제정 한 실제 표준이며 std_logic_unsigned 라이브러리는 공급 업체가 구성했으며 실제 공식적인 정의없이 업계에서 채택되었습니다. 비표준 라이브러리와의 공급 업체 간 호환성은 보장되지 않지만 일반적으로 제대로 작동합니다. 그래도 표준으로 넘어가는 것이 좋은 형식입니다.
MattG

1

4 비트 카운터에 INTEGER 출력 SOME_INTEGER가 있고이를 4 비트 STD_LOGIC_VECTOR로 변환하려고한다고 가정합니다.

SOME_VECTOR <= conv_std_logic_vector(SOME_INTEGER, 4);

이것을 사용하여 의미있는 숫자로 벡터를 초기화 할 수 있습니다

SOME_VECTOR <= conv_std_logic_vector(9, 4); -- instead of "1001"

"use IEEE.STD_LOGIC_ARITH.ALL;"을 추가해야 할 수도 있습니다. 및 / 또는 STD_LOGIC_UNSIGNED.

상보 연산은 conv_integer (vector)입니다. 비교할 때 이것을 사용하고 싶습니다. 그래서 선언 할 수 있습니다

constant SOME_CONSTANT : integer := 999;

그런 다음 나중에 if 문에서 이것을 사용할 수 있습니다.

if (conv_integer(SOME_VECTOR)=SOME_CONSTANT)
  then OTHER_VECTOR <= (others => '0');
end if;

편집 : 변수를 정수로 선언 할 필요가 없습니다. 대신 선언을 std_logic_vector로 변경하십시오. + 및-연산자는 std_logic_vectors에서 작동합니다.


3
이러지 마십시오! numeric_std 사용 (론 테크와 나의 답변 참조)
Martin Thompson

더 좋은 방법이 있다면 괜찮습니다.하지만 제 제안은 효과가 있으므로 귀하의 다운 투표는 불필요하다고 생각합니다. 나는 std_logic_arith를 몇 년 동안 사용해 왔으며 아무런 문제가 없었습니다. 벤더의 구현 변경에 대한 두려움은 근거가 없다고 생각합니다. 고객의 디자인을 깨뜨릴 위험이있는 벤더는 무엇입니까?
ajs410

1
IEEE 네임 스페이스에 벤더 고유의 내용을 고의적으로 제공하는 벤더에 대한 답변이 이미 있습니다. 특히 부호있는 값 부호없는 값을 처리 할 때 원유로 남아 있습니다.
Yann Vernier

"+ 및-연산자는 std_logic_vectors에서 작동합니다." AFAIK, 나는 당신의 의미를 오해하지 않으면 작동하지 않습니다. 일반적으로 서명 된 / 서명되지 않은 데이터를 먼저 보유한 유형으로 캐스트해야합니다.
stanri

1

당신은 유형을 사용하여에 관심이있을 수 unsignedsigned에서 ieee.numeric_std. 와 호환 std_logic_vector되지만 숫자 해석 (2 진 또는 2 보수)이 있습니다. 이러한 해석을 할 수있는 옵션도 std_logic_vector있지만 권장되지않습니다 .


0

주요 답변에서 알 수 있듯이 권장되는 방법은 다음과 같습니다.

use ieee.numeric_std.all;
...
my_slv <= std_logic_vector(to_unsigned(my_int, my_slv'length));

그러나 이것이 권장되는 이유와 VHDL이 정수를 std_logic_vectors로 변환하는 방식이 복잡한 이유에 대해 자세히 설명하고 싶습니다.

도구에서 이러한 유형을 보는 방식이 결정됩니다.

standard_logic_vector는 말 그대로 1 또는 0입니다. 10001이 있습니다.이 숫자는 무엇입니까? 글쎄요. 서명 또는 서명이 없습니까? 이 SLV는 모르거나 신경 쓰지 않습니다. 몇 비트입니까? SLV는 얼마나 걸립니까?

정수는 부호가 있으며 일반적으로 32 비트입니다 (정확하게 기억한다면).

1 단계 : 정수를 더 짧고 부호없는 것으로 만드십시오. 이것이이 부분입니다 :

to_unsigned(my_int, my_slv'length));

"이 정수를 가지고 있고, 부호가 없어지기를 원하며, SLV의 길이에 맞도록하고 싶습니다."

2 단계 : 그런 다음 해당 비트를 사용하여 my_slv를 구동하십시오.

my_slv <= std_logic_vector(...)

"이 비트를 가져 와서 내 slv를 운전하는 데 사용하십시오"

( A <= BVHDL의 용어에 대한 참고 사항 은 "A가 B에 의해 구동 됨"으로 크게 읽 힙니다 . )

결합하면 다음이 가능합니다.

my_slv <= std_logic_vector(to_unsigned(my_int, my_slv'length));

전통적인 프로그래밍 배경에서 나올 때 프로그래밍 방식으로 생각하기가 매우 쉽습니다. 그러나 VHDL에서 작성하는 코드는 하드웨어에 물리적 영향을 미칩니다. 이 방법이 효과가 있고 권장되는 이유를 아는 것은 하드웨어 용어로 작성하는 내용에 대해 한 걸음 더 가까이 있습니다.

보너스 팁 : 접두사가 to_ 인 함수는 피연산자를 줄이거 나 바꾸는 함수입니다. 그들은 부호가 없거나 특정 길이 또는 둘 다를 만듭니다. 이것이 to_unsigned가 길이를 지정해야하는 이유입니다. to_가없는 함수 (이 예에서는 스트레이트 std_logic_vector (...))는 형식이 이미 직접 호환되는 경우에 사용됩니다. "이 비트를 가져 와서이 유형으로 채우십시오. 수정하지 않아도됩니다." 양쪽이 이미 동일하기 때문에 길이 인수가 없습니다. 따라서 이와 같은 것을 구성 할 때 데이터를 찾을 필요가 없으며 데이터를 어떻게 변경하는지 생각합니다.


0

정수를 std_logic_vector로 변환하려면 몇 가지 옵션이 있습니다. numeric_std 사용 :

vect <= std_logic_vector( to_unsigned( your_int, vect'length));

또는

vect <= std_logic_vector( to_signed( your_int, vect'length));

std_logic_arith 사용 :

vect <= conv_std_logic_vector( your_int, vect'length);

std_logic_arith는 ieee 표준은 아니지만 대부분의 도구가이를 IEEE 라이브러리로 컴파일하여 널리 사용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.