본문 바로가기

Hacked Brain/embeddedland.net

80c196kc - (1) 회로도 보고 메모리 파악하기

1.회로도 보고 메모리 파악하기

마이크로컨트롤러회로의 기본구성은 CPU+롬+램+발진+리셋회로이며 그외에 전원부 + 통신부가 있을 수 있다.


아래 회로는 인터넷에서 흔히 접해볼수 있는 아주 기본적인 회로인데 이것으로 메모리와 매칭시켜보자.

우선 나와있는 소자만 봐도 메모리맵을 머리속으로 그릴수 있어야한다.

어떻게 그리냐구?



29C256  --->256Kbit  = 32KB


62256   --->256Kbit = 32KB

196이 가질수 있는 최대 메모리 크기는 64K라고 했다. 이것을 롬,램이 사이좋게 각각 32K씩 나누어썼다는 것을 알수 있다.

그 다음 단계...............32KB를 hexa로 바꾸면 32*1024byte = 32768 =8000H이며

결국 롬은 0000~7FFFH 램은 8000~FFFFH를 차지한다.

      80c196kc 내부램의 메모리 맵

FFFF

   

    램(32K)

  64K

8000

7FFF

   롬(32K)

0000


요것을 표로 그려보면 다음과 같다.

 

A15

A14

A13

A12

A11

A10

A9

A8

A7

A6

A5

A4

A3

A2

A1

A0

deviec

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

ROM

0

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

RAM

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1


CPU의 어드레스는 롬과 램에 공통적으로 연결되어있는데 이 둘을 어떻게 구분할것인가?

32KB는 어드레스 선이 15개이면 된다. 위의 표를 보면 A15가 0이면 롬이고 1이면 램이라는 것을 금방  알수 있다.

즉 인버터로 간단하게 chip select가 되는 것이다.

--->A15를 ROM,RAM의 cs 단자로 연결

(이 과정을 용어를 쓰자면 어드레스 디코딩이라고 한다.

하나의 디바이스를 읽고 쓰기위해 메모리내에서 번지를 설정하고 또 필요한 하드웨어적인 설계를 하는 작업말이다.

디바이스란 외부 메모리뿐만아니라 LCD,모터,포트확장칩 등 여러 가지가 있겠다.)


지금은 선택할 디바이스가 두 개밖에 없지만 더 많을 경우 디코더를 써도 된다.

그것도 귀찮다싶을땐 PLD,GAL,PAL이라는 것을 씀.

(어드레스 디코딩을 하드웨어적으로 구성하는게 아니라 소프트웨어로 하는것임.)


이와 같이 외부 입출력 장치(8255,LCD등등)를 붙일때도 메모리의 한 부분을 차지하게 만들면 되는데 이러한

방식을 Memory Mapped I/O방식이라고한다.


MCU관련 책을 보면 프로그램 메모리 혹은 데이터 메모리라는 말이 많이 나오는데 이것들은 다음과 같이 생각하면 된다.

프로그램 메모리  - 롬(Only Read)

데이터 메모리 - 램(Read/Write가능)

이것외에 LCD,LED같은 디바이스도 데이터 메모리로 보면 된다. 이것역시 읽고 쓰는 것이 가능하기 때문에 같은 속성으로 보는 것이다.


래치 74HC573

'latch'란 물고 늘어지다,빗장이란 뜻을 가지고 있는 낱말이다.

빗장 하니까 이탈리아의  빗장수비가 생각난다.^^

그러니까 2002년 6월 18일 우리의 태극전사는 그 빗장수비를뚫고 월드컵 8강에 진출했다. 냐하하..

그때의 기쁨을 가라앉히고....

우리는 이미 래치의 역할을 디지털 공학에서 배웠을것이다.

CPU가 외부에 신호를 출력하는 시간이 매우 짧으므로 계속에서 출력상태를 유지하기 위해 사용하는 것이 래치이다.

새로운 값을 받으라는 신호가 주어지지 않는한 입력 값이 변하더라도 출력 값은 변하지 않는 것...

잘 모르겠드면 아래를 눌러보라. 자세히 잘 나와있다.

플립플롭과 래치

D 래치 회로


그렇다면 왜???? 74HC573이라는 래치소자가 거기 떡 하니 버티고 데이터를 유지하고자 힘을 쓰고 있을까

이 소자를 중심으로 롬과 램을 잘 살펴보라.

AD8~AD14(포트4)는 롬 and 램의 AD8~AD14와 다이렉트로 연결되어있는데 AD0~AD7(포트3)은 74HC573이라는 소자를 거쳐서 연결되어있다.

그리고 롬,램의 data in/out 핀인 O1~O7도 CPU의 AD0~AD7(포트3)에 연결되어있다.

즉 어드레스와 데이터가 하나의 핀에서 동시에 나오고 있는 것이다.(멀티 플렉서 방식이라고 함)


왜 이렇게 했을까....

이유인즉슨 ,,,,메모리 용량이 커지고, 속도가 빨라지면서 어드레스 버스와 데이터버스도 많아지는데 이렇게 나가다보면 칩이 너무 커지게 된다. 그래서 이 두 버스를 한 핀에서 책임지게끔 설계하다보니 위와 같이 되버린것이다.(내가 한건 아니고...^^)


그러나........... 크기가 작아지는건 좋지만 어드레스 신호와 데이터 신호가 들락거리는 속도가 워낙에 빨라서 신호를 놓칠수도 있는 것이 문제이다.

생각해보라. 어드레스신호를 띄워놨는데 바로 쪼금뒤  데이터신호가 나오면 불쌍한 어드레스는 써먹기도 전에 없어질것아닌가...

그러므로 우린 그 신호를 잠시 붙잡고 있어야한다~~~ 라는 결론이 나온다.

아래  data sheet로 소자의 내부 그림을 보자.

                                   

11번 핀이 latch enable로서 이것이 active(high) 되어야 신호를 붙잡을수 있고 이 선을 쭈욱 따라가보면 CPU의 ALE 핀에 연결되어있다.

즉 어드레스가 나올 때 이 핀이 active되기 때문에 어드레스가 잠시(다음 ALE가 high일때까지) 붙잡히게되어있다.

참고로 574(D FlipFlop)는 LE 대신 Clock이 있으며 이것이 상승에지일때만 출력 D -> Q가 나온다.

573(D 래치)은 LE이 High level 일때 출력을 잡아둔다.

◆래치와 FF의 차이  

 요기서 한가지 의문점이 생긴다. 8개의 신호는 래치를 거쳐서 메모리 소자에 연결되어있는데 이것이 시간 delay가 되지는 않을 까?그러나 알아보니까 내가 신경쓸 정도는 아니라고 한다.^^

 단 래치와 비슷하게 데이터를 저장하는 소자 FF은 그렇지 않은데  요넘은 1clock주기만큼 어드레스 버스값이 지연되어

 출력된다고 한다. 그렇게되면 외부에 접속하는 소자들이 access하는 시간적 여유가 줄어드는 것이다.

 또한 , 한 예로 HC574와 같은 D형 FF은 Positive edge Trigger 방식이기 때문에 ALE를 반전시켜야하는 번거로움도 있다.


결론은 입력 데이터가 들어가 출력신호를 내기 시작하는 시점은 FF보다 래치가 더 빠르므로 래치와 FF를 활용하는데 있어

잘 알아두자.


 2.리셋 회로 분석

리셋 신호는 CPU 및 다른 소자들을 초기화 시키는데 사용하는 신호로서 매우 중요하다.

리셋은 전원을 처음 넣었을때 자동리셋(Power On Reset)이 되어야하며

스위치를 눌렀을때 수동리셋이 되게끔 회로를 구성해야한다. 


Power On Reset

RC 충전회로가 그 역할을 한다.

전원을 인가하면 CPU의 reset핀에는 0이 입력되어 리셋동작에 들어가게된다.

적어도 1 state 동안은 reset 핀이 0을 유지하고 있어야 CPU가 리셋명령을 수행한다.

그러므로 저항 R을 통하여 C에 전압이 충전되는 리셋 시간(R×C를 시정수라고 하며 전압의 상승 및 하강 속도를 결정한다.)을  길게 만들어 충분한 시간동안 신호가 L상태가 되도록 해주어야한다.


그후 커패시터의 충전작용으로 전압은 서서히 올라가고(지수적으로 증가하는 모양을 가짐) high가 되면 리셋이 풀리게되고

다음과 같은 일을 하게된다.

2018H에서 CCB(Chip Configuration Byte)의 값을 읽어서 CCR(Chip Configuration Register)에 기록한다. 그리고나서 2080H부터 첫 번째 명령을 수행하게되됨.


②리셋 스위치에 의한 수동 리셋

스위치를 누르면 콘덴서에 충전되어있던 전압이 방전되고 reset 핀에는 다시 0이 인가된다.

그리고 위의 과정이 역시 반복되는것이다.


※다이오드가 필요한 이유는?

전원을 끄면 전압이 방전되는데 이때도 역시 시정수 RC에 따라 시간이 다소 걸린다

그런데 만약 이 충전전압이 모두 방전되기도 전에 다시 전원을 켜면? 리셋이 먹지 않게 되는것이다.

그래서 다이오드를 달고 충전시에는 RC 직렬회로이지만 전원이 꺼져서 방전될 때에는 다이오드쪽으로 전류가 흘러 R=0이 되어 아주 빨리 방전을 하게끔 만드는 것이다.