본문 바로가기
에스디램(SDRAM)이 뭐죠?

뭘 알아야 이해를 하지!

에스디램(Synchronous Dynamic Random Access Memory)은 에스디알(Single Data Rate)과 디디알(Double Data Rate)로 구별을 할 수가 있어요. 한번에 하나의 워드만 처리하는 방식과 두 배의 속도를 내는 것의 차이점인데, 최근에 사용되는 에스디램은 대부분 디디알 에스디램(DDR SDRAM)이라고 보시면 됩니다. 에스디램이 하는 역할은 임베디드 시스템이 동작을 할 때 프로그램을 수행하며 주기적으로 변하는 데이타를 저장하거나 읽기를 하는 일이랍니다. 하지만 에스디램에 저장된 데이터는 전원을 OFF했다가 다시 ON했을 때는 저장된 데이터는 모두 사라진답니다. 즉, 저장된 데이타가 전원이 껐다 켰다 했을 때도 계속 해서 남아 있어야 한다면 노어 플래시 메모리나 낸드 플래시 메모리에 저장 시켜야 하죠.
어떤 임베디드 시스템이든지 우선적으로 파악해야 되는 것이 바로 에스디램의 주소맵 이랍니다.
시피유 데이타 시트를 보면 메모리 컨트롤러(Memroy Controller) 쪽 부분에서 대부분 아래와 같은 주소 맵이 나옵니다. 여기서 SDRAM이라고 되어 있는 부분이 바로 램의 시작 주소라고 보시면 됩니다. 그럼 아래의 그림에서는 램의 시작 주소가 어떻게 되나요?
0x3000 0000 이랍니다.

그런데 SDRAM이 두 군데가 있군요. 어떻게 이해를 해야 할까요?
먼저 SDRAM(CS6)와 SDRAM(CS7) 간의 주소 간격을 살펴보니 0x0800 0000만큼 차이가 나는군요. 즉, 램 최대 크기는 128MB이라는 의미이고, 만약 램 용량이128MB로 부족하다면 SDRAM(CS7)의 주소부터 시작해서 128MB까지 추가로 연결할 수가 있다는 의미가 되죠. 이제 메모리 맵을 이해하셨다면 소프트웨어적으로는 어떻게 이해를 해야 할까요?
씨 언어로 만든 프로그램이 동작하기 위해서는 반드시 스택 영역이 필요한데, 개발자가 스택 영역을 할당할 때 바로 에스디램의 주소 내에서 해야 하죠. 그렇지 않으면 씨 언어로 만든 프로그램은 동작되지 않으니깐요. 그리고 힙 영역도 마찬가지랍니다.
이제 그럼 회로도를 살펴보죠.

A라고 되어 있는 부분이 어드레스 선이고, DQ라고 되어 있는 부분이 데이터 선이랍니다. 이제 시피유와 에스디램을 연결하고 나면 에스디램이 Read와 Write가 잘 되는지 확인을 해 봐야겠죠?

하드웨어 디버거를 통해서 에스디램을 읽어 보아요.
시작 어드레스가 0x3000 0000이니 해당 어드레스를 열어보면 처음에는 비어 있어요.

___address____|________0________4________8________C_0123456789ABCDEF
SD:30000000|>00000000 00000000 00000000 00000000 ................
SD:30000010| 00000000 00000000 00000000 00000000 ................
SD:30000020| 00000000 00000000 00000000 00000000 ................
SD:30000030| 00000000 00000000 00000000 00000000 ................
SD:30000040| 00000000 00000000 00000000 00000000 ................
SD:30000050| 00000000 00000000 00000000 00000000 ................
SD:30000060| 00000000 00000000 00000000 00000000 ................

에스디램에 '12345678'이라는 값을 라이트(Write)해 보죠.
D.S SD:0x30000000--0x3000006F %LE %LONG 0x12345678

___address____|________0________4________8________C_0123456789ABCDEF
SD:30000000|>00000123 00000444 00000000 500A0D54 #...D.......T..P
SD:30000010| 00000000 00000000 0D343230 00000000 ........024.....
SD:30000020| 00000333 0D303030 0D0A0D0A 50203B0A 3...000......; P
SD:30000030| 00000555 00000003 00000000 00000000 U...............
SD:30000040| 00000000 00000121 00000000 00000233 ....!.......3...
SD:30000050| 0D0A0D53 00000121 00000022 00000000 S...!...".......
SD:30000060| 00000000 00002222 00000000 00000011 ....""..........

'0x12345678' 라는 값을 0x30000000--0x3000006F까지 분명히 라이트를 했는데 엉뚱한 값이 들어갔네요. 이상하죠? 왜 그를까요? 뭔가 빠진 게 있을까요? ㅎㅎ

시피유는 사람과 다르기 때문에 현재 사용중인 에스디램의 크기가 얼마인지 알 수가 없답니다. 그래서 시피유에게 에스디램 사이즈는 얼마인지, 시피유가 에스디램을 접근할 때 어떤 타이밍으로 접근을 하면 되는지 등 기본적 사항들을 알려 줘야 하는데 이러한 작업을 에스디램 초기화라고 해요. 그래서 개발자는 메모리 컨트롤러 설정을 반드시 하셔야 에스디램에 정상적으로 라이트가 가능해 집니다. 에스디램 사이즈가 커졌거나 사용중인 에스디램이 다른 종류의 에스디램으로 바꿨을 때는 반드시 메모리 컨트롤러 설정 값들도 바꿔줘야 합니다.
하드웨어 디버거로 메모리 컨트롤러 설정을 해 보아요. 메모리 컨트롤러는 시피유마다 다를 수 있으며 반드시 시피유 데이타 시트를 읽어보시고 설정해 주셔야 합니다.

d.s 0x48000000 %l 0x22115120 ;BWSCON
d.s 0x48000004 %l 0x00000700 ;BANKCON0
d.s 0x48000008 %l 0x00000700 ;BANKCON1
d.s 0x4800000C %l 0x00000700 ;BANKCON2
d.s 0x48000010 %l 0x00001F4C ;BANKCON3
d.s 0x48000014 %l 0x00000700 ;BANKCON4
d.s 0x48000018 %l 0x00000700 ;BANKCON5
d.s 0x4800001C %l 0x00018005 ;BANKCON6
d.s 0x48000020 %l 0x00018005 ;BANKCON7
d.s 0x48000024 %l 0x008E0459 ;REFRESH
d.s 0x48000028 %l 0x00000032 ;BANKSIZE
d.s 0x4800002C %l 0x00000030 ;MRSRB6
d.s 0x48000030 %l 0x00000030 ;MRSRB7

이제 메모리 컨트롤러 설정이 끝났으니 다시 라이트를 해 보아요.
D.S SD:0x30000000--0x3000006F %LE %LONG 0x12345678

___address____|________0________4________8________C_0123456789ABCDEF
SD:30000000|>12345678 12345678 12345678 12345678 xV4.xV4.xV4.xV4.
SD:30000010| 12345678 12345678 12345678 12345678 xV4.xV4.xV4.xV4.
SD:30000020| 12345678 12345678 12345678 12345678 xV4.xV4.xV4.xV4.
SD:30000030| 12345678 12345678 12345678 12345678 xV4.xV4.xV4.xV4.
SD:30000040| 12345678 12345678 12345678 12345678 xV4.xV4.xV4.xV4.
SD:30000050| 12345678 12345678 12345678 12345678 xV4.xV4.xV4.xV4.
SD:30000060| 12345678 12345678 12345678 12345678 xV4.xV4.xV4.xV4.

이제 정성적으로 라이트가 됐군요. ㅎㅎ
일반적으로 메모리 컨트롤러 설정은 씨 언어에서 프로그램 하지 않고 어셈블러 언어로 만든 스타트업 파일(Startup.s)에서 한답니다. 스타트업 파일에서 메모리 컨트롤러 설정하는 부분입니다. 스타업 파일에 대한 자세한 내용은 3장에서 다루도록 할께요.

Startup.s 예제 --------------------------------------------------------
___addr/line__|source

BWSCON EQU 0x48000000 ;Bus width & wait status

| ;Set memory control registers
311|________ldr_____r0,=SMRDATA
312| ldr r1,=BWSCON ;BWSCON Address
313| add r2, r0, #52 ;End address of SMRDATA
| 0
315| ldr r3, [r0], #4
316| str r3, [r1], #4
317| cmp r2, r0
318| bne %B0

SMRDATA
DCD 0x22115120 ;BWSCON
DCD 0x00000700 ;BANKCON0
DCD 0x00000700 ;BANKCON1
DCD 0x00000700 ;BANKCON2
DCD 0x00001F4C ;BANKCON3
DCD 0x00000700 ;BANKCON4
DCD 0x00000700 ;BANKCON5
DCD 0x00018005 ;BANKCON6
DCD 0x00018005 ;BANKCON7
DCD 0x008E0459 ;REFRESH
DCD 0x00000032 ;BANKSIZE
DCD 0x00000030 ;MRSRB6
DCD 0x00000030 ;MRSRB7

Linked at 친절한 임베디드 시스템 개발자.. at 2010/04/04 22:44

... 204 낸드플래시(NAND Flash)가 뭐죠? 205 에스디램 (SDRAM)이 뭐죠? 206 인터럽트(Interrupt)가 뭐죠? 207 제이텍( ... more

Commented by blue at 2010/04/07 23:30
깔끔하게 정리하셨네요.
잘 보고 있습니다.
Commented by soto at 2010/04/08 06:13
도움이 되셨나요? ㅎㅎ
Commented by guswn at 2010/04/07 23:39
SDRAM은 정말 신경써야 할 부분이군요?
Commented by soto at 2010/04/08 06:16
네..맞습니다.~~!
Commented by khan at 2010/04/08 14:13
회사 다니시면서 이런 건 또 언제 하세요?
놀랍습니다.
Commented by soto at 2010/04/09 06:30
다른 사람들 보다 조금 일찍 일어나고 조금 늦게 자죠. 후후..
Commented by star at 2010/04/09 22:44
더블이면... 양면인가요?
Commented by soto at 2010/04/10 07:15
네..맞습니다. 맞고요...ㅎㅎ
Commented by 스뎅님 at 2010/04/18 11:34
양면? SDRAM은 한 클럭당 데이터 한 번이던게 DDR은 한 클럭에 데이터 두 번으로 늘어난 겁니다. 그래서 Double Rate 인것이죠..
Commented by 히언 at 2010/04/18 14:02
그렇죠. 왜 두번으로 늘어났느냐! 하면 원래는 rising이나 falling edge에 한번씩만 가져왔는데, DDR은 rising과 falling에 각각 한번씩 하니까 두배가 된거죠.
※ 이 포스트는 더 이상 덧글을 남길 수 없습니다.
친절한 임베디드 시스템 개발자 되기 강좌 글 전체 리스트 (링크) -



댓글





친절한 임베디드 개발자 되기 강좌 글 전체 리스트 (링크) -