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

VHDL에서 타이머를 만드는 방법

이전 자습서에서는 wait for를 사용했습니다. 시뮬레이션에서 시간을 지연시키는 명령문. 그러나 생산 모듈은 어떻습니까? wait for 문을 사용할 수 없습니다. 회로의 전자에게 주어진 시간 동안 일시 중지하도록 말할 수 없기 때문에 시뮬레이션에서만 작동합니다. 그렇다면 디자인 모듈에서 어떻게 시간을 추적할 수 있습니까?

답은 단순히 클럭 사이클을 계산하는 것입니다. 모든 디지털 설계는 알려진 고정 주파수에서 진동하는 클록 신호에 액세스할 수 있습니다. 따라서 클럭 주파수가 100MHz라는 것을 알면 1억 클럭 사이클을 세어 1초를 측정할 수 있습니다.

이 블로그 게시물은 기본 VHDL 자습서 시리즈의 일부입니다.

VHDL에서 초를 계산하기 위해 통과하는 클록 주기 수를 계산하는 카운터를 구현할 수 있습니다. 이 카운터가 클럭 주파수 값(예:1억)에 도달하면 1초가 지났고 다른 카운터를 증가시킬 시간이라는 것을 알 수 있습니다. 이것을 초 카운터라고 부르겠습니다.

분을 계산하기 위해 60초가 지나면 증가하는 다른 분 카운터를 구현할 수 있습니다. 마찬가지로 60분이 지나면 증가하는 시간을 계산하기 위한 시간 카운터를 만들 수 있습니다.

우리는 일, 주, 월을 계산할 때도 이 접근 방식을 계속할 수 있습니다. 기본 기술에서 사용 가능한 물리적 리소스와 카운터 길이 대 클록 주파수에 의해 제한을 받습니다.

카운터의 길이가 증가함에 따라 분명히 더 많은 리소스를 소비합니다. 그러나 일련의 이벤트가 길어지기 때문에 반응 속도도 느려집니다.

운동

이 비디오 자습서에서는 VHDL에서 타이머 모듈을 만드는 방법을 배웁니다.

타이머 testbench의 최종 코드 :

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

    -- We're slowing down the clock to speed up simulation time
    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

    -- The 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);

    -- Process for generating the clock
    Clk <= not Clk after ClockPeriod / 2;

    -- Testbench sequence
    process is
    begin
        wait until rising_edge(Clk);
        wait until rising_edge(Clk);

        -- Take the DUT out of reset
        nRst <= '1';

        wait;
    end process;

end architecture;

타이머 모듈의 최종 코드 :

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 for counting clock periods
    signal Ticks : integer;

begin

    process(Clk) is
    begin
        if rising_edge(Clk) then

            -- If the negative reset signal is active
            if nRst = '0' then
                Ticks   <= 0;
                Seconds <= 0;
                Minutes <= 0;
                Hours   <= 0;
            else

                -- True once every second
                if Ticks = ClockFrequencyHz - 1 then
                    Ticks <= 0;

                    -- True once every minute
                    if Seconds = 59 then
                        Seconds <= 0;

                        -- True once every hour
                        if Minutes = 59 then
                            Minutes <= 0;

                            -- True once a day
                            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 if;
    end process;

end architecture;

Seconds에서 확대된 파형 신호:

Minutes에서 확대된 파형 신호:

Hours에서 확대된 파형 신호:

분석

50시간 시뮬레이션을 실행하기 위해 run 50 hr 명령을 주었습니다. ModelSim 콘솔에서. 50시간은 정말 긴 시뮬레이션이므로 테스트벤치의 클럭 주파수를 10Hz로 낮춰야 했습니다. 100MHz로 두었다면 시뮬레이션에 며칠이 걸렸을 것입니다. 이러한 조정은 디자인을 시뮬레이션할 수 있도록 하기 위해 때때로 필요합니다.

파형에서 타임라인을 마우스 오른쪽 버튼으로 클릭하고 "Grid, Timeline &Cursor Control"을 선택했습니다. 시간 단위를 ns에서 초, 분, 시로 변경하면 실제로 타이머가 실시간으로 작동하는 것을 확인할 수 있었습니다.

타이머 시간은 시뮬레이션 시작 시 모듈이 재설정되기 때문에 시뮬레이션 시간에서 약간 오프셋됩니다. 타임라인의 60초 표시가 초 신호가 0으로 랩핑되기 약간 전인 첫 번째 파형에서 볼 수 있습니다.

시뮬레이션에서 카운터 값은 클록의 상승 에지에서 0 시간으로 업데이트됩니다. 실제 세계에서 카운터 값은 카운터의 첫 번째 비트에서 마지막 비트로 전파되는 데 약간의 시간이 필요합니다. 카운터의 길이를 늘리면 클럭 기간의 가용 시간이 소모됩니다.

모든 계단식 카운터의 누적 길이가 너무 길어지면 컴파일 후 장소 및 경로 단계에서 오류가 발생합니다. 전체 클록 주기를 소비하기 전에 얼마나 오래 카운터를 구현할 수 있는지는 FPGA 또는 ASIC 아키텍처와 클록 속도에 따라 다릅니다.

클럭 속도가 증가하면 카운터 체인이 더 길어집니다. 또한 클록 주기 시간이 짧아져 카운터 체인을 완료하는 데 걸리는 시간이 훨씬 줄어듭니다.

테이크아웃

다음 튜토리얼로 이동 »


VHDL

  1. VHDL에서 문자열 목록을 만드는 방법
  2. VHDL 코드 잠금 모듈을 위한 Tcl 기반 테스트벤치를 만드는 방법
  3. VHDL 테스트벤치에서 시뮬레이션을 중지하는 방법
  4. VHDL에서 PWM 컨트롤러를 만드는 방법
  5. VHDL에서 난수를 생성하는 방법
  6. VHDL에서 링 버퍼 FIFO를 만드는 방법
  7. 자가 점검 테스트벤치를 만드는 방법
  8. VHDL에서 연결 목록을 만드는 방법
  9. VHDL의 프로세스에서 프로시저를 사용하는 방법
  10. VHDL에서 함수를 사용하는 방법