본문 바로가기

메모리 칩의 폭·뱅크·선택 신호

데이터 폭과 주소 수를 따로 확장하고 바이트 주소를 칩 주소·뱅크·lane으로 분해합니다.

4K×8 칩 네 개를 연결한다고 곧바로 16K×8이 되는 것은 아닙니다. 두 칩을 같은 주소로 함께 선택하면 저장 위치 수는 그대로이고 한 위치의 데이터 폭만 늘어납니다. 다른 주소 영역을 맡기면 위치 수가 늘어납니다. 주소와 용량, 주기억장치, 디코더를 연결해 봅니다.

먼저 주소 단위를 고정하기

이 절의 칩은 4,096위치×위치당 8비트, 칩 내부 논리 주소는 A0–A11의 12비트입니다. 두 칩을 묶어 한 번에 읽는 16비트 값은 워드라고 부릅니다. 이 이름은 여기서 정한 2바이트 단위이며 모든 CPU의 워드 크기가 16비트라는 뜻이 아닙니다. K는 1,024, KiB는 1,024바이트입니다.

두 칩의 A0–A11을 같은 주소에 연결하고 둘을 동시에 선택합니다. 낮은 바이트 담당 칩은 D0–D7, 높은 바이트 담당 칩은 D8–D15에 연결합니다. 서로 다른 데이터 비트 묶음을 lane이라고 부릅니다. 두 칩이 같은 D0–D7을 동시에 구동하는 연결은 아닙니다.

구성구별하는 워드 위치한 워드의 폭데이터 용량
칩 하나4,0968비트4 KiB
두 칩, 폭 병렬 확장4,09616비트8 KiB
그 묶음 두 개, 뱅크 확장8,19216비트16 KiB

상위 주소로 어느 뱅크를 쓸지 정하기

위 2칩 묶음을 뱅크 하나로 정의하고 뱅크 0·1을 둡니다. 이것은 교육용 SRAM 묶음이며 현대 DRAM 내부 뱅크와 같은 구현이라는 뜻은 아닙니다. 전체 워드 주소 A는 0–8,191이므로 13비트입니다. 하위 A0–A11은 네 칩의 내부 주소에 함께 연결하고, 상위 A12는 뱅크를 고릅니다.

chip select는 칩이 해당 접근에 참여하도록 고르는 신호입니다. 이 논리 예제에서는 1이 선택을 뜻하는 CE0·CE1을 사용합니다. 메모리 영역 전체의 활성 신호 E가 1일 때 CE0 = E AND NOT A12, CE1 = E AND A12입니다. E=0이면 둘 다 0입니다. 한 주소에서 두 뱅크를 동시에 선택하지 않습니다.

EA12CE0CE1선택된 두 칩
00 또는 100없음
1010뱅크 0의 낮은·높은 바이트 칩
1101뱅크 1의 낮은·높은 바이트 칩
전체 워드 주소뱅크칩 내부 주소CPU 바이트 주소 영역
0–4,095 (0x0000–0x0FFF)00–4,0950–8,191 (0x0000–0x1FFF)
4,096–8,191 (0x1000–0x1FFF)10–4,0958,192–16,383 (0x2000–0x3FFF)

컴퓨터구조 · 논리 연결

주소 상위 비트로 두 뱅크를 선택합니다

E=1인 영역에서 A12=0이면 CE0, A12=1이면 CE1을 선택합니다. 각 뱅크의 두 8비트 칩은 16비트 워드를 함께 구성합니다.

주소 상위 비트로 두 뱅크를 선택합니다E와 워드 주소 A12로 뱅크 0 또는 1을 선택하며 각 뱅크는 같은 내부 주소를 받는 낮은·높은 8비트 칩으로 16비트 워드를 구성합니다.A12CE0CE1워드 주소 AA12 + A0~A11뱅크 선택E·A12 → CE0/CE1뱅크 0 · CE0낮은/높은 8비트 칩워드 주소 0~4095뱅크 1 · CE1낮은/높은 8비트 칩워드 주소 4096~8191CE0/CE1: 1이면 해당 뱅크의 두 칩 선택두 칩은 같은 내부 주소, 서로 다른 데이터 lane을 사용합니다
주소 상위 비트로 두 뱅크를 선택합니다E와 워드 주소 A12로 뱅크 0 또는 1을 선택하며 각 뱅크는 같은 내부 주소를 받는 낮은·높은 8비트 칩으로 16비트 워드를 구성합니다.CE0CE1워드 주소 AA12 + A0~A11뱅크 선택E·A12 → CE0/CE1뱅크 0 · CE0낮은/높은 8비트 칩워드 주소 0~4095뱅크 1 · CE1낮은/높은 8비트 칩워드 주소 4096~8191CE0/CE1: 1이면 선택각 뱅크는 4K×8 칩 두 개같은 칩 주소·다른 lane

활성 높은 CE의 교육 논리입니다. A0~A11은 네 칩의 내부 주소에 공통 연결하며 그림에서 별도 배선은 생략했습니다. 읽기/쓰기·byte enable·전원·전기 타이밍은 본문 조건을 따릅니다.

그림은 뱅크 선택 논리를 보여 줍니다. 각 뱅크 안의 두 칩은 주소와 CE를 함께 받고 데이터 lane만 다릅니다. 실제 배선의 전원·접지·읽기/쓰기 제어·출력 지연은 생략한 논리 연결입니다.

바이트 주소를 워드 주소와 혼동하지 않기

CPU의 바이트 주소를 B라고 합시다. A = B // 2, lane = B % 2입니다. 따라서 CPU 주소 B0는 바이트 lane, B1–B12는 칩 주소 A0–A11, B13은 뱅크 선택 A12에 해당합니다. 바이트 주소 8,191과 8,192가 뱅크 경계입니다. 워드 주소의 경계 4,095/4,096을 바이트 주소의 경계라고 쓰면 용량이 절반으로 줄어 보입니다.

바이트 주소 B=8,197을 손으로 분해합니다. 워드 주소는 8197 // 2 = 4098, lane은 1입니다. 4098 // 4096 = 1이므로 뱅크 1, 4098 % 4096 = 2이므로 그 뱅크의 칩 주소 2입니다. 읽은 16비트 워드의 높은 8비트가 이 바이트입니다. 바이트 하나만 쓸 때는 해당 lane의 쓰기 허용만 활성화하고 다른 lane을 보존해야 합니다. 이 예제 코드는 주소 선택만 검사하며 쓰기 펄스 회로를 만들지 않습니다.

def select_bank(enabled, high_address_bit):
    if enabled not in (0, 1) or high_address_bit not in (0, 1):
        raise ValueError("선택 논리는 0·1 입력입니다")
    return int(enabled and not high_address_bit), int(enabled and high_address_bit)

def locate_byte(byte_address, chip_depth=4096):
    if chip_depth <= 0 or not 0 <= byte_address < 2 * chip_depth * 2:
        raise ValueError("두 뱅크·두 lane의 주소 범위를 확인하세요")
    word_address, lane = divmod(byte_address, 2)
    bank, chip_address = divmod(word_address, chip_depth)
    return bank, chip_address, lane

expected = {
    0: (0, 0, 0), 8191: (0, 4095, 1),
    8192: (1, 0, 0), 8197: (1, 2, 1), 16383: (1, 4095, 1),
}
for address, answer in expected.items():
    observed = locate_byte(address)
    assert observed == answer
    print(address, observed)
for invalid in (-1, 16384):
    try:
        locate_byte(invalid)
    except ValueError:
        pass
    else:
        raise AssertionError("범위 밖 주소를 거부해야 합니다")
assert 2 * 4096 * 16 // 8 == 16384
assert locate_byte(65536, chip_depth=32768) == (1, 0, 0)
assert [select_bank(e, a) for e, a in [(0, 0), (0, 1), (1, 0), (1, 1)]] == [
    (0, 0), (0, 0), (1, 0), (0, 1),
]
assert tuple(1 - ce for ce in select_bank(1, 0)) == (0, 1)  # 활성 낮은 핀 값

코드를 memory_banks.py로 저장해 실행하면 사전의 다섯 주소와 튜플을 출력합니다. 튜플은 뱅크·칩 주소·lane 순서입니다. 손으로 만든 예상값을 코드 출력과 비교하는 것이며 전기 신호나 실제 RAM 용량을 측정한 결과가 아닙니다.

실제 부품에서 달라지는 조건

Infineon CY7C199D 데이터시트의 Functional Description(표지 포함 물리 2쪽)은 32K×8, A0–A14, 활성 낮은 CE·OE 및 선택하지 않은 출력의 high-impedance 상태를 명시합니다. 해당 부품의 CE 핀에는 위 교육용 CE 신호를 반전한 값을 사용해야 합니다. 실제로는 읽기/쓰기와 OE·WE 조건도 맞아야 합니다. 두 32K×8 칩을 두 lane으로 묶으면 32K×16=64 KiB, 그 뱅크 두 개면 128 KiB라는 용량 계산으로 확장할 수 있습니다. 이 설명은 제품의 논리 조직만 대조한 것으로 전압·부하·타이밍까지 검증한 회로 제작 안내가 아닙니다.

DRAM은 행·열 주소를 같은 물리 신호로 서로 다른 시점에 보내는 주소 다중화가 가능합니다. 예를 들어 6개 신호에 행 6비트, 열 6비트를 차례로 보내는 논리 모델은 64×64위치를 구별합니다. 물리 핀 6개만 세어 64위치라고 계산하면 안 됩니다. 실제 부품의 bank 비트·행/열 폭·명령 타이밍은 데이터시트의 조직을 확인해야 합니다. MIT 메모리 강의의 행 선택·열 선택 설명은 이 경계를 이해하는 추가 자료입니다.

독립 문제: 더 넓은 데이터와 더 많은 주소

1,024×8 칩 여덟 개로 2,048위치×32비트 메모리를 만듭니다. 한 뱅크의 칩 수·뱅크 수·용량을 구하고 CPU 바이트 주소 4,099의 뱅크·칩 주소·lane을 적으세요. 각 lane은 8비트이고 lane 0이 가장 낮은 바이트입니다.

힌트

32비트 폭에는 네 lane이 필요합니다. 바이트 주소를 먼저 4로 나누어 워드 주소를 구하세요.

풀이

한 뱅크는 칩 4개, 뱅크는 2개입니다. 용량은 2,048×32/8=8,192바이트입니다. 4099 // 4 = 1024, lane은 3입니다. 워드 1,024는 뱅크 1의 칩 주소 0입니다. 모든 칩을 폭 확장에만 사용하면 주소 수 1,024는 늘지 않습니다. 다음 RAID와 복원에서는 저장장치 여러 개의 용량과 장애 경계를 구분합니다.