자료 저장소

# RAM의 구성과 동작

RAM이란 Random-Acces Memory의 약자로, 뜻을 풀어 쓰면 임의로 접근하는 기억장치라는 의미이다.
실제 마이컴 회로에 사용되는 RAM인 6264라는 이름의 IC에 대해 알아보자.

■ 핀의 구성

■  I/O 핀
6264는 I/0핀이 총 8개가 있다. 이것은 이 메모리 칩이 8비트씩 처리하는 것이라는 의미이며, 이 8개의 핀을 통해
데이터를 쓰고 읽을 수 있다.
또한 6264에는 A0~A12로 13개의 어드레스 핀이 존재한다. 어드레스 핀이 13개 있다는 것은 2진수로 표현할때
0~1111111111111, 10진수로 0~8191번지까지 액세스가 가능하다는 것이며, 총 8192개의 번지를 가진다는 의미다.

■  Vcc 핀
Vcc 핀은 5V의 전압으로 이 칩의 전원을 공급하는 통로이며, Vss 핀은 회로의 그라운드에 연결된다.

■  /CS1과 CS2핀
/CS1과 CS2는 Chip Select 의 약자로, 이 칩이 선택되었음을 의미한다. 6264는 /CS1이 0(0V) 그리고 CS2가 1(5V)
가 되었을 때 동작한다. 이런 상태가 되어있지 않으면 I/O 핀에서 데이터를 읽을 수도 쓸 수도 없게 된다.

■  /OE 핀
/OE는 Output Enable의 줄임말로 출력을 가능하게 한다는 뜻이다. 이 핀의 값이 0이 되었을 때 I/O 핀의 각 비트에는
A0~A12로 선택한 주소의 방에 있는 각 비트가 0, 혹은 1로 표시된다.

■  /WE 핀
/WE 핀은 Write Enable의 줄림말로 A0~A12로 선택한 주소의 방에 I/O 핀에 가해진 값 0(0V), 혹은 1(5V)을 그대로
Write 한다.

■  N/C 핀
N/C핀은 Not Connection의 줄임말이며, 이 핀은 사용하지 않는다는 것이다.


# 데이터를 Read/Write 하는 방법

■ 데이터 읽어오기

칩 내부에 2000번지 데이터를 읽을려면 일단 /CS1과 CS2 핀에 적절한 값을 주어 이 칩이 동작하도록 해야 한다.
/CS1과 CS2핀을 NOT 게이트로 묶어서 콘트롤하면 한개의 신호로 칩이 선택되도록, 혹은 선택되지 않도록 할 수
있다. 또한 CS2를 5V로 고정시켜 1의 값을 유지시키고, /CS1을 0으로 하여 칩을 선택하거나, 1로 하여 선택이
안되게 하는 동작을 시킬 수도 있다.

그리고 10진수 '2000'은 2진수 '11111010000'이므로 어드레스 핀을 이 값에 맞춘다.

A0
A1
A2
A3
A4
A5
A6
A7
A8
A9
A10
A11
A12
0 0 0 0 1 0 1 1 1 1 1 0 0


어드레스 핀 중에서 A0이 가장 작은 자리수 이며, A12가 가장 큰 자리수를 나타낸다.
여기에 맞추어 액세스 하고 싶은 번지를 2진수로 하여 0(0V)과 1(5V)의 값을 주면 된다.

그후 /OE 핀에 0의 값을 주면 I/O0 ~ I/O7의 핀에 8비트의 값이 출력된다. 만약 /OE 핀을 1로 한다면 CS핀과
어드레스 핀의 값에 관계없이 I/O 핀은 모두 출력되지 않는 하이임피던스 상태가 될 것이다. 그러므로 값을
읽기 위해서는 /OE 핀에 0의 값을 주어야 한다.


■ 데이터 기록하기

RAM의 2000번지에 숫자 7이라는 데이터를 기록하려면 /CS1에 0을, CS2 핀에 1의 값을 넣어 칩을 선택하고
2000번지 선택을 위해 위와 같이 어드레스 핀(A0 ~ A12)에 2진수로 '1111010000'을 입력한다.
그리고 8개의 I/O핀(I/O0 ~ I/O7)에 7이란 값을 2진수로 '00000111'로 지정한다음 /WE 핀을 0V로 하여 0값을
주면 2000번지에 7이란 값이 입력된다. /WE 핀을 0V로 하면, 그 순간 어드레스 핀에 입력되어 있는 값으로
RAM 내부의 2000번지를 찾아 I/O 핀에 입력되어 있는 값을 그곳에 Write 하게 된다.


# RAM과 마이컴의 연결

6264 RAM IC를 마이컴이나 CPU에 어떤 방법으로 연결하는지 알아보자.

■ 한개의 RAM과 CPU의 연결

보편적인 CPU의 핀 구성에서 RAM의 A0~A12까지의 어드레스 핀은 CPU의 각 어드레스 핀에 연결되고,
데이터 핀도 마찬가지로 0~7까지의 CPU의 각 어드레스 핀에 연결된다.
CPU의 /RD 핀은 RAM의 /OE 핀에 연결되며, CPU의 /WR 핀은 RAM의 /WE 핀에 연결된다.


■ 데이터를 읽거나 쓸 때의 CPU 동작

RAM에서 데이터를 읽거나 혹은 RAM에 데이터를 쓰려고 할 때 먼저 어드레스 핀 A0~A12에 해당 어드레스 값을
2진수로 표현하게 되고 이때 어드레스 핀의 값은 High(5V) 또는 Low(0V)의 값으로 표현된다.

그리고 CPU는 /RD 핀 혹은 /WR 핀의 값을 Low 값으로 낮추고 D0~D7(I/O0~I/O7)핀에서 값을 읽거나, D0~D7
핀에 값을 표현하여 RAM에 쓰는 일을 한다.

예를 들어 CPU가 ROM에서 읽어들인 프로그램 혹은 ROM이나 다른 기억장치에서 RAM으로 가져온 프로그램을
수행하던 도중에 다음과 같은 명령 행을 만나게 되었을 경우

MOV  AL, [123]

순간적으로 위의 동작을 하게되며 AL 레지스터에 123번지에서 8비트 값을 가져다 넣게 될 것이다.

MOV  [123], 1
이라는 명령 행을 만나게 되었을 경우에도, 위와 같은 동작을 하게되며 123번지에 1이라는 값을 써넣게 될것이다.


■ 두 개 이상의 RAM과 CPU의 연결

먼저 두개 이상의 RAM을 CPU에 연결할 때 필요한 디코더에 대해 살펴보자.


위 그림은 74LS138이라는 디코더 IC이다.
이 디코더는 3개의 핀으로 8개의 핀을 제어한다.
예를 들어 LED를 점멸 시키려고 하는데 CPU에 3개의 핀이 있을 경우 이 핀 자체만 가지고는 3개의 LED밖에
조작하지 못할 것이다. 그러나 3개의 핀을 조합하여 더 많은 수의 LED를 조작할 수 있으면 좋을 것이다.
즉, IC에 있는 8개의 핀으로 크리스마스트리의 꼬마전구를 제어한다고 할 때, 직접 한개씩 접속하여 컨트롤
한다면 8개 밖에 제어할 수 없을 것이다. 이때 사용되는 것이 디코더이다.
 
표의 첫번 째 줄에는 각 핀의 이름이 나와있고 G2는 G2A와 G2B가 똑같이 움직이므로 통일되어 있다.
각 핀의 동작을 살펴보면, G1에 어떤 값이 오든지 G2가 H 값이면 Y0 ~ Y7 은 모두 H가 된다.
Y0 Y7은 L값이었을 때  1의 값을 가지므로 모두 H라는 것은 모두 0이라는 의미가 된다.
G1값이 L이면,G2에 어떤 값이 오든지 Y0 ~ Y7의 출력은 H가 된다. 이때도 Y0 ~Y7 은모 두0이 되는 것이다.

따라서 G1은 H값이었을 때, G2는 L값이었을 때 출력값이 제대로 나오게 되는 것이다.
G1=H, G2=L로 해놓은 상태에서 비로소 C,B,A의 입력이 출력에 영향을 줄 수 있게 되는데 C,B,A는 L 값이 0이고
H값이 1이 된다. C,B,A에는 2진수의 조합으로 000 ~ 111 까지, 10진수로 0~7까지의 값을 입력 받을 수 있는데,
C,B,A에 입력 받은 수는 각각 Y0 ~Y7 중에서 수에 해당하는 번호의 핀을 L(1의 값)로 만든다.

이렇게 여러 개의 핀의2진수 조합이 해당 핀 한개만을 활성화 시키는 것이 디코더의 개념이다.

 

① A0~A12 핀은 CPU와 2개의 RAM이 모두 같이 연결되어 있고 CPU와 6264(1), 그리고 6264(1)과 6264(2)가
함께 선을 공유 하고 있다. 이렇게 여러개의 선으로 여러 개의 부품을 같이 연결한 것을 버스(Bus)라고 한다.

D0~D7 핀의 배선은 그림이 복잡해지므로 생략 하였고, A0~A12 어드레스 핀처럼 두 RAM의 D0~D7 핀에 버스로
연결되어 있다고 가정하겠다. (A0~A12는 버스와는 별도로 데이터만 주고 받는 버스 이다)
A0~A12까지의 값은 CPU가 출력하는 값을 두개의 6264가 동시에 받게 된다.

② 74LS138의 G1은 VCC 연결되어 5V의 전압을 항상 받고, /G2A,/G2B는 그라운드에 묶여 있다.
이것은 이 74LS138이 전원이 들어온 후부터 계속 활성화되어 있다는 의미이며, 언제든 동작할 준비가 되어있다는
것이다.

③ CPU의 A13핀에 74LS138의 A에 연결되어 있으며, 74LS138의 Y0은 6264(1)의 /CS 핀에 연결되어 있고,
Y1은 6264(2)의 /CS 핀에 연결되어 있다. 즉, CPU의 A13이 0(Low)의 값이 되면 Y0이 L이 되므로 6264(1)이
선택되고, A13이 1(High)의 값이 되면 Y1이 L 이 되므로 6264(2)가 선택되는 것이다.

■ 두개의 RAM에서의 주소 범위

① 6264(1) RAM의 0번지를 액세스

MOV   AL, [0]   //  '메모리의 0번지에 있는 값을 읽어라'

이때 CPU는 A0~A15까지의 핀을 모두 0으로 만들고 A0~A12버스가 0을 나타내고, 이때 6264(1)과 6264(2)는 버스로
연결되어 있으므로 A0~A12를 통해 0이란 숫자를 동시에 받는다.
A13도 0이 되는데 74LS138의 A핀과 연결되어 있고, 74LS138의 B와 C는 그라운드와 연결되어 항상 0의 값을 묶어
놓았으므로 A,B,C는 0,0,0이 되어 Y0이 0값을 가진다.
Y0은 6264(1)의 /CS핀에 연결되어 이 RAM을 선택하게 되고 읽기 명령이므로 CPU의 /RD 핀이 0으로 되어 읽기
동작이 행해지는 것이다.
반면, 74LS138의 Y1은 1값을 가지므로 6264(2)의 /CS핀을 활성화 하지 못한다. 6264는 어드레스 핀이나 /RD핀 등이
아무리 활성화 되어 있어도 /CS핀이 활성화 되어 있지 않으면 데이터를 주지 않는다. 따라서 6264(1)만 데이터 버스로
데이터를 출력하고, 6264(2)는 출력하지 않는다.

즉, 0번지는 6264(1)의 첫번지를 가리키게 된다.

② 6264(1)의 제일 끝 번지에 액세스

MOV   AL, [0x1FFF]  // 2진수 01111111111111

이때 CPU는 A0~A12를 모두 1로 만들고, A13을 0으로 한다.
버스를 통해 두개의 RAM의 A0~A12는 모두 1을 받게되고 이것은 16진수로 0x1FFF라는 수를 받게 된다는 것이다.
A13핀은 0이고, 74LS138의 A핀을 통해 0을 전달하여 Y0을 0으로 만들고, Y1은 1로 만든다. 따라서 6264(1)은 선택이
되고, 6264(2)는 선택되지 않는다.
CPU의 /RD핀을 통해 두 RAM이 /RD 핀 모두 0을 받고, /WR핀은 모두 1을 받는데, /CS로 선택된 RAM은 6264(1)
뿐이므로, 6264(1)의 0x1FFF번지에 있는 데이터 값만이 출력된다.

③ 6262(2)의 맨 앞 번지 액세스

MOV   AL, [0x2000]// 2진수 10000000000000

A0~A12는 모두 0이고, A13은 1이 되는데 A13이 1이므로 74LS138의 A는 1, B와 C는 그라운드에 연결되어 있으므로
둘다 0이되고, A,B,C의 2진수 조합은 1이므로 Y1이 0이되고 Y0은 1이 된다.
따라서 Y1과 연결된 6264(2)의 /CS핀이 활성화 되면서 이 RAM이 선택되며, 6264(1)은 선택되지 않는다.
그리고 A0~A12는 0이므로 6264(2)의 맨 첫번째 번지에 있는 데이터 값이 출력된다.

④ 6264(2)의 마지막 번지를 액세스

MOV   AL, [0x3FFF]  // 2진수 11111111111111

A13이 1이므로 6264(2)가 선택되고 A0~A12가 1이므로 6264(2)의 가장 마지막 번지를 읽게 된다.


■ 회로에 존재하는 모든 메모리 용량 (메모리 맵)

위 그림에 존재하는 모든 메모리의 용량을 나열하면 다음과 같다.
6264(1)은 0x0000에서 시작하여 0x1FFF로 끝난다. (10진수 -> 0 8191)
6264(2)는 0x2000에서 시작하여 0x3FFF로 끝난다 (10진수 -> 8192 ~ 16383)
6264(1)과 6264(2)는 모두 0~8191(0x0000 ~0x1FFF)로 8192만큼 번지를 가지고 있지만, 위 회로에서는
74LS138 디코더로 조합하여 두 개가 연달아 붙어 있도록 한 것이다.

댓글 로드 중…

최근에 게시된 글