VHDL에서 신호(Signal)와 변수(Variable)의 차이점 이해하기
이전 튜토리얼에서는 프로세스 내에서 변수를 선언하는 방법을 탐구했습니다. 변수는 지역적인 알고리즘 작업에 이상적이지만, 해당 프로세스 외부에서는 볼 수 없습니다. 설계의 다른 부분과 값을 공유해야 할 때는 신호(signal)를 사용합니다.
신호는 아키텍처의 선언 영역에 선언됩니다. 즉, architecture <아키텍처명> of <엔티티명> is 줄과 begin 키워드 사이입니다.
이 게시물은 기본 VHDL 튜토리얼 시리즈의 일부입니다.
신호 선언 구문:
signal <이름> : <타입>;
초기값을 선택적으로 지정할 수 있습니다:
signal <이름> : <타입> := <초기값>;
실습
이 비디오 튜토리얼에서는 신호 선언 방법과 변수와의 핵심 차이점을 학습합니다.
이 튜토리얼에서 작성한 최종 코드:
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으로 신호와 변수를 생성했습니다. 프로세스에서 동일하게 처리했지만, 콘솔 출력은 뚜렷한 행동 차이를 보여줍니다. 주요 차이점은:
- 변수는
:= 연산자를 사용하며 프로세스 내에서 즉시 업데이트됩니다.
- 신호는
<= 연산자를 사용하며, 새 값이 스케줄링되고 프로세스가 일시 중단될 때(예: wait 문에서)만 적용됩니다.
- 프로세스가 재개되기 전에 신호가 여러 번 할당되면, 이전 스케줄된 값이 덮어쓰여지므로 마지막 할당만 "승리"합니다.
예제에서 MySignal의 첫 두 증가는 wait for 10 ns; 문이 프로세스를 일시 중단시키고 신호를 업데이트하기 전에 덮어쓰여져 손실되었습니다. 이후 증가는 일시 중단 후 나타나며 예상된 동작과 일치합니다.
핵심 요약
- 즉각적인 지역 업데이트가 필요한 임시 값에는 변수를 사용하세요.
- 다른 프로세스나 컴포넌트에 변경 사항을 전달해야 할 때는 신호를 사용하세요.
- 신호 할당은 스케줄링되며 프로세스가 일시 중단될 때만 커밋됩니다. 일시 중단 없이 여러 번 할당하면 마지막 값만 살아남습니다.
다음 튜토리얼로 이동 »