본문 바로가기

Hacked Brain/embeddedland.net

I. Controller가 뭐죠?

http:/www.roboblock.co.kr

1. Controller가 뭐죠?

2. Memory와 IO

(1) Memory, IO 란?

Memory란 단시간 또는 장시간 기억할 수 있는 소자를 말하는데, 크게 ROM과 RAM으로 나뉜다. RAM은 Random Access Memory를 말하는데, 휘발성을 가지고 있어서 전원이 꺼지면 내용이 없어진다는 것을 잘 알 것이다. 이 RAM은 크게 SRAM(Static RAM)과 DRAM(Dynamic RAM)의 두 가지로 분류되는데, 우리는 Control이 쉬운 SRAM부터 다루게 될 것이다. 또 ROM은 기능에 따라 여러 가지가 있다. 흔히 접할 수 있는 것으로는 PROM(Programmable ROM, 한번만 쓸 수 있다.), EPROM(Erasable PRAM, 지우고 다시 쓸 수 있다.)이 있는데, EPROM에는 UVEPROM(Ultraviolet, 자외선으로 지울 수 있는 EPROM)과 EEPROM(Electrically EPROM)과 Flash ROM이 있다. EEPROM과 Flash ROM은 모두 전기적으로 지울 수가 있지만, EEPROM은 메모리 cell한 개 단위로 지우고 쓸 수가 있으나 Flash ROM은 block단위의 삭제 및 쓰기가 가능하다는 것이 다르다. 값은 EEPROM이 Flash ROM보다 비싸다. 보통 휴대용 MP3 player에는 값 싼 Flash ROM이 사용된다. 또 요즘의 main board는 BIOS가 Flash나 EEPROM으로 되어 있어서 사용사가 높은 version의 BIOS로 다시 programming할 수 있도록 되어있다.

IO는 위의 Memory와 거의 비슷한 성격을 가지고 있다. 사실 Memory도 일종의 IO라고 할 수 있다. 그러나 그 기능이 data의 기억장소나 프로그램의 위치로 사용된다는 점이 다른 것이다. 보통 PC에서 말하는 IO는 비디오 카드, 사운드 카드나 혹은 각종 port, keyboard, mouse 등의 입/출력 장치가 될 것이다. 이들 역시 memory와 마찬가지로 특정한 address와 IRQ, DMA가 할당되어 있다. mouse나 soccer robot에서는 motor나 sensor가 IO에 해당할 것이다.

(2) CPU의 memory 관리

System에서 memory는 특정한 address로 할당되어 있게 된다. 이는 CPU가 memory를 관리하기 위한 방법이다. 하나 하나의 memory cell은 각각의 address를 가지고 있다. CPU는 이를 access(Read or Write)하기 위해서 address BUS에 그 주소를 내보내고 data BUS를 통해서 data를 읽거나 쓸 수가 있다. IO 역시 memory와 마찬가지로 각각의 address를 할당받게 된다. 이와 같은 방법에서는 CPU가 관리할 수 있는 memory의 양이 제한되어 있는데, 이는 address BUS의 폭에 따라 결정된다. 예를 들어 16bit address bus를 가진 CPU는 2=64k 개의 memory 영역을 가질 수 있다. 만약 이 CPU가 기본적으로 8bit data BUS를 가진다면, 총 64kbyte의 memory를 관리할 수 있다.

또 memory를 관리하는 방법에는 segment address를 사용하는 방법이 있다. 즉, 메모리를 작은 부분으로 다시 나누어 쓰는 방법이다. 이 경우 다음과 같이 address를 표현한다.

0040:0FF4 0040은 segment, 0FF4는 offset

CPU는 이 둘을 이용해 실제적인 address를 만들어 낸다. 이런 방식을 segmented addressing 이라고 하고, 그냥 실제 주소를 사용하는 경우를 liniear addressing이라고 한다. x86계열은 segmented addressing을 사용한다. 그러나 대부분의 controller들은 사용할 수 있는 memeory한 크지 않으므로 linear addressing을 많이 사용한다.

(3) Address mapping, decoding

위에서 설명한 것처럼 특정 영역에 memory나 IO를 할당하는 것을 memory mapping, IO mapping 혹은 모두를 address mapping이라고 한다. 또 CPU에 따라서 memory와 IO를 구분하여 사용하는 것이 있고, memory와 IO의 구분이 없는 경우가 있는데, 전자의 경우를 memory mapped IO, 후자의 경우를 IO mapped IO 방식이라고 하는데, 이 경우는 memory와 IO의 영역이 독립되어 있게 된다. 다음 그림은 이 두 방식의 address map을 나타낸 것이다.

                               

                      그림1 memory mapped IO와 IO mapped IO의 address space

3 bus architecture system에서 memory나 IO에 접근하기 위해서는 이에 필요한 control signal이 필요한데, 보통 RD#, WR# 신호가 있다. RD#은 low active signal로 data를 읽기 위한 신호이고, WR#는 low active signal로 data를 쓰기 위한 신호이다. memory mapped IO에서는 MRD#, MWR#, IOR#, IOW# 혹은 RD#, WR#, IO/M의 신호가 필요하다.

                                 

                                            그림 2 두 경우의 control signal

 한편 memory를 사용함에 있어서 특정 영역을 특정 용도로 사용하도록 mapping을 하게 되는데, 이 과정을 address decoding이라고 한다. 또 이렇게 decoding 혹은 mapping된 각 영역을 나타낸 것을 address 혹은 IO map이라고 한다. 예를 들어 PC(AT)의 address map과 IO map은 다음과 같다.

interrupt vector table

0

BIOS data 영역

1K

MS-DOS program

device driver



 

Application program



 

ROM 영역

(ROM BIOS, video, etc)

640K

1M

DMA controller(8237A-5)

000-01F

Interrupt controller(8259A)

020-03F

Timer

040-05F

Keyboard(8042)

060-06F

Realtime clock(MC146818)

070-07F

DMA page resister

080-09F

Interrupt controller2(8259A)

0A0-0BF

DMA controller2(8237A-5)

0C0-0DF

Math Coprocessor

0F0-0F1

Math Coprocessor

0F8-0FF

Hard disk controller

1F0-1F8

Game port

200-207

Interface for 2nd parallel printer

278-27F

2nd serial interface

2F8-2FF

Prototype card

300-31F

Network card

360-36F

Interface for 1st parallel printer

378-37F

Monochrome Display Adapter

and parallel printer connection

3B0-3BF

Color/Graphics Adapter

3D0-3DF

Disk controller

3F0-3F7

1st serial interface

3F8-3FF


16 bit adderss BUS(A0~A15)의 경우 address decoding의 예를 들어보면 다음과 같다.

우리가 원하는 memory map은 다음과 같다.

용도

address(HEX)

address (Bin)

size

ROM

0000-7FFF

0000 0000 0000 0000 - 0111 1111 1111 1111

32k

RAM1

8000-BFFF

1000 0000 0000 0000 - 1011 1111 1111 1111

16k

RAM2

C000-DFFF

1100 0000 0000 0000 - 1101 1111 1111 1111

8k

IO

E000-FFFF

1110 0000 0000 0000 - 1111 1111 1111 1111

8k

여기서 binary로 표현된 address를 보면, 상위 3bit으로 address를 decoding 할 수 있음을 알 수 있다.

따라서 여기에서 각각의 select 신호는 다음 식에 의해서 만들어질 수 있다.

ROM#    = A15

RAM1#   = A15' + A14

RAM2#   = A15' + A14' + A13

IO#     = A15' + A16' + A17'

또 이를 간단히 구현해보면 다음과 같다.

                               

                                              그림 3 Address decoder

참고> 74138의 Truth table

   

A

B

C

G1

G2

Y0

Y1

Y2

Y3

Y4

Y5

Y6

Y7

X

X

X

L

X

H

H

H

H

H

H

H

H

X

X

X

X

H

H

H

H

H

H

H

H

H

L

L

L

H

L

L

H

H

H

H

H

H

H

L

L

H

H

L

H

L

H

H

H

H

H

H

L

H

L

H

L

H

H

L

H

H

H

H

H

L

H

H

H

L

H

H

H

L

H

H

H

H

H

L

L

H

L

H

H

H

H

L

H

H

H

H

L

H

H

L

H

H

H

H

H

L

H

H

H

H

L

H

L

H

H

H

H

H

H

L

H

H

H

H

H

L

H

H

H

H

H

H

H

L


(4) Address / Data Bus Multiplexing, non-DMA cycle System BUS timing

CPU가 외부 memory를 access하기 위해서는 우선 Address BUS와 Data BUS가 필요하다. 그런데 CPU가 관리할 수 있는 memory가 커지면 address BUS 폭도 늘어날 것이다. 이런 이유로 많은 controller들은(intel 계열) Address BUS와 Data BUS가 multiplex되어 있다. 196의 경우, 196은 16 bit data를 사용하므로, Address BUS 16bit와 Data BUS 16bit가 필요하므로, 여기에 총 32 개의 외부 pin이 있어야한다. 따라서 chip의 크기가 커지므로, 이를 multiplex하여 16bit만을 사용하고, 시간을 분할하고 특별한 신호를 만들어서 Address와 Data를 구별하도록 한다. 이렇게 하면 chip의 크기를 줄일 수가 있다. 보통 이런 CPU에서는 ALE(Address Latch Enable)이라는 신호를 따로 두어서 ALE=1이면 Address 출력, ALE=0이면 Data 입출력을 하게 된다. (같은 BUS를 사용하여) 이 때문에, 이러한 CPU에는 외부에 별도의 Address Latch가 필요하다. Address를 Holding하고 있어야 하기 때문이다. (Address, Data 분리) 다음은 이 경우의 BUS구조와 Latch 사용의 예이다.

                                 

                                    그림 4 Address/ data BUS의 multiplexing

또 이 때의 Read/Write timing은 다음과 같다. (non DMA cycle)

                               

                                                      그림 5 Read Cycle

                               

                                                      그림 6 Write cycle