본문 바로가기
Bus Sizer Register와 Memory Controller - 메모리 확장구성과 CS와의 관계

MCU가 자신 이외의 외부 장치와 통신을 한다거나, control을 하는 것은 어떻게 이루어 질까요. 기본적으로 우리 메모리 시스템이 어떻게 구성되는지 살펴 보는 게 좋을 것 같습니다.
일단 기본적인 메모리 시스템의 구조 MCU내부에 CPU core가 있고, 이를 위한 Memory controller라고 보시면 될 것 같고요, Memory Controller를 통해서 외부의 Memory를 Access하고 Read/ Write할 수 있어요.

Core에서는 Memory를 control하기 위하여 발생시킬 수 있는 신호가 몇 가지 있는데, 그 신호들은..
A[31:0] : 32 bit짜리 Address
D[31:0] : 당연히 32bit ARM core등에서는 32bit Data가 필요하겠죠.

nRD : OE에 관계된 Read하겠다는 신호
nWR : 마찬가지로 Write하겠다는 신호.
nWait : 외부 메모리가 Processor보다 느릴 경우, "프로세서야~ 기다려라" 하는 신호죠.

RD와 WR에 왜 n이 붙어 있느냐! 그건 차차 보기로 하고요, 일단은 A, D, RD, WR, Wait만 신경 써 주세요. 여하튼 이렇게 구성된 System은 한번에 16bit Data를 Access 할 수 있고요, Address의 경우 Core는 4GB를 만들어 낼 수 있고요, (2^32이니까요)


이때 실제 Memory는 64MB짜리가 달려 있다면, (Data는 8bit짜리) Address line은 26개, Data line은 8개로 바꿔주는 회로가 필요하겠죠. 그것이 바로 Memory Controller인 셈 입니다.
(64MB = 2^26)


자, 이런 얘길 왜 꺼내느냐 하면, Memory가 64MB만 필요할 때도 있고, 더 많이 필요해서 128MB가 필요할 때도 있겠죠. 그러면 가장 쉽게 Memory Controller를 잘 control해서 128MB짜리 외부 메모리를 붙일 수 있도록 외부로 나오는 Address line의 수를 잘 조절하면 되겠죠. 그 경우에는 A[26:0]이 될 수 있도록 Memory Controller를 잘 조절 하면 되겠습니다. 2^27=128MB죠. 이럴 때 사용되는 게 Bus Sizer Register에요. 보통 MCU들에는 이런 Bus Sizer Register들이 있어서, Memory Controller의 configuration을 해 줄 수 있답니다.


그런데, Bus Sizer를 잘 조절하고 128MB짜리 Memory를 올리고 싶은데, 시중에 파는 게 64MB밖에 없더라, 그럼 어떻게 해야 할까요. 64MB짜리 두 개를 달아야죠. 별 수 있나요. 그럴 때 쓰는 좋은 방법이 있어요. 뭐냐. 하면. 0~64MB까지는 A[25:0] 주소로 충분하죠. 이때, 오호 64MB~128MB까지는? A[26]만 1로 바뀌고 다시 A[25:0]의 주소가 재 사용 가능합니다.

그러니까,
0~64MB까지는 0x0000000 ~ 0x0FFFFFF
64MB~128MB까지는 0x1000000 ~ 0x1FFFFFF
요렇게 되어 있죠.

오호라, 그러면
첫 번째 64MB memory는 A[26]=0, A[25:0]은 Access하고자 하는 주소
두 번째 64MB memory는 A[26]=1, A[25:0]은 Access하고자 하는 주소의 형태로 해주면

첫 번째 Memory는 0~64MB, 두 번째 Memory는 64MB~128MB의 메모리로 사용할 수 있겠구나 하는 결론이 납니다.

요렇게 하니까 어때요! Controller의 A[26]을 사용 가능하게 하고, A[26]을 각각의 Memory의 CS에다가 Connection하는 거에요. 우리가 원하는 대로 연속된 주소의 128MB를 64MB 두 의 Memory를 이용해서 사용할 수 있겠지요. 그런데, 보통 이렇게 Bust sizer Register를 준비해 주시는 친절한 MCU가 있는가 하면, 그렇지 않은 MCU들도 많이 있어요. 그러다 보니, Address 공간을 내 마음대로 있는 녀석도 있고, 없는 녀석도 있는 게죠. 다행히 예의 System에서 A[26]까지 원래 Access가능하도록 ASIC되어 있는 MCU라면 이런 식으로 회로를 꾸밀 수도 있는데 아니라면 못 꾸미죠. 보통 이런 식의 불친절한 MCU들은 자신들의 Memory Map을 제공하는데요, Address에 따라서 CS를 어떻게 Assign했는지를 Data sheet에 제공합니다요.

Memory map의 예를 하나 들면,

삼성의 어느 ARM을 base로 한 MCU의 Address Map의 예인데요, Chip을 보면 Address 공간들이 나와 있고, 그 Address를 Access하면 어떤 주변 장치에 Access되는지가 나와 있지요. 이 의미는 각 Address 공간에 대하여 어떤 CS가 활성화 되느냐를 나타낸 건데요, 예를 들면, 0x40000000을 Access하면 Memory Port1으로서 DDR/SDRAM Bank0의 CS가 활성화 된다는 것을 의미해요. MCU 외부로는 각 Device들에 대한 CS들이 pin으로 뽑혀 있을 테고요.

자 맨 처음에 nCS, nWE, nOE에서 n이라는 의미는 CS, WE, OE가 Memory Controller내부에 여러 개 있을 수 있다는 걸 의미 한다는 사실이지요. 게다가 Memory Map을 보니까, 한가지 종류의 Memory만 있는 게 아니고, 여러 종류의 Memory들이 엮여 있네요. 그러다 보니 Memory Controller도 Address와 Data line이외에 각각의 Memory에 맞는 control 신호가 더 필요할 텐데요, 이런 여러 종류의 Memory를 control할 수 있도록 제어 신호도 한꺼번에 Memory controller내부에 구현되어 들어가는데요, 그런 제어 신호들도 Access하는 주소에 따라 달라지겠죠. 이런 여러 종류의 Memory를 한꺼번에 지원할 수 있도록 만든 Memory Controller를 다른 말로는 EBI (External Bus Interface)라고 불러요. 자자, 이제 감 좀 오십니까?

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



댓글





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