본문 바로가기
시스템 반도체/Arm

Arm Private Timer ( zynq 7000 board, Load 레지스터, counter 레지스터, status 레지스터, control 레지스터 )

by 전컴반 2022. 8. 10.
반응형

Timer는 어떻게 작동할까?

타이머는 시간을 설정하고 설정한 시간이 끝나면 어떤 이벤트가 발생하는게 기능적인 동작이다.

 

아래 Zynq-7000의 내부를 살펴보면, Timer가 여러 개가 있다. 이 중에서 Private timer에 대해서 더 알아보자

 

 

 

Private Timer

 

4개의 레지스터가 존재하는데 하나씩 보자

 

 

1. Load Register

- 간단히 말하면 사용자가 설정한 시간을 저장하는 레지스터다. 길이는 32bit다.

 

 

2. Counter Register

- 마찬가지로 32bit인데 숫자를 세는 레지스터다. 위에 Load 레지스터와 어떻게 연결돼 있는지 보면, 

 

str r2, [r3] 동작을 수행했다고 하자. 이때 r3의 주소가 Load 레지스터r2에는 1000이 저장돼 있다고 하면, load 레지스터에 1000이 저장되고, load 레지스터의 값을 counter 레지스터가 복사하여 clock이 튈 때마다 1씩 감소하는 형태다.

그러다가 counter 레지스터의 값이 0으로 세팅되면 어떤 mode냐에 따라 달리 동작하는데 single-shot mode와 auto-reload mode가 있다.

 

만약 single-shot mode라면 0으로 세팅되면 끝이다. 그냥 1000만 세고 끝나거라고 보면 된다.

그런데 auto-reload mode라면 다시 Load 레지스터에 있는 값을 복사하여 감소하기 시작한다. 

 


 

그렇다면 clock의 시간은 어떻게 정할까?? zynq-7000에 따르면 Private time와 Watchdog timer는 CPU frequency의 1/2을 따른다고 한다. CPU frequency는 666MHZ를 따르니 clock은 333MHZ를 따른다. 즉 timer clock은 333MHZ라는 말이다.

 

하드웨어로 구현하려면 F/F를 이용해서 clk에 맞춰서 1씩 감소하면 된다.

 


 

 

3. Control Register

- timer의 설정을 관장하는 레지스터다. format은 아래와 같다. 

 

 

- Prescaler는 우리가 333MHZ를 입력으로 받으면 원하는 클럭을 조절하는 부분이다. 어떻게 보면 나눗셈을 하는 부분이라고 볼 수 있다.

좀 더 자세히 보면 Clock_out = { Clock_in / (prescalar + 1) } 로 계산된다. 이렇게 되면 Clock_out을 기준으로 counter 레지스터가 동작한다.  즉, 기존 clock보다 더 느리게 만드는 것인데 더 빠르게 만들 수 있을까?? 없다. 빠르게 만들기 위해선 PLL이라는 하드웨어 소자가 필요한데 일반적으로 timer에는 지원하지 않는다.

 

- IRQ enable가 1로 세팅되면 counter 레지스터가 0으로 됐을 때 interrupt를 발생하겠다고 CPU에서 신호를 보내는 것이다.

 

- Auto reload는 0이면 single shot, 1이면 auto reload라는 의미다.

 

- Timer enable은 0이면 동작하지 않겠다는 의미고, 1이면 동작한다는 의미다. 어떻게 보면 전원 같은 느낌이다. 

 

 

4. Status Register

- Interrupt를 알려주는 레지스터로 counter 레지스터가 0이 되면 자동적으로 Event flag가 1로 세팅된다. 

그리고 Event Flag를 0으로 만들고 싶다면 1을 적어줘야 한다. 좀 헷갈릴 수 있는데 무슨 말이냐면, r1이 Event flag의 주소를 가지고 있고 r2에 1이 저장돼 있다면 str r2, [r1]과 같이 해줘야 0으로 clear된다.

 

 


이렇게 Private Timer에 대해서 알아봤다. 

반응형

댓글