ข้อ 2 · 20 คะแนน

อธิบายการเข้าถึงจาก Z80 ไปยังชิปแต่ละตัว
+ เกิด Memory Foldback หรือไม่

ข้อนี้ไม่ได้ให้วาดใหม่ ให้ อธิบายวงจรที่วาดไว้ในข้อ 1 ว่าเวลา CPU ส่ง address ออกมา แต่ละบิตเดินไปไหน ใครเป็นคนตัดสินใจว่าชิปไหนตอบ และมีตำแหน่งไหนบ้างที่ชี้ไปยังเซลล์เดียวกัน

2.1 เส้นทางของ address — 5 ขั้นที่ต้องเล่าให้ครบ

รายละเอียดของแต่ละขั้นที่ต้องเขียนลงข้อสอบ

  1. CPU วาง address 16 บิตออกที่ A15–A0 พร้อมกับสั่ง MREQ = 0 (ถ้าเป็นการเข้าถึงหน่วยความจำ) หรือ IORQ = 0 (ถ้าเป็น I/O)
  2. address ถูกผ่าออกเป็น 2 ส่วนทันที ส่วนล่าง An−1–A0 วิ่งเข้าชิปทุกตัวพร้อมกัน (ทุกชิปเห็นเหมือนกันหมด) ส่วนบน A15–An เข้าวงจร decode
  3. วงจร decode เปรียบเทียบบิตบน ถ้าตรงกับค่าที่ออกแบบไว้ จะดึงขา CE ของชิปนั้นลงเป็น 0 — ชิปอื่น CE ยังเป็น 1 จึงอยู่ในสถานะ high-impedance
  4. สัญญาณทิศทางเปิดประตู MEMRD เปิด OE ให้ชิปขับข้อมูลออกบัส หรือ MEMWR เปิด WE ให้ชิปรับข้อมูลเข้า
  5. ข้อมูลวิ่งบน data bus มีแค่ชิปเดียวที่ขับบัสในเวลาหนึ่ง เพราะ tri-state + CE ที่ exclusive กัน
ประโยคที่ควรเขียนในข้อสอบ (แบบยกตัวอย่างจริง)

“เมื่อ 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”

2.2 Memory Foldback (ภาพซ้ำ) คืออะไร

ก่อนอื่น — คำว่า “ภาพ” ในเรื่องนี้แปลว่าอะไร

ลองนึกถึงบ้านหลังเดียว ที่มีคนเอาป้ายบ้านเลขที่ไปติดไว้ 4 ป้ายบนประตูบานเดียวกัน
บุรุษไปรษณีย์เดินไปที่เลขที่ไหนก็ตามในสี่ป้ายนั้น — เคาะประตูบานเดิม เจอคนเดิม

ในระบบ Z80 ก็แบบเดียวกันเป๊ะ: ชิปหน่วยความจำก้อนเดียว แต่มีที่อยู่หลายค่าที่เรียกมันได้
ที่อยู่ค่าแรกเราถือว่าเป็น “ตัวจริง” · ที่อยู่ที่เหลือเรียกว่า “ภาพซ้ำ” (image / alias / ghost / mirror)
มันไม่ใช่หน่วยความจำเพิ่ม — ชิป 8K ก็ยังเก็บได้ 8K เท่าเดิม แต่มันไปจองที่ในแผนที่ 64 KB มากกว่าที่ควรจะเป็น

ขั้นที่ 1 · ดูให้เห็นก่อน — ที่อยู่ 4 ค่า วิ่งไปจบที่เซลล์เดียวกัน

แอนิเมชันด้านล่างจะไล่ที่อยู่ทีละค่า ให้ดูว่าสายเส้นไหนมีผล สายเส้นไหนไม่มีผล (กด “ทีละขั้น →” ถ้าอยากดูช้า ๆ)

ขั้นที่ 2 · ลองเองให้เห็นกับตา — เขียนที่หนึ่ง ไปโผล่อีกที่หนึ่ง

นี่คือนิยามที่จับต้องได้ของคำว่าภาพซ้ำ: เขียนค่าลงที่อยู่ A แล้วไปอ่านที่อยู่ B ได้ค่าเดิมกลับมา ทั้งที่ไม่เคยเขียนที่ B เลย

ขั้นที่ 3 · แล้วมันเกิดขึ้นเพราะอะไร

1

สายที่ต่อเข้าขาชิป

บอกว่าเป็นเซลล์ที่เท่าไรในชิป
ชิป 8K มีขา A0–A12 รวม 13 ขา ⇒ ใช้สาย 13 เส้น
เรียกจำนวนนี้ว่า n

2

สายที่เข้าวงจร decode

บอกว่าชิปตัวไหนควรตอบ
เอาไปสร้างสัญญาณ CE ให้ชิป
เรียกจำนวนนี้ว่า k

3

สายที่ไม่ได้ต่อไปไหนเลย

ปลายสายลอย ไม่มีใครอ่านค่ามัน
⇒ ชิปไม่มีทางรู้ว่ามันเป็น 0 หรือ 1
เรียกจำนวนนี้ว่า d (don't care)

สาเหตุของ foldback มีอย่างเดียวเท่านั้น

มีสายอยู่ในกลุ่มที่ 3 — คือมีสาย address ที่ไม่ได้ต่อเข้าชิป และไม่ได้ถูกใช้ในวงจร decode ด้วย
สายเส้นนั้นจะเปลี่ยนค่ายังไงก็ได้ ชิปตอบเหมือนเดิมทุกครั้ง ⇒ เกิดที่อยู่ที่ใช้แทนกันได้ ⇒ ภาพซ้ำ
ถ้า d = 0 ก็ไม่มีภาพซ้ำ — ง่ายแค่นั้น

ขั้นที่ 4 · สูตรมาจากไหน — มันคือการ “นับสาย” เฉย ๆ

ลองปรับขนาดชิป และกดสลับหน้าที่ของสายบิตบน ๆ ดู — ตัวเลขในสูตรจะขยับตามให้เห็นว่ามันมาจากอะไร

ขั้นที่ 5 · สรุปสูตรสำหรับเขียนลงข้อสอบ

ให้   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 vs Partial vs Linear select

Full (absolute)PartialLinear select
นิยามn + k = 16 ใช้ครบทุกเส้นn + k < 16 มีเส้นเหลือเอา A 1 เส้นต่อ CE ตรง ๆ ไม่มี decoder
Foldbackไม่มีมี 2d ภาพมีเยอะมาก
ฮาร์ดแวร์เยอะ ช้ากว่าน้อยลงไม่มีเกตเลย
ขยายภายหลังง่าย พื้นที่ว่างว่างจริงยาก พื้นที่ “ว่าง” ถูกภาพซ้ำจองไว้แล้วยากมาก
เสี่ยงบัสชนไม่มีถ้าออกแบบพลาดอาจมีมี ถ้าซอฟต์แวร์ทำให้ 2 เส้น active พร้อมกัน
ใช้เมื่อระบบใหญ่ ต้องขยายระบบเล็ก ประหยัดบอร์ดทดลอง

2.3 เครื่องมือทดลอง — ตั้งค่าเอง แล้วดูภาพซ้ำ

ปรับขนาดชิปและจำนวนสายที่ใช้ decode แล้วดูว่าแผนที่ 64 KB เปลี่ยนไปยังไง ลองพิมพ์ address ลงช่องล่างเพื่อดูว่าชิปไหนตอบ และเป็นภาพจริงหรือภาพซ้ำ

สรุปการ decode

แผนที่หน่วยความจำ 64 KB

■ ROM (ภาพจริง) ■ ROM (ภาพซ้ำ) ■ RAM (ภาพจริง) ■ RAM (ภาพซ้ำ) ■ ว่าง

โจทย์หลักตามที่อาจารย์ประกาศ

โจทย์หลัก · 20 คะแนน

จากวงจรที่ออกแบบในข้อ 1 (ROM 4 KB ที่ 0000H, RWM 4 KB ที่ 1000H, พอร์ตออก 40H, พอร์ตเข้า 84H) จงอธิบายรายละเอียดการเข้าถึงจาก Z80 ไปยังชิปอุปกรณ์แต่ละตัวมาอย่างละเอียด โดยอธิบายด้วยว่าการต่อแบบนี้ก่อให้เกิด Memory Foldback หรือไม่อย่างไร

ดูเฉลย — ทั้งกรณี decode เต็ม และกรณี decode ไม่เต็ม

ส่วนที่ 1 · ตารางเข้าถึงแต่ละชิป

ชิปเงื่อนไขที่ทำให้ถูกเลือกบิตที่เข้าชิปช่วง 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 (อ่านเท่านั้น)

ส่วนที่ 2 · ตัวอย่างการไล่ทีละบิต

ถ้า CPU ทำคำสั่ง LD A,(1234H) — ดูว่าบิตทั้ง 16 แยกกันไปทำหน้าที่อะไร

ขั้นเกิดอะไรขึ้นผล
1CPU วาง 0001 0010 0011 0100 บน A15–A0 พร้อม MREQ = 0, RD = 0address valid บนบัส
2วงจร decode อ่าน A15 A14 A13 A12 = 0001ตรงเงื่อนไขของ RWM
3เกตของ RWM ดึง CE ลง · ของ ROM ยังเป็น 1CERWM=0 · CEROM=1
4A11–A0 = 0010 0011 0100 เข้าชิป RWM ตรง ๆเซลล์ที่ 234H
5MEMRD = 0 เปิด OE ของ RWMข้อมูลออก D7–D0 → register A

ส่วนที่ 3 · ตอบเรื่อง Foldback

คำนวณตามสูตร d = 16 − n − k

ชิปnkdจำนวนภาพ 2dสรุป
ROM 4 KB124 (A15–A12)01ไม่มี foldback
RWM 4 KB124 (A15–A12)01ไม่มี foldback
ผลของสูตร d = 16 − n − k
d = 0
จำนวนภาพต่อชิป
1
สรุป
ไม่เกิด Memory Foldback
พื้นที่ว่างจริง 2000H–FFFFH = 56 KB
คำตอบ (กรณี decode เต็ม)

ไม่เกิด Memory Foldback เพราะสาย address ทั้ง 16 เส้นถูกใช้งานหมด — A11–A0 ต่อเข้าชิปโดยตรง ส่วน A15–A12 ถูกใช้ในวงจร decode ทุกเส้น จึงไม่เหลือสายที่เป็น don't care ⇒ แต่ละเซลล์มี address เดียวเท่านั้น
ช่วง 2000H – FFFFH (56 KB) เป็นพื้นที่ว่างจริง ไม่มีชิปใดตอบ อ่านจะได้ค่าลอย เขียนจะหายไป และสามารถนำไปขยายหน่วยความจำเพิ่มได้ทันที

ส่วนที่ 4 · ถ้าโจทย์ให้ decode ไม่เต็ม (กรณีที่หนังสือเรียนบทที่ 6.3 ยกไว้)

ถ้าลดวงจรเหลือใช้แค่ 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
d = 16 − 12 − 1
d = 3
จำนวนภาพต่อชิป
2³ = 8
สรุป
เกิด Memory Foldback
มีของจริง 8 KB แต่กินพื้นที่ครบ 64 KB
ผลกระทบที่ต้องเขียนถึงด้วย
  • มีหน่วยความจำจริงแค่ 8 KB แต่กินพื้นที่ address ครบ 64 KB — ขยายอะไรไม่ได้อีกเลย
  • ถ้าตั้ง SP = 0000H คำสั่ง PUSH แรกจะเขียนที่ FFFFH/FFFEH ซึ่งเป็นเซลล์เดียวกับ 1FFFH/1FFEH → ทับข้อมูลของตัวเองโดยไม่รู้ตัว
  • โปรแกรมกระโดดไป 8000H จะยัง fetch เจอโค้ดจาก ROM ตัวเดิม เพราะเป็นภาพซ้ำ
  • ข้อดีเดียวคือประหยัดเกต — ระบบเล็ก ๆ ที่รู้ว่าจะไม่ขยายก็ใช้ได้

ตัวอย่างเพิ่มอีก 5 ข้อ

ตัวอย่างที่ 1

ROM 8 KB ต่อโดยใช้เฉพาะ A15 ในการ decode (A15 = 0 → เลือก ROM) จงหาว่ามีภาพซ้ำกี่ภาพ และอยู่ที่ช่วงใดบ้าง

เฉลยตัวอย่างที่ 1

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

ตัวอย่างที่ 2

ระบบใช้ RAM 2 KB ต่อกับ 74LS138 ที่ output Y4 โดย 74LS138 รับ A15 A14 A13 เป็น C B A จงหาช่วง address และจำนวนภาพซ้ำ

เฉลยตัวอย่างที่ 2

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 ภายในบล็อก ยังต้องคำนวณแยก ถ้าเอาชิปเล็กกว่าขนาดบล็อกไปวาง จะมีภาพซ้ำในบล็อกนั้นเสมอ

ตัวอย่างที่ 3

ระบบมี 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 ตกที่ไหน

เฉลยตัวอย่างที่ 3

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 หรือค่าที่ค้างบนบัส) เขียนลงไปก็หายไปเฉย ๆ

ตัวอย่างที่ 4 · I/O foldback

พอร์ตเอาต์พุตหนึ่งถูก decode ด้วย A7 A6 A5 = 010 เท่านั้น (ไม่สนใจ A4–A0) จงหาว่าพอร์ตนี้ตอบที่เลขพอร์ตใดบ้าง และมีกี่เลข

เฉลยตัวอย่างที่ 4

ในปริภูมิ 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 บิตต้องรู้ว่าใช้คำสั่งแบบไหน

ตัวอย่างที่ 5 · ย้อนกลับ

ระบบหนึ่งพบว่า ROM 4 KB ปรากฏซ้ำทั้งหมด 16 ภาพ ในปริภูมิ 64 KB จงหาว่าวงจร decode ใช้สาย address กี่เส้น และยกตัวอย่างว่าเป็นเส้นใดได้บ้าง

เฉลยตัวอย่างที่ 5

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 ✓ ตรงกับที่บอกว่าซ้ำทั้งปริภูมิ

← ข้อ 1 · วงจร ข้อ 3 · Assembly →