글쓴이 : 조형기



[1]ARM 보드설계 - SDRAM 인터페이스

그동안 S3C2440A 유저매뉴얼과 SMDK2440 평가보드의 회로도를 한참 들여다 보았다.
처음 복잡한 시스템을 접하게 되면, 참으로 어렵다. 영어로된 매뉴얼을 일으면서 명확
하게 이해되지 않는 문장을 놓고 이런 저런 상상의 나래를 펼치기도 하고, 회로도를 보
면서 이 부분의 설계를 왜 이렇게 했을까?, 이 커패시터는 뭐하는 기능일까? 궁금해
하기도 한다. 그야말로 혼돈의 시대이다.
하지만 끈질기게 보고, 생각하고, 분석하고, 묻고, 찾다보면 서서히 전체적인 윤곽이
잡히기 시작한다. 그리고 서서히 지식의 여신이 옷을 벗는다. 그 다음은 ... 좋겠죠 ?


물론 사람마다 이해의 정도가 다르고 그 수준 만큼의 추상화 레벨을 가지게 된다.
나는 하드웨어 애송이라 애송이 수준의 추상화 레벨에서 유저매뉴얼과 회로도를 이해
했다. 그 다음은 마치 내가 모든 것을 이해한 것처럼 거만하게 칼을 휘두른다.

시작하자!
가장 먼저 S3C2440A와 SDRAM의 인터페이스를 살펴본다. SDRAM의 동작원리는 상당히 복잡
하기 때문에 여기서 모든 것을 이해할 수는 없다. 거의 모든 지식이 그렇듯이,

SDRAM 칩을 설계하는 사람
SDRAM Controller를 설계하는 사람
SDRAM을 이용하여 회로를 설계하는 사람
SDRAM를 이용하는 보드에서 프로그램하는 사람

이 SDRAM을 바라보는 이해의 수준은 다 다른 것이다. 이것이 바로 추상화 레벨이다.
우리는 SDRAM을 이용한 보드에서 프로그램을 짜는 사람이므로, 그 정도의 수준에서 SDRAM
을 바라보자.


(1)SDRAM 측면
RAM은 SRAM(Static RAM)과 DRAM(Dynamic RAM)으로 나뉜다.
SRAM은 플립플랍(논리게이트)을 이용하여 비트 데이타를 저장한다. 가장 빠른 램의 형태
로 외부 지원 회로가 거의 필요없으며 전력 소모가 상대적으로 낮다. 반면 비트 당 저장
비용이 비싸다.
DRAM은 커패시터 배열을 이용하여 비트 데이타를 저장한다. 커패시터 배열이 전하를 금방
방전해 버리므로 DRAM은 1000분의 1초와 같은 일정 주기로 재충전을 해주어야 한다. 바로
이 재충전을 위해서는 부가회로가 필요하며, 재충전으로 인해 프로세서가 메모리를 참조
하는 과정이 지연될 수 있다. 반면 비트 당 저장 비용은 싸다.

컴퓨터의 메모리 계층구조에서, 바로 캐쉬가 SRAM으로 구성되고 주메모리가 DRAM으로 구성
된다. (요즘은 보통 SDRAM, DDR이 주이지만...)

SDRAM은 Syncronous DRAM이다. 기술적인 이유인지, 역사적인 이유인지 몰라도 DRAM을 개선
하면서 '동기적'라는 용어를 붙였다.


[helpme1] DRAM의 동작원리에서 무엇을 개선하였길래, Syncronous DRAM이라고 하였나?


우리가 사용하는 것은 삼성전자의 K4S561632C-TC75 이다.
256Mbit
SDRAM 4M*16bit*4banks
이라고 되어 있다. 보통 메모리의 용량을 말할 땐, 비트 단위를 사용한다. 여기선 전체가
256메가비트이므로 (256/8=32) 32메가바이트 짜리 SDRAM이 되는 것이다. 그리고,
16비트 데이타 버스 폭이고 뱅크가 4개 있다는 뜻이다. TC75는 클럭의 최대주파수를 지정
하는 것인데, 여기서 TC75는 133MHz를 의미한다. 쉽게 말해 속도를 말하는 것이다.
우리가 PC의 램을 말할때, PC133이라면 이런 SDRAM칩을 사용하여 만든 메모리카드(?)이다.

SDRAM의 내부 다이어그램은 이번 강좌 바로 다음에 첨부한 그림을 보자. 그림이 하나밖에
안올라가는 이 강좌 시스템땜시...(사진출처: Micron의 SDRAM 데이타쉬트)
SDRAM 인터페이스는 표준이므로, 항상 다음과 같은 핀들을 보게 된다. (그림과 비교해서)

CLK - clock 보통 프로세서에서 생성한다.
CKE - clock enable
nCS - chip selector
A0:A12 - 어드레스
BA0:BA1 - 뱅크 어드레스
DQ0:DQ15 - 데이타
nRAS - Row 스트로브 신호
nCAS - Column 스트로브 신호
nWE - write enable
DQM - DQ input/output Mask

보통 32비트 프로세서에는 SDRAM 콘트롤러가 들어있는데, 위의 핀에 해당하는 핀들이 프
로세서에도 나와 있다. 고로 잘 확인해서 연결만 하면 되는 것이다. 복잡한 내부 동작은
이 SDRAM 콘트롤러가 다 알아서 처리해 준다. 프로세서에는 이 SDRAM 콘트롤러을 제어하
는 시스템 레지스터가 있을 것이고 우리는 이 레지스터를 잘 조작해 주면 되는 것이다.

메모리의 용량이 커질수록 메모리의 번지를 어드레싱하는 어드레스 핀 수가 늘어나게 된다.
예를 들어, 128MB 용량의 메모리는 어드레스 핀 수가 A0:A26까지 27개나 필요하다.
DRAM의 용량이 갈수록 늘어나므로, 초창기 메모리 개발자들은 이를 어떻게 해결할 수 있
을까 고민하다가, 어드레스를 기존과 같이 1차원적으로 만드는 것이 아니라 3차원적으로
만들어내는 방법을 고안해 내었는데, 이것이 바로 SDRAM의 어드레싱 기본원리이다.
결론적으로, 직육면체를 생각해보자.
column address, row address, bank address가 바로 (x,y,z)가 되어 직육면체의 어느 한
곳(=한바이트)를 지정하게 되는 것이다.
그리고 column address와 row address 두 주소를 시간 차이를 두어 A0:A12핀에다가 실어
주고(이를 위해서 라스와 카스(RAS, CAS)스트로브 핀이 있는 것이다. 나는 카스가 좋다.)
bank address는 2핀 정도이니, 그냥 BA0,BA1을 사용하는 것이다.
이번 강좌 바로 다음에 첨부한 그림을 보면서 이해하면 필이 올 것이다. 오는가?

SDRAM의 액세스 동작의 순서는 nCS와 RAS(Row Address Strobe)신호를 활성화 시켜서 Row
Address를 주소버스에 실어준다. 그 다음 RAS를 비활성화 시키고 CAS(Column Address
Strobe)신호를 활성화 시키고, 읽기나 쓰기 동작에 따라서 nWE신호를 주면 되는 것이다.
결국 원하는 특정주소를 지정하고 나면, 거기서부터 Column Address를 하나씩 증가시켜
가며 데이타를 버스트하게 액세스하는 것이다. 모든 동작은 CLK이라는 클럭에 positive
edge에 동기되어 동작한다.(그래서 syncronous 인 것 같다.) 여기서 CAS latency 라는
용어가 대두되는데, read 커맨드와 첫번째 유효한 데이타 사이의 딜레이이다. 단위는
clock cycle이고, 보통 2,3 의 값을 갖는다. 즉, 2,3번 클럭 사이클 이후에 실제 데이타가
데이타버스에 실린다는 뜻이다.
SDRAM의 read, write 액세스 동작은 버스트(burst) 지향적이다. 이 말은 특정 어드레스의
데이타를 액세스할때, 한 바이트만을 하는게 아니라 한번에 여러 바이트를 액세스한다는
의미이다. burst length는 칩마다 다른데 보통 1,2,4,8, full page 정도이다.

BA0, BA1을 프로세서의 어떤 주소핀에 연결해야 되는가? 라는 질문을 가지는 눈치빠른
사람이 있을 것인데, 이는 프로세서의 데이타쉬트를 보면 된다. 거기서 지정해 주는대로
연결하라. S3C2440A의 유저매뉴얼을 보니, 32메가 짜리 2개를 32비트 버스 폭으로 붙일
때는 BA0,BA1을 각각 A24,A25에다가 연결하라고 하였다. 회로도를 보니, 그렇게 연결되어
있었다.


[helpme2] DQM의 정확한 기능은 무엇인가 ?


8비트, 16비트 마이크로콘트롤러에서는 이런 SDRAM 콘트롤러가 프로세서 내에 들어 있지
않으므로 별도의 DRAM, SDRAM 콘트롤러 칩이 필요하다. 32비트 이상의 프로세서에는 이런
DRAM, SDRAM 콘트롤러가 거의 다 들어있다.




(2)S3C2440A 측면
S3C2440A의 메모리 맵을 보면, 총 8개의 메모리 뱅크로(SDRAM의 뱅크와는 다르다.) 이루
어 져있다. 이 중 아래 6개는 ROM,SRAM등을 인터페이스 할 수 있고, 위의 2개는 ROM,SRAM
뿐만아니라 SDRAM도 인터페이스 할 수 있다. 각 해당하는 칩 셀렉트 신호가 있으며 다음
과 같다.

nGCS7 : 0x38000000
nGCS6 : 0x30000000
nGCS5 : 0x28000000
nGCS4 : 0x20000000
nGCS3 : 0x18000000
nGCS2 : 0x10000000
nGCS1 : 0x08000000
nGCS0 : 0x00000000

nGCS0에 연결되는 것이 주로 부팅하는 ROM, FLASH 메모리일 것이고,
nGCS6,7 에 연결되는 것이 주로 SDRAM이다. 아니 이렇게 하라고 만든 것이다.
결론적으로, nGCS6번 핀을 2개의 SDRAM 칩 CS핀에 연결하였다.
나머지 SDRAM관련 핀들은 정말로 1:1로 잘 연결되어 있는 것을 아래 그림에서 확인할 수
있을 것이다.
일단, NAND 플래시로 부팅하는 경우는 여기서 다루지 않는다.




(3)포인트
아래 회로도를 보면 SDRAM의 주소버스에만 직렬로 22옴짜리 저항을 연결해 놓은 것을
볼 수 있다. 이것의 기능은 댐핑 역할을 하는 것이다. 신호가 변환될때, 실리는 작은
노이즈들을 제거하는 역할을 한다.


[helpme3] 근데 왜 주소버스에만 달아 줄까요? 데이타버스는 안달고.


여기서 우린 프로세서와 주메모리를 연결시켰다. 이야~ 정말 대단하다.
시스템의 핵심부위가 준비된 셈이다. 다음에는 플래시 메모리를 인터페이스 할 것이면,
이로써 우리는 부팅을 시도할 수 있게 되었다. NAND 플래시는 한번도 다뤄 본 적이 없어
서 관심은 있지만, 시간을 끌 소지가 있으므로, 일단 NOR 플래시로 강좌를 진행해 나가
기로 하겠다.




(4)타우러스2 프로젝트와의 동기화
시작하기 전에 타우러스2 프로젝트 이야기를 잠깐해야 겠습니다.
12월 8일날 처음 모임을 가졌고, 서로 소개하고 즐거운 시간을 가졌습니다.
뭐 앞으로 구체적인 계획이 나온 것은 아니지만, 큰 줄기는 잡은 시간이었습니다.
앞으로 켈프에 '벅스(BUCKS) 프로젝트'라는 이름으로 S3C2440A기반 H/W, S/W 공개 프로
젝트를 진행해 나갈 것입니다. 내용은

H/W - protel로 보드 회로 설계
protel로 PCB 아트웍 작업
실제 보드 제작

S/W - uboot 부트로더 포팅
pSOS RTOS 포팅
Nucleus RTOS 포팅
WindowCE 포팅
Linux 포팅

정도입니다. 공개프로젝트인 만큼 일을 하는 과정을 중심으로 다큐멘테이션을 하고
결과를 공개할 것입니다. 물론 거기서 저는 uboot와 리눅스를 포팅하는 과정을 팀원
들과 함께 진행할 것입니다. 이 강좌가 바로 그 과정의 전부가 될 것이구여.


모두들 안녕~
-끝-

첨부 파일:  SDRAM.jpg (486 KiB(497,810 Bytes))


[Image Size 960 x 1624]

'KB > embbeded sw' 카테고리의 다른 글

arm simulator  (0) 2005.07.11
SMDK2440  (0) 2005.04.06
[1]ARM 보드설계 - 회로도 이해하기  (0) 2005.04.06
[세미나] 리눅스 어셈블리 프로그래밍  (0) 2004.08.17
[세미나] 임베디드 리눅스  (0) 2004.08.17

+ Recent posts