대부분의 VHDL 설계는 클록된 로직, 흔히 동기 또는 순차 로직이라 불리는 것을 사용합니다. 클록된 프로세스는 다른 입력 시그널 변화와 무관하게 마스터 클록의 에지에서만 활성화됩니다.
클록된 로직의 기본 요소는 플립플롭(flip-flop)입니다. 이 튜토리얼에서는 네거티브 리셋을 가진 양의 에지 트리거 플립플롭에 집중합니다. 아래 회로도를 참조하세요:
샘플-홀드 장치로서 플립플롭은 상승 클록 에지에서 입력 값을 캡처하고, 다음 상승 에지 또는 리셋 신호 어서트 전까지 그 값을 유지합니다.
참고: 이 글은 Basic VHDL Tutorials 시리즈의 일부입니다.
모든 클록된 프로세스는 동시에 트리거되고 입력을 동시에 샘플링합니다. 클록은 이산적 타임스텝을 확립해 복잡한 논리를 명확한 사이클-바이-사이클 이벤트로 분할하게 합니다.
플립플롭 또는 그 배열을 레지스터(registers)라고도 부릅니다.
클록된 프로세스의 민감도 리스트에는 일반적으로 클록 시그널만 들어갑니다. 프로세스가 클록 플랭크에서만 깨어나기 때문입니다. 추가 입력은 트리거 목적상 무시됩니다.
아래는 동기 리셋을 가진 클록된 프로세스의 재사용 가능한 템플릿입니다:
process(Clk) is begin if rising_edge(Clk) then if nRst = '0' then <reset all output signals here> else <main logic here> end if; end if; end process;
실습
동반 비디오 튜토리얼에서 VHDL 클록된 프로세스 생성을 안내합니다.
테스트벤치 코드
플립플롭 최종 테스트벤치:
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T17_ClockedProcessTb is end entity; architecture sim of T17_ClockedProcessTb is constant ClockFrequency : integer := 100e6; -- 100 MHz constant ClockPeriod : time := 1000 ms / ClockFrequency; signal Clk : std_logic := '1'; signal nRst : std_logic := '0'; signal Input : std_logic := '0'; signal Output : std_logic; begin -- The Device Under Test (DUT) i_FlipFlop : entity work.T17_FlipFlop(rtl) port map( Clk => Clk, nRst => nRst, Input => Input, Output => Output); -- Clock generation Clk <= not Clk after ClockPeriod / 2; -- Testbench sequence process is begin -- Release the DUT from reset nRst <= '1'; wait for 20 ns; Input <= '1'; wait for 22 ns; Input <= '0'; wait for 6 ns; Input <= '1'; wait for 20 ns; -- Apply reset nRst <= '0'; wait; end process; end architecture;
플립플롭 모듈
네거티브 리셋을 가진 양의 에지 플립플롭 구현:
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T17_FlipFlop is port( Clk : in std_logic; nRst : in std_logic; -- Negative reset Input : in std_logic; Output : out std_logic); end entity; architecture rtl of T17_FlipFlop is begin -- Flip‑flop with synchronized reset process(Clk) is begin if rising_edge(Clk) then if nRst = '0' then Output <= '0'; else Output <= Input; end if; end if; end process; end architecture;
파형 관찰
ModelSim에서 시뮬레이션 실행 후 타임라인 확대 시 파형은 출력이 오직 상승 클록 에지에서만 업데이트됨을 명확히 보여줍니다:
분석
출력은 상승 클록 에지에서만 변경됩니다. 두 상승 에지 사이에서 발생하는 입력 전이(예: ~45ns에서 시작하는 음의 딥)는 플립플롭이 에지에서만 샘플링하므로 캡처되지 않습니다.
아래 애니메이션은 입력, 클록, 출력 간 관계를 시각화합니다:
주요 관찰 사항:
20ns의 한 클록 주기 입력 펄스는 클록과 동기이며 출력에 지연된 반응을 생성합니다.
시뮬레이션 중 이벤트는 제로-타임 스텝(델타 사이클)에서 발생합니다. 플립플롭이 입력 읽기와 출력 업데이트를 같은 델타 사이클에서 수행하므로 클록 에지 직전 입력 값을 캡처합니다.
실제로 플립플롭은 클록 에지 전후 짧은 기간 동안 안정된 입력을 요구합니다. 이는 셋업(setup)과 홀드(hold) 시간으로 알려져 있습니다. 이 제약은 VHDL을 넷리스트로 변환할 때 합성 도구가 자동 처리합니다.