이미 우리는 디지탈 신호 및 파형, 그리고 클락(clock)에 대해 살펴보았다.
이제 이 기반지식들을 가지고 타이밍 다이어그램(Timing Diagram)을 공부해보자!
타이밍 다이어그램이란 각 신호들이 시간별로 처리되는 과정을 그림으로 나타낸 것으로 이해하면 되겠다.
아래 그림을 살펴보자.
이전에 살펴본 그림과 비슷한 모양이다. 클락(clk)은 주기적으로 움직이고 클락에 맞춰서 데이터(D) 파형이 바뀜으로써 데이터를 읽거나 쓰는 동작이 가능해진다. 여기서 중요한 개념은 파형의 높낮이(High / Low)와 시간값이 정해진 바대로 움직여야 유효한 데이터가 나온다는 것이다.
위 그림이 클락이 High로 갈때 D(데이터)를 읽는 다이어그램이라고 생각해보자.
그럼 t=0에서부터 t=6까지 데이터값은 다음과 같게 된다.
D값 0 1 1 0 0 1 1
실제 파형의 움직임은 위 그림처럼 직각으로 떨어지지 않는다. 전기신호가 물리적으로 변동되는데 시간이 걸리므로 실제 타이밍 다이어그램은 아래 그림과 같은 형태로 나타나게 된다.
파형이 High <--> Low로 이동하는 시간값은 해당기기와 통신라인에 따라 다르고, 정확한 값들은 기기의 데이터시트에 정의되어 있다. 소프트웨어 개발하면서 그렇게 중요한 사항은 아니니, 인터넷에 있는 복잡한 그림들을 미리 볼 필요는 없다. 진짜 일을 하다가 꼭 필요하면 해당 기기의 데이터시트를 꼼꼼히 보면 누구나 이해할 수 있는 것들이다.
위 그림에서 파형이 High/Low로 정해져있지 않고, 교차형태를 취하고 있는데, 이는 High/Low 둘중 하나의 값을 가질수 있다는 표현이다. 아래 그림으로 설명하겠다.
빗금이나 교차 형태를 취하고 있는 것은 Low가 High 둘 중 하나의 상태(Valid High, Valid Low)를 가질 수 있다는 것이고, Transition Low 구간은 해당 구간에서 어디서든 High에서 Low로 떨어질 수 있다는 것이다. Transition High도 마찬가지다. 이전에 설명한 바 있는데, High도 Low도 아닌 어정쩡한 상태를 Floating이라고 하며, Tri-state 또는 Hi-Z(하이 임피던스)라고 한다. High, Low가 유효한 경우, valid high, valid low라고 하기도 하고 active high, active low라는 용어를 쓰기도 한다.
한가지 더 High에서 Low로 떨어지는 구간을 falling-edge, Low에서 High로 올라가는 구간을 rising-edge라고 한다. 이 용어들은 임베디드 소프트웨어 개발을 하면서 무지하게 많이 접할 것들이므로 미리 친숙해지는 게 좋다.
실제 데이터시트에 나와 있는 타이밍 다이어그램은 그렇게 단순하지 않다. 아래 그림을 보자.
특정 NAND 플래쉬 메모리에서 상태(Status)를 읽는 명령을 표현한 타이밍 다이어그램이다. 그림이 복잡해보이는 것은 타이밍 관련 표시, 즉 tCS, tCH와 같은시간값들이 표기되어 있어서 그렇게 보인다. 이 시간값들에 맞춰 파형이 유지되어야지 동작이 유효한 것으로 기기에서 인식하게 된다.
각 핀들에 연결된 라인의 변화에 따라 기기의 동작이 결정된다. 각 핀들이 무엇인지는 여기서 알 필요는 없으나, 이전에 이미 설명한바 있는 CE, WE 등은 일반적인 용어이니 알고 있어야 한다. 굳이 알 필요는 없지만, 설명을 해줬으면 하는 독자들을 위해 위 타이밍 다이어그램이 어떻게 동작하는 것인지 대충 설명하겠다.
I/Ox는 데이터가 나가는 핀으로 입력으로 쓸수도 있고 출력으로 쓸수도 있다.
1. CE가 active low이고 tCS만큼 유지되는 동안(위 타이밍 다이어그램은 CE가 반전임을 주의해라, 즉 실제 CE는 active high로 들어가는 것이다)
2. CLE가 tCLS만큼 active high를 유지하는 동안
3. WE가 tWP만큼 active low를 유지하는 동안
입력되는 I/Ox 바이트가 처리가 된다. 여기서는 NAND 플래쉬 메모리의 상태(Status)를 읽기 위해 해당 명령어의 바이트값인 0x70 바이트를 보낸 것이다.
여기까지 모든 동작이 유효하게 진행이 된 경우 기기(NAND 플래쉬 메모리)는 그 다음 후속동작을 타이밍 값들(tCEA, tCLR, tWHR 등등)에 맞게 처리를 하고 RE핀을 active low로 내리면, 그 때 Status Output을 읽어갈 수 있게 된다.
해당기기의 디바이스 드라이버를 개발하는 소프트웨어 개발자인 경우 타이밍다이어그램을 이해하는 일은 중요하다. 하지만 단순히 해당 디바이스 드라이버를 가져다가 쓰는 상위 레벨의 소프트웨어 개발자들에게는 중요도가 덜하다고 할 수 있겠다. 어찌되었든 여기서 소개한 타이밍 다이어그램 관련 내용들은 임베디드 소프트웨어 개발자라면 기본적으로 알고 있어야 한 상식이니 숙지하는 것이 좋다.
졸저 <개발자 오디세이아> 가 책으로 나왔습니다. 개발자들의 애환과 희망을 담으려 최선을 다했습니다. 많은 사랑 부탁드립니다^^