ข้อนี้ไม่ได้ให้วาดใหม่ ให้ อธิบายวงจรที่วาดไว้ในข้อ 1 ว่าเวลา CPU ส่ง address ออกมา แต่ละบิตเดินไปไหน ใครเป็นคนตัดสินใจว่าชิปไหนตอบ และมีตำแหน่งไหนบ้างที่ชี้ไปยังเซลล์เดียวกัน
รายละเอียดของแต่ละขั้นที่ต้องเขียนลงข้อสอบ
“เมื่อ Z80 ต้องการอ่านตำแหน่ง 1234H จะวาง 0001 0010 0011 0100
บน A15–A0 พร้อมกับ MREQ = 0 และ RD = 0
บิต A15 A14 A13 A12 = 0001 ตรงกับเงื่อนไขของ RWM ⇒ CERWM = 0
ส่วน CEROM ยังเป็น 1
บิต A11–A0 = 0010 0011 0100 = 234H คือตำแหน่งภายในชิป RWM
⇒ ข้อมูลจากเซลล์ที่ 234H ของ RWM ถูกขับออก D7–D0 ผ่าน OE ที่มาจาก MEMRD”
ลองนึกถึงบ้านหลังเดียว ที่มีคนเอาป้ายบ้านเลขที่ไปติดไว้ 4 ป้ายบนประตูบานเดียวกัน
บุรุษไปรษณีย์เดินไปที่เลขที่ไหนก็ตามในสี่ป้ายนั้น — เคาะประตูบานเดิม เจอคนเดิม
ในระบบ Z80 ก็แบบเดียวกันเป๊ะ:
ชิปหน่วยความจำก้อนเดียว แต่มีที่อยู่หลายค่าที่เรียกมันได้
ที่อยู่ค่าแรกเราถือว่าเป็น “ตัวจริง” · ที่อยู่ที่เหลือเรียกว่า “ภาพซ้ำ” (image / alias / ghost / mirror)
มันไม่ใช่หน่วยความจำเพิ่ม — ชิป 8K ก็ยังเก็บได้ 8K เท่าเดิม
แต่มันไปจองที่ในแผนที่ 64 KB มากกว่าที่ควรจะเป็น
แอนิเมชันด้านล่างจะไล่ที่อยู่ทีละค่า ให้ดูว่าสายเส้นไหนมีผล สายเส้นไหนไม่มีผล (กด “ทีละขั้น →” ถ้าอยากดูช้า ๆ)
นี่คือนิยามที่จับต้องได้ของคำว่าภาพซ้ำ: เขียนค่าลงที่อยู่ A แล้วไปอ่านที่อยู่ B ได้ค่าเดิมกลับมา ทั้งที่ไม่เคยเขียนที่ B เลย
บอกว่าเป็นเซลล์ที่เท่าไรในชิป
ชิป 8K มีขา A0–A12 รวม 13 ขา ⇒ ใช้สาย 13 เส้น
เรียกจำนวนนี้ว่า n
บอกว่าชิปตัวไหนควรตอบ
เอาไปสร้างสัญญาณ CE ให้ชิป
เรียกจำนวนนี้ว่า k
ปลายสายลอย ไม่มีใครอ่านค่ามัน
⇒ ชิปไม่มีทางรู้ว่ามันเป็น 0 หรือ 1
เรียกจำนวนนี้ว่า d (don't care)
มีสายอยู่ในกลุ่มที่ 3 — คือมีสาย address ที่ไม่ได้ต่อเข้าชิป
และไม่ได้ถูกใช้ในวงจร decode ด้วย
สายเส้นนั้นจะเปลี่ยนค่ายังไงก็ได้ ชิปตอบเหมือนเดิมทุกครั้ง ⇒ เกิดที่อยู่ที่ใช้แทนกันได้ ⇒ ภาพซ้ำ
ถ้า d = 0 ก็ไม่มีภาพซ้ำ — ง่ายแค่นั้น
ลองปรับขนาดชิป และกดสลับหน้าที่ของสายบิตบน ๆ ดู — ตัวเลขในสูตรจะขยับตามให้เห็นว่ามันมาจากอะไร
ให้ n = จำนวนสาย address ที่ต่อเข้าชิปโดยตรง (ชิป 2ⁿ ไบต์)
k = จำนวนสาย address ที่วงจร decode ใช้
d = 16 − n − k ← จำนวนสาย don't care ; มาจาก n + k + d = 16
จำนวนภาพ (images) = 2ᵈ ; d เส้นสลับได้ 2ᵈ แบบ ชิปแยกไม่ออก
พื้นที่ที่ชิปกินจริง = 2ᵈ × 2ⁿ = 2^(16−k) ไบต์ ; ภาพ × ขนาดต่อภาพ
d = 0 ⇒ Full decoding ⇒ ไม่มี foldback
d > 0 ⇒ Partial decoding ⇒ เกิด foldback 2ᵈ ภาพ
สาย don't care ที่บิตตำแหน่ง j คุมค่า 2j ของ address พอมันสลับ 0↔1 ที่อยู่จึงกระโดดไป 2j ไบต์
ตัวอย่างเดินทีละขั้น — ชิป 8K ที่ 0000H, decode ด้วย A15 เส้นเดียว
n = 13 (A0–A12) k = 1 (A15) ⇒ d = 16 − 13 − 1 = 2 คือ A14 กับ A13
A14 A13 = 0 0 → 0000H + 0 = 0000H ← ตัวจริง
A14 A13 = 0 1 → 0000H + 2¹³ = 2000H ← ภาพซ้ำ
A14 A13 = 1 0 → 0000H + 2¹⁴ = 4000H ← ภาพซ้ำ
A14 A13 = 1 1 → 0000H + 2¹⁴+2¹³ = 6000H ← ภาพซ้ำ
รวม 2² = 4 ภาพ · กินที่ 4 × 8K = 32 KB ทั้งที่ชิปเก็บได้จริงแค่ 8K
สรุปวิธีทำ: เอาทุกชุดค่าผสมของบิต don't care ไปบวกกับ base address — มีกี่ชุดก็มีเท่านั้นภาพ
| Full (absolute) | Partial | Linear select | |
|---|---|---|---|
| นิยาม | n + k = 16 ใช้ครบทุกเส้น | n + k < 16 มีเส้นเหลือ | เอา A 1 เส้นต่อ CE ตรง ๆ ไม่มี decoder |
| Foldback | ไม่มี | มี 2d ภาพ | มีเยอะมาก |
| ฮาร์ดแวร์ | เยอะ ช้ากว่า | น้อยลง | ไม่มีเกตเลย |
| ขยายภายหลัง | ง่าย พื้นที่ว่างว่างจริง | ยาก พื้นที่ “ว่าง” ถูกภาพซ้ำจองไว้แล้ว | ยากมาก |
| เสี่ยงบัสชน | ไม่มี | ถ้าออกแบบพลาดอาจมี | มี ถ้าซอฟต์แวร์ทำให้ 2 เส้น active พร้อมกัน |
| ใช้เมื่อ | ระบบใหญ่ ต้องขยาย | ระบบเล็ก ประหยัด | บอร์ดทดลอง |
ปรับขนาดชิปและจำนวนสายที่ใช้ decode แล้วดูว่าแผนที่ 64 KB เปลี่ยนไปยังไง ลองพิมพ์ address ลงช่องล่างเพื่อดูว่าชิปไหนตอบ และเป็นภาพจริงหรือภาพซ้ำ
จากวงจรที่ออกแบบในข้อ 1 (ROM 4 KB ที่ 0000H, RWM 4 KB ที่ 1000H, พอร์ตออก 40H, พอร์ตเข้า 84H) จงอธิบายรายละเอียดการเข้าถึงจาก Z80 ไปยังชิปอุปกรณ์แต่ละตัวมาอย่างละเอียด โดยอธิบายด้วยว่าการต่อแบบนี้ก่อให้เกิด Memory Foldback หรือไม่อย่างไร
| ชิป | เงื่อนไขที่ทำให้ถูกเลือก | บิตที่เข้าชิป | ช่วง address |
|---|---|---|---|
| ROM | A15 A14 A13 A12 = 0000 และ MREQ = 0 | A11–A0 (12 เส้น) | 0000H – 0FFFH |
| RWM | A15 A14 A13 A12 = 0001 และ MREQ = 0 | A11–A0 (12 เส้น) | 1000H – 1FFFH |
| LED latch | A7–A0 = 0100 0000 และ IORQ = 0 และ WR = 0 | — | พอร์ต 40H (เขียนเท่านั้น) |
| Switch buffer | A7–A0 = 1000 0100 และ IORQ = 0 และ RD = 0 | — | พอร์ต 84H (อ่านเท่านั้น) |
ถ้า CPU ทำคำสั่ง LD A,(1234H) — ดูว่าบิตทั้ง 16 แยกกันไปทำหน้าที่อะไร
| ขั้น | เกิดอะไรขึ้น | ผล |
|---|---|---|
| 1 | CPU วาง 0001 0010 0011 0100 บน A15–A0 พร้อม MREQ = 0, RD = 0 | address valid บนบัส |
| 2 | วงจร decode อ่าน A15 A14 A13 A12 = 0001 | ตรงเงื่อนไขของ RWM |
| 3 | เกตของ RWM ดึง CE ลง · ของ ROM ยังเป็น 1 | CERWM=0 · CEROM=1 |
| 4 | A11–A0 = 0010 0011 0100 เข้าชิป RWM ตรง ๆ | เซลล์ที่ 234H |
| 5 | MEMRD = 0 เปิด OE ของ RWM | ข้อมูลออก D7–D0 → register A |
คำนวณตามสูตร d = 16 − n − k
| ชิป | n | k | d | จำนวนภาพ 2d | สรุป |
|---|---|---|---|---|---|
| ROM 4 KB | 12 | 4 (A15–A12) | 0 | 1 | ไม่มี foldback |
| RWM 4 KB | 12 | 4 (A15–A12) | 0 | 1 | ไม่มี foldback |
ไม่เกิด Memory Foldback เพราะสาย address ทั้ง 16 เส้นถูกใช้งานหมด —
A11–A0 ต่อเข้าชิปโดยตรง ส่วน A15–A12 ถูกใช้ในวงจร decode ทุกเส้น
จึงไม่เหลือสายที่เป็น don't care ⇒ แต่ละเซลล์มี address เดียวเท่านั้น
ช่วง 2000H – FFFFH (56 KB) เป็นพื้นที่ว่างจริง ไม่มีชิปใดตอบ
อ่านจะได้ค่าลอย เขียนจะหายไป และสามารถนำไปขยายหน่วยความจำเพิ่มได้ทันที
ถ้าลดวงจรเหลือใช้แค่ A12 เส้นเดียว (A12 = 0 → ROM, A12 = 1 → RWM) โดยไม่สนใจ A15 A14 A13 เลย
n = 12, k = 1 ⇒ d = 16 − 12 − 1 = 3 ⇒ 2³ = 8 ภาพ ต่อชิป
สาย don't care คือ A15, A14, A13 ⇒ ภาพห่างกันทุก 2¹³ = 2000H
ROM ปรากฏที่ 0000–0FFF, 2000–2FFF, 4000–4FFF, 6000–6FFF,
8000–8FFF, A000–AFFF, C000–CFFF, E000–EFFF
RWM ปรากฏที่ 1000–1FFF, 3000–3FFF, 5000–5FFF, 7000–7FFF,
9000–9FFF, B000–BFFF, D000–DFFF, F000–FFFF
SP = 0000H คำสั่ง PUSH แรกจะเขียนที่ FFFFH/FFFEH
ซึ่งเป็นเซลล์เดียวกับ 1FFFH/1FFEH → ทับข้อมูลของตัวเองโดยไม่รู้ตัวROM 8 KB ต่อโดยใช้เฉพาะ A15 ในการ decode (A15 = 0 → เลือก ROM) จงหาว่ามีภาพซ้ำกี่ภาพ และอยู่ที่ช่วงใดบ้าง
n = 13 (A12–A0), k = 1 (A15) ⇒ d = 16 − 13 − 1 = 2 ⇒ 2² = 4 ภาพ
สาย don't care = A14 และ A13 ⇒ ภาพห่างกัน 213 = 2000H และ 214 = 4000H
ภาพจริง 0000H – 1FFFH
ภาพซ้ำ 2000H – 3FFFH (A13 = 1)
ภาพซ้ำ 4000H – 5FFFH (A14 = 1)
ภาพซ้ำ 6000H – 7FFFH (A14 = A13 = 1)
รวมกินพื้นที่ 216−1 = 32 KB คือ 0000H–7FFFH ทั้งที่มีของจริงแค่ 8 KB
ระบบใช้ RAM 2 KB ต่อกับ 74LS138 ที่ output Y4 โดย 74LS138 รับ A15 A14 A13 เป็น C B A จงหาช่วง address และจำนวนภาพซ้ำ
Y4 ⇒ C B A = A15 A14 A13 = 100 ⇒ บล็อก 8 KB ที่ 8000H–9FFFH
แต่ชิปเป็น 2 KB ⇒ n = 11 (A10–A0), k = 3 (A15 A14 A13) ⇒ d = 16 − 11 − 3 = 2 ⇒ 4 ภาพ
สาย don't care = A12 และ A11 ⇒ ภาพห่างกัน 800H
8000H – 87FFH ← ภาพจริง
8800H – 8FFFH (A11 = 1)
9000H – 97FFH (A12 = 1)
9800H – 9FFFH (A12 = A11 = 1)
decoder บอกแค่ว่า “อยู่บล็อกไหน” — foldback ภายในบล็อก ยังต้องคำนวณแยก ถ้าเอาชิปเล็กกว่าขนาดบล็อกไปวาง จะมีภาพซ้ำในบล็อกนั้นเสมอ
ระบบมี ROM 1 KB ที่ decode ด้วย A15 A14 A13 A12 A11 A10 = 000000
และ RAM 1 KB ที่ decode ด้วย A15 A14 A13 A12 A11 A10 = 000001
จงบอกว่ามี foldback หรือไม่ และตำแหน่ง 2000H กับ 0400H ตกที่ไหน
n = 10, k = 6 ⇒ d = 16 − 10 − 6 = 0 ⇒ 1 ภาพ ⇒ ไม่มี foldback
0400H = 0000 0100 0000 0000
A15–A10 = 000001 → RAM, ตำแหน่งภายใน = A9–A0 = 000H
2000H = 0010 0000 0000 0000
A15–A10 = 001000 → ไม่ตรงกับใครเลย → ไม่มีชิปตอบ
อ่าน 2000H จะได้ค่าขยะจาก floating bus (มักอ่านได้ FFH หรือค่าที่ค้างบนบัส) เขียนลงไปก็หายไปเฉย ๆ
พอร์ตเอาต์พุตหนึ่งถูก decode ด้วย A7 A6 A5 = 010 เท่านั้น (ไม่สนใจ A4–A0) จงหาว่าพอร์ตนี้ตอบที่เลขพอร์ตใดบ้าง และมีกี่เลข
ในปริภูมิ I/O ใช้ A7–A0 (8 บิต) ⇒ สูตรกลายเป็น images = 28−k
k = 3 (A7 A6 A5) ⇒ 25 = 32 เลขพอร์ต
A7 A6 A5 = 010, A4–A0 = don't care
⇒ 0100 0000 ถึง 0101 1111
⇒ พอร์ต 40H – 5FH ทั้งหมดชี้ไปที่ latch ตัวเดียวกัน
แปลว่า OUT (40H),A กับ OUT (5FH),A ให้ผลเหมือนกันเป๊ะ —
และถ้าจะเพิ่มพอร์ตอื่นในช่วง 40H–5FH จะชนกันทันที
เกร็ดที่ควรรู้: ระหว่าง I/O cycle A8–A15 ไม่ได้ว่าง — มีค่า A (สำหรับ OUT (n),A)
หรือค่า B (สำหรับ OUT (C),r) อยู่ ถ้าจะ decode 16 บิตต้องรู้ว่าใช้คำสั่งแบบไหน
ระบบหนึ่งพบว่า ROM 4 KB ปรากฏซ้ำทั้งหมด 16 ภาพ ในปริภูมิ 64 KB จงหาว่าวงจร decode ใช้สาย address กี่เส้น และยกตัวอย่างว่าเป็นเส้นใดได้บ้าง
16 ภาพ = 24 ⇒ d = 4
d = 16 − n − k
4 = 16 − 12 − k
k = 0
k = 0 แปลว่าไม่ได้ใช้สาย address เลย — CE ต่อจาก MREQ อย่างเดียว (หรือต่อลงกราวด์แล้วคุมด้วย OE)
ROM จะปรากฏทุก 4 KB ตลอด 64 KB: 0000, 1000, 2000, … F000 รวม 16 ภาพ
216−k = 216−0 = 65,536 ไบต์ = เต็ม 64 KB ✓ ตรงกับที่บอกว่าซ้ำทั้งปริภูมิ