이전 튜토리얼에서는 두 카운터 신호가 일치할 때만 프로세스를 트리거하기 위해 Wait Until 문과 조건식을 사용했습니다. 만약 다양한 입력에 따라 프로그램이 다른 동작을 취해야 한다면 어떻게 할까요?
If-Then-Elsif-Else 구조를 사용하면 로직을 분기할 수 있습니다. 변수의 값이나 표현식의 결과에 따라 프로그램은 서로 다른 경로를 따릅니다.
이 기사는 기본 VHDL 튜토리얼 시리즈의 일부입니다.
기본 구문
표준 형식은 다음과 같습니다:
if <조건> then elsif <조건> then else end if;
elsif와 else 절은 선택 사항이며, elsif는 여러 번 나타날 수 있습니다. <조건>은 부울 리터럴이거나 true 또는 false로 평가되는 표현식일 수 있습니다.
예: MyCounter < 10은 MyCounter가 10보다 작을 때 참입니다.
관계 연산자
=
같음
/=
같지 않음
<
작음
<=
작거나 같음
>
큼
>=
크거나 같음
논리 연산자
nota
a가 거짓이면 참
aandb
a와 b가 모두 참이면 참
aorb
a 또는 b가 참이면 참
anandb
a 또는 b가 거짓이면 참
anorb
a와 b가 모두 거짓이면 참
axorb
a와 b 중 정확히 하나만 참이면 참
axnorb
a와 b가 같으면 참
실습
아래는 If-Then-Elsif-Else 구조를 실제로 보여주는 완전한 VHDL 예제입니다.
최종 코드:
entity T08_IfTb is end entity;
architecture sim of T08_IfTb is
signal CountUp : integer := 0;
signal CountDown : integer := 10;
begin
process is
begin
CountUp <= CountUp + 1;
CountDown <= CountDown - 1;
wait for 10 ns;
end process;
process is
begin
if CountUp > CountDown then
report "CountUp is larger";
elsif CountUp < CountDown then
report "CountDown is larger";
else
report "They are equal";
end if;
wait on CountUp, CountDown;
end process;
end architecture;
CountDown을 10으로, CountUp을 0으로 초기화했습니다. 첫 번째 프로세스에서 두 카운터는 10ns마다 동시에 업데이트됩니다. 두 번째 프로세스는 이 신호들을 대기하므로 변경될 때마다 트리거됩니다. If-Then-Elsif-Else 블록은 CountUp > CountDown, CountUp < CountDown, CountUp = CountDown 세 가지 분기 중 하나를 선택합니다. 명시적 else는 필수는 아니지만, 모든 예외 상황을 처리하기 위해 포함하는 것이 모범 사례입니다.
콘솔 추적은 두 번째 프로세스가 각 업데이트 후 조건을 평가하여 적절한 메시지를 출력함을 확인시켜 줍니다.
핵심 요약
If-Then만 단독으로 사용하거나 Elsif, Else와 조합하여 모든 가능한 시나리오를 커버하세요.