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

VHDL에서 서명된 것과 서명되지 않은 것을 사용하는 방법

VHDL의 부호 있는 유형과 부호 없는 유형은 std_logic_vector 유형과 마찬가지로 비트 벡터입니다. 차이점은 std_logic_vector가 데이터 버스를 구현하는 데는 훌륭하지만 산술 연산을 수행하는 데는 쓸모가 없다는 것입니다.

std_logic_vector 유형에 숫자를 추가하려고 하면 ModelSim에서 컴파일 오류가 발생합니다. 중위 연산자 "+"에 대해 가능한 항목이 없습니다. 이는 컴파일러가 이 비트 모음을 벡터로 해석하는 방법을 모르기 때문입니다.

이 블로그 게시물은 기본 VHDL 자습서 시리즈의 일부입니다.

컴파일러가 벡터를 숫자로 처리할 수 있도록 벡터를 부호 있는 또는 부호 없는 것으로 선언해야 합니다.

부호 있는 신호와 부호 없는 신호를 선언하는 구문은 다음과 같습니다.
signal <name> : signed(<N-bits> downto 0) := <initial_value>;
signal <name> : unsigned(<N-bits> downto 0) := <initial_value>;

std_logic_vector와 마찬가지로 범위는 to일 수 있습니다. 또는 downto 모든 범위. 그러나 downto 0 이외의 다른 범위로 신호를 선언하는 경우 너무 드물기 때문에 그 주제에 대해 더 이상 시간을 할애하는 것은 우리를 혼란스럽게 할 뿐입니다. 초기 값은 선택 사항이며 기본적으로 'U'입니다. 모든 비트에 대해.

우리는 이미 integer을 사용하고 있습니다. 이전 자습서의 산술 연산에 대한 유형입니다. 그렇다면 서명된 유형과 서명되지 않은 유형이 필요한 이유는 무엇입니까? 대부분의 경우 디지털 설계자는 신호가 실제로 사용하는 비트 수를 더 잘 제어하기를 원합니다.

또한 integer 범위를 넘어 증가합니다. 마지막으로, 서명된 것과 서명되지 않은 것은 'U'과 같은 다른 값을 가질 수 있습니다. 및 'X' , 정수는 숫자 값만 가질 수 있습니다. 이러한 메타 값은 설계에서 오류를 발견하는 데 도움이 될 수 있습니다.

운동

이 비디오에서는 부호 있는 신호와 부호 없는 신호가 어떻게 비슷하게 작동하고 어떻게 다르게 작동하는지 배웁니다.

이 튜토리얼에서 만든 최종 코드:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity T12_SignedUnsignedTb is
end entity;

architecture sim of T12_SignedUnsignedTb is

    signal UnsCnt : unsigned(7 downto 0) := (others => '0');
    signal SigCnt : signed(7 downto 0)   := (others => '0');
    
    signal Uns4   : unsigned(3 downto 0) := "1000";
    signal Sig4   : signed(3 downto 0)   := "1000";
    
    signal Uns8   : unsigned(7 downto 0) := (others => '0');
    signal Sig8   : signed(7 downto 0)   := (others => '0');

begin

    process is
    begin

        wait for 10 ns;
        
        -- Wrapping counter
        UnsCnt <= UnsCnt + 1;
        SigCnt <= SigCnt + 1;
        
        -- Adding signals
        Uns8 <= Uns8 + Uns4;
        Sig8 <= Sig8 + Sig4;

    end process;
end architecture;

흥미로운 부분을 확대한 ModelSim의 파형 창:

분석

파형에 있는 모든 신호의 기수는 동일하게 비교할 수 있도록 16진수로 설정됩니다.

래핑 카운터 예제에서 부호 있는 신호와 부호 없는 신호가 정확히 같은 방식으로 동작하는 것을 볼 수 있습니다. 둘 다 UnsCntSigCnt 0에서 시작하여 FF까지 하나씩 증가합니다. 16진수 FF(십진수 255)는 8비트 신호가 보유할 수 있는 가장 큰 값입니다. 따라서 다음 증분은 둘 모두를 다시 0으로 감쌉니다.

두 개의 4비트 신호 Uns4를 만들었습니다. 및 Sig4 , 그리고 그들 모두에게 초기 값 "1000"을 주었습니다. 파형에서 둘 다 16진수 8(2진수 1000)임을 알 수 있습니다.

우리가 만든 마지막 두 개의 8비트 신호는 Uns8입니다. 및 Sig8 . 예상대로 초기 값이 0임을 파형에서 볼 수 있습니다. 그러나 거기에서 그들은 다르게 행동합니다! 분명히, 부호 있는 유형과 부호 없는 유형은 길이가 다른 두 개의 신호를 추가할 때 차이를 만들었습니다.

이것은 기호 확장자로 알려진 것 때문입니다. . 동일한 길이의 벡터에 저장된 양수 또는 음수를 더하는 것은 디지털 논리에서 동일한 작업입니다. 이것은 2의 보수가 작동하는 방식 때문입니다. 벡터의 길이가 다른 경우 가장 짧은 벡터를 확장해야 합니다.

부호 없는 4비트 이진수 "1000"은 십진수 8이고 부호 있는 4비트 숫자 "1000"은 십진수 -8입니다. 부호 있는 숫자의 맨 왼쪽에 있는 "1"은 이것이 음수임을 나타냅니다. 따라서 두 개의 4비트 신호는 컴파일러에 의해 서로 다르게 부호 확장됩니다.

이것은 부호 확장이 Uns8에 대해 서로 다른 값을 생성하는 방법을 시각화한 것입니다. 및 Sig8 신호:

테이크아웃

다음 튜토리얼로 이동 »


VHDL

  1. VHDL에서 서명된 것과 서명되지 않은 것
  2. VHDL의 프로세스에서 프로시저를 사용하는 방법
  3. VHDL에서 불순 함수를 사용하는 방법
  4. VHDL에서 함수를 사용하는 방법
  5. VHDL에서 프로시저를 사용하는 방법
  6. VHDL에서 상수 및 일반 맵을 사용하는 방법
  7. VHDL에서 포트 맵 인스턴스화를 사용하는 방법
  8. VHDL 시뮬레이터 및 편집기를 무료로 설치하는 방법
  9. PIC18 마이크로컨트롤러:정의 및 사용 방법
  10. 참조 지정자는 무엇이며 어셈블리에서 어떻게 사용합니까?