VHDL에서 동시 문장(concurrent statement)은 process 블록 밖, 아키텍처에 직접 놓인 시그널 할당입니다. 동시 할당(concurrent assignment) 또는 동시 프로세스(concurrent process)라고도 부릅니다.
동시 문장을 쓰면 할당 우변에 나타나는 모든 시그널에 자동으로 민감한 프로세스를 만드는 효과가 있습니다. 즉, 동시 할당은 완전한 민감도 리스트를 가진 프로세스의 문법적 설탕(syntactic sugar)입니다.
이 단축 표현은 단일 시그널을 구동하는 간단한 조합 논리를 구현할 때 특히 유용합니다. 매번 process 구조에 민감도 리스트를 적는 대신 아키텍처 본문에서 대상 시그널에 직접 할당할 수 있습니다.
이 튜토리얼은 Basic VHDL Tutorials 시리즈의 일부입니다.
올바르게 쓰면 코드 의도가 수정처럼 명확해집니다—토글하려는 비트마다 프로세스로 어지럽힐 필요 없습니다.
실습
이 비디오에서 동시 문장 만들기를 배웁니다:
이 튜토리얼에서 만든 최종 코드:
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T13_ConcurrentProcsTb is end entity; architecture sim of T13_ConcurrentProcsTb is signal Uns : unsigned(5 downto 0) := (others => '0'); signal Mul1 : unsigned(7 downto 0); signal Mul2 : unsigned(7 downto 0); signal Mul3 : unsigned(7 downto 0); begin process is begin Uns <= Uns + 1; wait for 10 ns; end process; -- Process multiplying Uns by 4 process is begin Mul1 <= Uns & "00"; wait on Uns; end process; -- Equivalent process using sensitivity list process(Uns) is begin Mul2 <= Uns & "00"; end process; -- Equivalent process using a concurrent statement Mul3 <= Uns & "00"; end architecture;
ModelSim 파형 창에서 run 후 타임라인 확대:
파형에서 Mul1, Mul2, Mul3이 정확히 동일하게 동작함을 볼 수 있습니다. 이는 동시 문장과 우리가 작성한 두 프로세스가 완전히 등가임을 확인시켜 줍니다.
동시 문장은 프로세스처럼 동작합니다: <= 우변에 나타나는 모든 시그널이 암묵적으로 민감도 리스트에 추가됩니다. 결과적으로 평가되는 시그널 중 하나라도 변하면 좌변 시그널이 업데이트됩니다.
이 예제에서 Uns 시그널을 왼쪽 비트 시프트로 4배 했습니다. 모든 시그널이 unsigned 타입이라 컴파일러가 숫자값으로 취급합니다. 이진수 오른쪽에 0 비트 두 개를 덧붙이는 건 4를 곱하는 것과 같습니다.