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

신호가 VHDL의 변수와 다른 점

이전 튜토리얼에서 우리는 프로세스에서 변수를 선언하는 방법을 배웠습니다. 변수는 프로세스 내에서 알고리즘을 만드는 데 유용하지만 외부 세계에서는 액세스할 수 없습니다. 변수의 범위가 단일 프로세스에만 있는 경우 다른 논리와 어떻게 상호 작용할 수 있습니까? 이에 대한 해결책은 신호입니다. .

신호는 architecture <architecture_name> of <entity_name> is 사이에 선언됩니다. 줄 및 begin VHDL 파일의 명령문. 이것을 아키텍처의 선언적 부분이라고 합니다.

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

신호를 선언하는 구문은 다음과 같습니다.
signal <name> : <type>;

신호는 선택적으로 초기 값으로 선언될 수 있습니다.
signal <name> : <type> := <initial_value>;

운동

이 비디오 자습서에서는 신호를 선언하는 방법을 배웁니다. 우리는 또한 변수와 신호의 주요 차이점을 배울 것입니다:

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

entity T06_SignalTb is
end entity;

architecture sim of T06_SignalTb is

    signal MySignal : integer := 0;

begin

    process is
        variable MyVariable : integer := 0;
    begin

        report "*** Process begin ***";

        MyVariable := MyVariable + 1;
        MySignal   <= MySignal + 1;

        report "MyVariable=" & integer'image(MyVariable) &
            ", MySignal=" & integer'image(MySignal);

        MyVariable := MyVariable + 1;
        MySignal   <= MySignal + 1;

        report "MyVariable=" & integer'image(MyVariable) &
            ", MySignal=" & integer'image(MySignal);

        wait for 10 ns;

        report "MyVariable=" & integer'image(MyVariable) &
            ", MySignal=" & integer'image(MySignal);

    end process;

end architecture;

ModelSim에서 실행 버튼을 눌렀을 때 시뮬레이터 콘솔에 대한 출력:

VSIM 2> run
# ** Note: *** Process begin ***
#    Time: 0 ns  Iteration: 0  Instance: /t06_signaltb
# ** Note: MyVariable=1, MySignal=0
#    Time: 0 ns  Iteration: 0  Instance: /t06_signaltb
# ** Note: MyVariable=2, MySignal=0
#    Time: 0 ns  Iteration: 0  Instance: /t06_signaltb
# ** Note: MyVariable=2, MySignal=1
#    Time: 10 ns  Iteration: 0  Instance: /t06_signaltb
# ** Note: *** Process begin ***
#    Time: 10 ns  Iteration: 0  Instance: /t06_signaltb
# ** Note: MyVariable=3, MySignal=1
#    Time: 10 ns  Iteration: 0  Instance: /t06_signaltb
# ** Note: MyVariable=4, MySignal=1
#    Time: 10 ns  Iteration: 0  Instance: /t06_signaltb
# ** Note: MyVariable=4, MySignal=2
#    Time: 20 ns  Iteration: 0  Instance: /t06_signaltb
...

분석

우리는 초기 값이 0인 신호와 변수를 생성했습니다. 이 과정에서 우리는 그것들을 똑같은 방식으로 처리했지만, 출력물은 그것들이 다르게 행동했음을 보여줍니다. 먼저 우리는 변수와 신호에 대한 할당이 VHDL에서 다른 표기법을 가지고 있음을 보았습니다. 변수 할당은 :=을 사용합니다. 신호 할당이 <=를 사용하는 동안 연산자 연산자.

MyVariable 변수가 동작할 것으로 예상하는 대로 동작합니다. 루프의 첫 번째 반복에서는 1로 증가된 다음 2로 증가합니다. 첫 번째 반복에서 마지막 출력은 예상대로 값이 여전히 2임을 보여줍니다.

MySignal 약간 다르게 행동합니다. 첫 번째 +1 증가는 효과가 없는 것 같습니다. 출력은 그 값이 여전히 초기 값인 0임을 나타냅니다. 두 번째 +1 증가 후에도 마찬가지입니다. 이제 MyVariable 값 2이지만 MySignal의 값 여전히 0입니다. wait for 10 ns; 이후 세 번째 출력은 MySignal의 값을 보여줍니다. 이제 1입니다. 후속 인쇄물도 이 패턴을 따릅니다.

이 마법은 무엇입니까? 내가 단서를 줄게, wait for 10 ns; 그것과 관련이 있습니다. 신호는 프로세스가 일시 중지된 경우에만 업데이트됩니다. 우리 프로세스는 wait for 10 ns;에서 한 곳만 일시 중지합니다. . 따라서 신호 값은 이 라인에 도달할 때마다 변경됩니다. 10나노초는 임의의 값이며 0나노초도 가능합니다. 사용해 보세요!

또 다른 중요한 관찰은 신호가 wait , 값은 한 번만 증가합니다. 이는 프로세스에서 신호에 할당할 때 마지막 할당이 "승리"하기 때문입니다. <= 연산자는 신호에 새 값만 예약하며 wait이 될 때까지 변경되지 않습니다. . 따라서 MySignal의 두 번째 증분에서 , 이전에 1이 추가됩니다. 값. 다시 증가하면 첫 번째 증가가 완전히 손실됩니다.

테이크아웃

다음 튜토리얼로 이동 »


VHDL

  1. VHDL에서 서명된 것과 서명되지 않은 것
  2. 변수 - VHDL 예
  3. 클라우드 컴퓨팅은 기존 컴퓨팅과 어떻게 다른가요?
  4. VHDL에서 문자열 목록을 만드는 방법
  5. VHDL 테스트벤치에서 시뮬레이션을 중지하는 방법
  6. VHDL에서 PWM 컨트롤러를 만드는 방법
  7. VHDL에서 난수를 생성하는 방법
  8. VHDL의 프로세스에서 프로시저를 사용하는 방법
  9. VHDL에서 함수를 사용하는 방법
  10. BeiDou 항법 위성 시스템이란 무엇입니까? GPS와 어떻게 다른가요?