10 คะแนนนี้ได้ฟรีถ้าเข้าใจข้อ 2 แล้ว — วิธีคิดเหมือนเดิมทุกอย่าง เปลี่ยนแค่ค่าบิต แต่ มีประเด็นหนึ่งที่ถ้าเขียนถึงจะแยกจากคนอื่นได้ทันที
CEROM = A15+A14+A13+A12 + MREQ
CERAM = A15+A14+A13+A12 + MREQ
CERAM = A15+A14+A13+A12 + MREQ
CEROM = A15+A14+A13+A12 + MREQ
สลับแค่ว่าขา A12 ของใครมีวงกลม — วงจรเหลือเหมือนเดิมทุกอย่าง
เมื่อ RESET ถูกดึงลง (อย่างน้อย 3 clock) Z80 จะทำ
PC ← 0000H, I ← 00H, R ← 00H, ปิด interrupt, ตั้ง interrupt mode 0
แปลว่า คำสั่งแรกที่ CPU ดึงมา execute อยู่ที่ตำแหน่ง 0000H
ถ้าเอา RAM ไปวางที่ 0000H — ตอนเปิดเครื่อง RAM ยังไม่มีข้อมูล (ค่าสุ่มหรือ 00H/FFH ทั้งหมด) CPU จะ fetch เจอขยะแล้วทำงานมั่ว ระบบบูตไม่ขึ้น
| Address | ใช้ทำอะไร | ผลเมื่อกลายเป็น RAM |
|---|---|---|
| 0000H | Reset vector · RST 00H | ไม่มีโค้ดตอนบูต |
| 0008H | RST 08H | ต้องเขียนโค้ดลงไปก่อนใช้ |
| 0010H / 0018H / 0020H 0028H / 0030H / 0038H | RST 10H–38H · และ 0038H คือปลายทางของ INT mode 1 | interrupt mode 1 ใช้ไม่ได้จนกว่าจะเขียนโค้ดลง RAM |
| 0066H | ปลายทางของ NMI | NMI จะกระโดดไปที่ RAM ว่างเปล่า |
ได้ แต่ต้องเพิ่มวงจร — เขียนถึงข้อใดข้อหนึ่งก็พอ
OUT ไปพลิก flip-flop
หลังจากนั้น 0000H จึงเป็น RAM จริงJP ลงมาที่ RAM
— แบบนี้ 0000H เป็น RAM ได้ ถ้าไม่ต้องบูตเองจงทำซ้ำข้อที่ 2 สำหรับการออกแบบระบบใหม่ โดยออกแบบให้เริ่มด้วยหน่วยความจำแบบ RAM และตามด้วย ROM ทันที
| ชิป | ช่วง | เข้าชิป | เงื่อนไข decode | สมการ |
|---|---|---|---|---|
| RWM 4 KB | 0000H – 0FFFH | A11–A0 | A15 A14 A13 A12 = 0000 | CE = A15+A14+A13+A12+MREQ |
| ROM 4 KB | 1000H – 1FFFH | A11–A0 | A15 A14 A13 A12 = 0001 | CE = A15+A14+A13+A12+MREQ |
ตัวอย่าง CPU อ่านตำแหน่ง 1234H (อยู่ในช่วง ROM)
1234H = 0001 0010 0011 0100
A15–A12 = 0001 → ตรงเงื่อนไขของ ROM ⇒ CEROM = 0
A11–A0 = 234H → เซลล์ที่ 234H ภายในชิป ROM
MEMRD = 0 → เปิด OE → ข้อมูลออก D7–D0
ตัวอย่าง CPU เขียนตำแหน่ง 0234H (อยู่ในช่วง RWM)
0234H = 0000 0010 0011 0100
A15–A12 = 0000 → CERWM = 0
A11–A0 = 234H
MEMWR = 0 → เปิด WE → ข้อมูลจาก D7–D0 ถูกเขียนลงเซลล์
(ถ้าเขียนที่ 1234H จะไม่เกิดอะไรขึ้น เพราะ ROM ไม่มีขา WE)
| ชิป | n | k | d = 16−n−k | ภาพ | สรุป |
|---|---|---|---|---|---|
| RWM 4 KB | 12 | 4 | 0 | 1 | ไม่มี foldback |
| ROM 4 KB | 12 | 4 | 0 | 1 | ไม่มี foldback |
สรุป: การสลับลำดับ ROM ↔ RAM ไม่มีผลต่อการเกิด foldback เลย เพราะ foldback ขึ้นกับจำนวนสาย address ที่ถูกใช้ ไม่ได้ขึ้นกับว่าชิปวางเรียงยังไง — ตราบใดที่ยัง decode A15–A12 ครบทั้ง 4 เส้น ก็ยังไม่มีภาพซ้ำ และช่วง 2000H–FFFFH ยังคงว่างเหมือนเดิม
แม้ผลเรื่อง foldback จะเหมือนเดิมเป๊ะ แต่ระบบใหม่มีปัญหาเชิงการทำงานที่ระบบเดิมไม่มี:
ทางแก้: ต้องเพิ่มวงจร ROM shadow / bank switching ที่ทำให้ ROM ตอบที่ 0000H ชั่วคราวตอน reset แล้วค่อยสลับเป็น RAM ภายหลังด้วยคำสั่ง OUT
“การสลับลำดับหน่วยความจำไม่ทำให้เกิด Memory Foldback เพิ่มขึ้นหรือลดลง เพราะ foldback เกิดจากการที่มีสาย address เหลือเป็น don't care เท่านั้น ในการออกแบบนี้ยังใช้ A15–A12 ครบทั้ง 4 เส้นเหมือนเดิม จึงยังเป็น full decoding (d = 0, 1 ภาพ) แต่การวาง RAM ไว้ที่ 0000H จะทำให้ระบบไม่สามารถบูตเองได้ เนื่องจาก Z80 กำหนดให้ PC = 0000H หลัง reset เสมอ จึงต้องมีวงจรเสริมเพื่อให้ ROM ปรากฏที่ตำแหน่งนั้นในช่วงเริ่มต้น”
ปรับด้านล่างเพื่อดูว่าถ้า decode ไม่ครบ ผังใหม่จะเกิด foldback แบบไหน
ระบบใหม่: RAM 8 KB ที่ 0000H ตามด้วย ROM 8 KB ทันที จงเขียนสมการ CE ทั้งสอง และบอกช่วง address ของ ROM
ชิป 8 KB ⇒ n = 13 (A12–A0) ⇒ เหลือ A15 A14 A13 = 3 เส้น
RAM 0000H – 1FFFH ⇒ A15 A14 A13 = 000
ROM 2000H – 3FFFH ⇒ A15 A14 A13 = 001
CERAM = A15 + A14 + A13 + MREQ
CEROM = A15 + A14 + A13 + MREQ
d = 16 − 13 − 3 = 0 ⇒ ไม่มี foldback · หรือใช้ 74LS138 ก็ได้: Y0 → RAM, Y1 → ROM
ถ้าออกแบบ RAM 4 KB ที่ 0000H และ ROM 4 KB ที่ 1000H แต่ decode ด้วย A12 เพียงเส้นเดียว จงหาจำนวนภาพซ้ำและช่วงของแต่ละภาพ
n = 12, k = 1 ⇒ d = 3 ⇒ 2³ = 8 ภาพต่อชิป · don't care = A15 A14 A13 ⇒ ห่างกันทุก 2000H
RAM (A12 = 0): 0000, 2000, 4000, 6000, 8000, A000, C000, E000 (แต่ละภาพยาว 1000H)
ROM (A12 = 1): 1000, 3000, 5000, 7000, 9000, B000, D000, F000
RAM ปรากฏที่ 0000H → ยังบูตไม่ขึ้นเหมือนเดิม
และตอนนี้ทั้ง 64 KB ถูกจองหมด ขยายไม่ได้เลย
แต่มีจุดน่าสนใจ: ROM ปรากฏที่ F000H–FFFFH ด้วย
ถ้าตั้ง SP = 0000H แล้ว PUSH จะเขียนไปที่ FFFFH ซึ่งเป็น ROM → เขียนไม่ติด stack พังทันที
จงอธิบายว่าเพราะเหตุใดระบบไมโครโพรเซสเซอร์ส่วนใหญ่จึงวาง ROM ไว้ต้นปริภูมิ address เสมอ และยกตัวอย่างสถาปัตยกรรมที่ทำตรงกันข้าม
เพราะ CPU ส่วนใหญ่กำหนด reset vector ไว้ที่ address ต่ำ ๆ ตายตัว:
| CPU | หลัง reset PC = ? |
|---|---|
| Z80 | 0000H |
| 8080 / 8085 | 0000H |
| 6502 | อ่าน vector จาก FFFCH–FFFDH ⇒ ROM ต้องอยู่ปลายปริภูมิ |
| 68000 | อ่าน SP จาก 000000H และ PC จาก 000004H ⇒ ROM ต้องอยู่ต้น |
6502 คือตัวอย่างที่ทำตรงกันข้าม — RAM อยู่ต้น (zero page ที่ 0000–00FF ใช้เป็น addressing mode พิเศษที่เร็วกว่า) และ ROM อยู่ปลาย ซึ่งเป็นเหตุผลว่าทำไม Apple II / Commodore 64 / NES จึงวาง ROM ไว้ท้ายแผนที่
จงออกแบบวงจร ROM shadow อย่างง่ายที่ทำให้ ROM ตอบที่ 0000H ตอน reset
แล้วสลับให้ RAM ตอบแทนเมื่อโปรแกรมสั่ง OUT (FEH),A
ใช้ D flip-flop 1 บิต (เช่น ครึ่งหนึ่งของ 74LS74) ตั้งชื่อว่า BOOT
CLR ของ flip-flop ← RESET ของ Z80 ⇒ หลัง reset BOOT = 0
CLK ของ flip-flop ← SEL_FE + IOWR ⇒ OUT (FEH),A ทำให้ BOOT = 1
D ของ flip-flop ← +5V
สมการเลือกชิป:
CEROM = ( BOOT · A15A14A13A12=0000 ) ; ตอนบูต ROM ตอบที่ 0000H
+ ( BOOT · A15A14A13A12=0001 ) ; หลังบูต ROM กลับไปที่ 1000H
CERAM = BOOT · A15A14A13A12=0000 ; RAM ตอบที่ 0000H เฉพาะหลังบูต
ลำดับการทำงาน:
OUT (FEH),A → BOOT = 1 → RAM มาตอบที่ 0000H, ROM ย้ายไป 1000Hระบบใหม่วาง RAM 32 KB ที่ 0000H และ ROM 16 KB ต่อทันที จงหาช่วง address, สมการ CE, จำนวนภาพซ้ำ และช่วงที่ยังว่าง
RAM 32 KB ⇒ n = 15 (A14–A0) ⇒ 0000H – 7FFFH ⇒ A15 = 0
ROM 16 KB ⇒ n = 14 (A13–A0) ⇒ 8000H – BFFFH ⇒ A15 A14 = 10
CSRAM = A15 + MREQ k = 1 ⇒ d = 16−15−1 = 0
CEROM = A15 + A14 + MREQ k = 2 ⇒ d = 16−14−2 = 0
ทั้งคู่ decode เต็ม ⇒ ไม่มี foldback
ช่วงว่าง: C000H – FFFFH (16 KB) เพราะ A15 A14 = 11 ไม่มีชิปตอบ
ข้อดีของผังนี้: ตั้ง SP = 8000H ได้พอดี (stack โตลงมาในช่วง RAM)
ข้อเสียเดิม: ยังบูตไม่ได้ เพราะ 0000H เป็น RAM