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

VHDL로 신뢰할 수 있는 타이머 만들기: 클록 사이클 세서 시간 측정하기

이전 튜토리얼에서는 시뮬레이션에서 시간을 지연시키려고 wait for 문을 썼습니다. 하지만 wait for는 실제 회로에 일시정지 명령을 내릴 수 없으므로 실제 설계(프로덕션)에는 쓸 수 없습니다. VHDL 모듈에서 시간을 측정하는 실용적 방법은 클록 사이클을 세는 것입니다.

모든 디지털 설계는 알려진 주파수로 진동하는 안정된 클록 신호에 접근할 수 있습니다. 클록이 100MHz면 1초는 1억 클록 틱입니다. 이 틱을 세면 초, 분, 시간 등을 신뢰성 있게 생성할 수 있습니다.

이 글은 Basic VHDL Tutorials 시리즈의 일부입니다.

매 클록 상승 에지마다 증가하는 카운터를 구현합니다. 카운터가 클록 주파수 값에 도달하면 1초가 경과해 보조 "초(Seconds)" 카운터가 증가합니다. 분(60초 후 증가)과 시간(60분 후 증가)도 비슷한 방식입니다. 추가 카운터를 체인으로 연결해 일, 주, 월까지 확장 가능하며 FPGA/ASIC 리소스와 필요한 카운터 폭만으로 제한됩니다.

긴 카운터는 더 많은 논리 리소스를 소비하고 전파 지연도 늘립니다. 카운터 체인의 임계 경로가 클록 주기 내에 맞아야 합성이 성공합니다.

실습: 타이머 구현

다음 VHDL 테스트벤치는 시뮬레이션 시간을 합리적으로 유지하려고 10Hz 클록을 쓰는 간단한 예제입니다. DUT는 Seconds, Minutes, Hours 시그널을 출력하는 타이머입니다.

library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T18_TimerTb is end entity; architecture sim of T18_TimerTb is -- 빠른 시뮬레이션용 느린 클록 constant ClockFrequencyHz : integer := 10; -- 10 Hz constant ClockPeriod : time := 1000 ms / ClockFrequencyHz; signal Clk : std_logic := '1'; signal nRst : std_logic := '0'; signal Seconds : integer; signal Minutes : integer; signal Hours : integer; begin -- Device Under Test (DUT) i_Timer : entity work.T18_Timer(rtl) generic map(ClockFrequencyHz => ClockFrequencyHz) port map ( Clk => Clk, nRst => nRst, Seconds => Seconds, Minutes => Minutes, Hours => Hours); -- 클록 생성기 Clk <= not Clk after ClockPeriod / 2; -- 테스트벤치 시퀀스 process is begin wait until rising_edge(Clk); wait until rising_edge(Clk); -- 리셋 해제 nRst <= '1'; wait; end process; end architecture; 

아래는 타이머 모듈 자체입니다. 틱, 초, 분, 시간을 세며 네거티브 리셋(nRst) 어서트 시 모든 카운터를 리셋합니다.

library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T18_Timer is generic(ClockFrequencyHz : integer); port( Clk : in std_logic; nRst : in std_logic; -- Negative reset Seconds : inout integer; Minutes : inout integer; Hours : inout integer); end entity; architecture rtl of T18_Timer is -- 클록 주기 카운트 signal Ticks : integer; begin process(Clk) is begin if rising_edge(Clk) then if nRst = '0' then Ticks <= 0; Seconds <= 0; Minutes <= 0; Hours <= 0; else if Ticks = ClockFrequencyHz - 1 then Ticks <= 0; if Seconds = 59 then Seconds <= 0; if Minutes = 59 then Minutes <= 0; if Hours = 23 then Hours <= 0; else Hours <= Hours + 1; end if; else Minutes <= Minutes + 1; end if; else Seconds <= Seconds + 1; end if; else Ticks <= Ticks + 1; end if; end if; end process; end architecture; 

파형은 올바른 동작을 확인시켜 줍니다: Seconds는 매 틱 증가, Minutes는 60초 후, Hours는 60분 후 증가.

시뮬레이션에서 ModelSim의 run 50 hr 명령으로 50시간 테스트를 10Hz 클록으로 수행해 실행 시간을 관리했습니다. 테스트벤치 클록 주파수 조정은 검증 가속의 흔한 전략입니다.

실제 하드웨어에서 카운터 체인은 한 클록 주기 내에 끝나야 합니다. 카운터 폭이 커지면 전파 지연이 증가해 주기를 초과하면 타이밍 위반이 발생합니다. 정확한 한계는 FPGA/ASIC 패밀리와 클록 속도에 따라 다릅니다.

핵심 정리

다음 튜토리얼로 넘어가 고급 타이머 기능을 배우세요.

VHDL

  1. VHDL 문자열 리스트 구현: 모범 사례와 예제
  2. Tcl 기반 VHDL 코드락 모듈 테스트벤치 만들기
  3. VHDL 테스트벤치 시뮬레이션 우아하게 종료하기
  4. VHDL PWM 컨트롤러 구현: 설계, 시뮬레이션, FPGA 데모
  5. VHDL 난수 생성: 균일 분포부터 OSVVM까지
  6. 블록 RAM에서 견고한 VHDL 링 버퍼 FIFO 설계하기
  7. VHDL 자가 검증 테스트벤치 구축 실전 가이드
  8. VHDL에서 보호 타입과 액세스 포인터로 동적 링크드 리스트 구현하기
  9. 프로세스 내 프로시저로 VHDL FSM 설계 깔끔하게 만들기
  10. VHDL 함수 마스터하기: 효율적 설계를 위한 실전 가이드