답변:
다른 사람들이 말했듯이, ieee.numeric_std
never을 사용하십시오 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));
LoneTech는 use ieee.numeric_std
친구입니다. a std_logic_vector
를 로 변환 할 수 integer
있지만 컴파일러가 의미하는 바를 모르기 때문에 signed
또는 로 캐스팅해야합니다 unsigned
. VHDL은 강력한 형식의 언어입니다. 나는 한 개 작성 이 주제에 내 블로그에
근본적으로, 나는 7seg 변환기를 integer
(또는 실제로 natural
양의 숫자 만 처리한다는 점 을 고려하여) 받아들이도록 변경합니다 . 변환은 간단한 배열 조회입니다. 변환이 포함 된 상수 배열을 설정하고 엔터티에서 사용하는 정수를 입력으로 사용하여 색인을 생성하십시오.
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에서 작동합니다.
주요 답변에서 알 수 있듯이 권장되는 방법은 다음과 같습니다.
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 <= B
VHDL의 용어에 대한 참고 사항 은 "A가 B에 의해 구동 됨"으로 크게 읽 힙니다 . )
결합하면 다음이 가능합니다.
my_slv <= std_logic_vector(to_unsigned(my_int, my_slv'length));
전통적인 프로그래밍 배경에서 나올 때 프로그래밍 방식으로 생각하기가 매우 쉽습니다. 그러나 VHDL에서 작성하는 코드는 하드웨어에 물리적 영향을 미칩니다. 이 방법이 효과가 있고 권장되는 이유를 아는 것은 하드웨어 용어로 작성하는 내용에 대해 한 걸음 더 가까이 있습니다.
보너스 팁 : 접두사가 to_ 인 함수는 피연산자를 줄이거 나 바꾸는 함수입니다. 그들은 부호가 없거나 특정 길이 또는 둘 다를 만듭니다. 이것이 to_unsigned가 길이를 지정해야하는 이유입니다. to_가없는 함수 (이 예에서는 스트레이트 std_logic_vector (...))는 형식이 이미 직접 호환되는 경우에 사용됩니다. "이 비트를 가져 와서이 유형으로 채우십시오. 수정하지 않아도됩니다." 양쪽이 이미 동일하기 때문에 길이 인수가 없습니다. 따라서 이와 같은 것을 구성 할 때 데이터를 찾을 필요가 없으며 데이터를 어떻게 변경하는지 생각합니다.
정수를 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 라이브러리로 컴파일하여 널리 사용합니다.