ข้อ 5 · 20 คะแนน

วาด Timing Diagram ของคำสั่งที่ติดต่อหน่วยความจำและ I/O
รวม 4 Instruction Cycles

โจทย์บอกว่า “ให้กำหนดค่าข้อมูลอื่น ๆ ที่เกี่ยวข้องเองตามความเหมาะสม” แปลว่าเราเลือกคำสั่ง เลือก address เลือกข้อมูล และเลือกความถี่ clock ได้เอง — ควรเลือกให้ครอบคลุม machine cycle ครบทุกชนิด จะได้อธิบายได้ยาว ๆ และเก็บคะแนนได้เต็ม

5.1 ศัพท์ที่ต้องแยกให้ออก

เล็กสุด

T-state

1 คาบของ clock · ความยาว T = 1/f
ที่ 4 MHz ⇒ T = 0.25 µs
ที่ 2 MHz ⇒ T = 0.5 µs

กลาง

Machine cycle (M)

1 ครั้งที่ CPU ใช้บัส ทำอะไรสักอย่าง
มี 5 ชนิดหลัก: M1, Mem Read, Mem Write, I/O Read, I/O Write

ใหญ่สุด

Instruction cycle

คำสั่งหนึ่งคำสั่งตั้งแต่ fetch จนจบ execute
= ผลรวมของ machine cycle ทั้งหมดของคำสั่งนั้น

ประโยคสำคัญ

ทุก instruction cycle เริ่มด้วย M1 (Opcode Fetch) เสมอ แล้วต่อด้วย machine cycle อื่นตามที่คำสั่งต้องการ
โจทย์ขอ “4 Instruction Cycles” = คำสั่ง 4 คำสั่ง ไม่ใช่ 4 machine cycle

5.2 ตารางสัญญาณควบคุม — ต้องท่องให้ได้

Logic 0 = active, 1 = inactive, Z = high impedance

Machine CycleM1MREQ IORQRDWRT-state
Opcode Fetch (M1)001014
Memory Read101013
Memory Write101103
I/O Read110014 (มี Tw)
I/O Write110104 (มี Tw)
Interrupt Acknowledge010116 (แทรก 2 Tw)
Non-maskable Interrupt001015
Bus Acknowledge1ZZZZ—
อ่านตารางนี้ให้เป็น

แถวที่มี M1 = 0 และ IORQ = 0 พร้อมกัน คือ interrupt acknowledge — ไม่ใช่ I/O ธรรมดา สังเกตว่า RD กับ WR เป็น 1 ทั้งคู่ นั่นคือเหตุผลว่าทำไมการ gate ด้วย IORD/IOWR ถึงกัน INTACK ได้เอง

5.3 ไล่ดูทีละชนิด — กดเล่นได้

เลือกชนิดของ machine cycle แล้วกด เล่น เพื่อไล่ทีละขอบสัญญาณ แต่ละขั้นจะบอกว่าเกิดอะไรขึ้นที่ขอบไหนของ T-state ไหน

สามจุดที่ไดอะแกรมในสไลด์วาดคลาดเคลื่อน
  1. MREQ มี 2 พัลส์ใน M1 cycle — พัลส์แรกตอน fetch (T1↓ ถึง T3↑) และพัลส์ที่สองตอน refresh (T3↓ ถึง T4↓) หลายรูปวาดแค่พัลส์เดียว
  2. WR ช้ากว่า MREQ เต็ม 1 T-state ใน memory write (ไม่ใช่ครึ่ง T) — ที่เป็นครึ่ง T คือตอนปลด ซึ่ง WR ขึ้นก่อน address/data เปลี่ยน
  3. IORQ ลงที่ขอบขาขึ้นของ T2 ไม่ใช่ขอบขาลง — และลงพร้อม RD/WR เสมอใน I/O cycle

5.4 คำนวณเวลา

1 T-state       = 1 / f
เวลาของ machine cycle = (จำนวน T ของ cycle นั้น) × T
เวลาของ instruction   = (T-state รวมของคำสั่ง) × T

ตัวอย่าง f = 4 MHz  ⇒  T = 1/(4×10⁶) = 0.25 µs = 250 ns

OUT (40H),A = 11 T = M1(4) + Memory Read(3) + I/O Write(4)
            = 11 × 0.25 µs = 2.75 µs

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

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

จงวาด Timing Diagram ของคำสั่งที่ใช้ในการติดต่อหน่วยความจำ และอุปกรณ์ I/O รวม 4 Instruction Cycles พร้อมคำอธิบายมาอย่างละเอียด โดยให้กำหนดค่าข้อมูลอื่น ๆ ที่เกี่ยวข้องเองตามความเหมาะสม

เลือกคำสั่งยังไงให้ได้เปรียบ

เลือก 4 คำสั่งที่รวมกันแล้วครบทุกชนิดของ machine cycle — จะได้อธิบายได้ทุกกรณีในคำตอบเดียว และสอดคล้องกับวงจรที่วาดในข้อ 1 (พอร์ต 40H / 84H, RAM ที่ 1000H)

ค่าที่กำหนดเอง: clock = 4 MHz, สวิตช์อ่านได้ C3H, RAM ที่ 1000H เก็บ C3H

เฉลย — ไล่ทีละ instruction cycle

โปรแกรมที่เลือก (อยู่ใน ROM เริ่มที่ 0003H)

AddressMachine codeInstructionMachine cyclesT
0003HDB 84IN A,(84H)M1 + MemRead + I/O Read11
0005H32 00 10LD (1000H),AM1 + MemRead + MemRead + MemWrite13
0008H3A 00 10LD A,(1000H)M1 + MemRead + MemRead + MemRead13
000BHD3 40OUT (40H),AM1 + MemRead + I/O Write11
รวม 4 instruction cycles · 14 machine cycles48

ที่ 4 MHz ⇒ 48 × 0.25 µs = 12.00 µs

Instruction cycle ที่ 1 · IN A,(84H)

อธิบาย
  1. M1 (4T) — PC = 0003H ออกบัส, M1+MREQ+RD = 0, อ่าน opcode DBH ที่ขอบขาขึ้นของ T3, T3–T4 ทำ refresh + decode
  2. Memory Read (3T) — PC = 0004H อ่าน operand 84H (เลขพอร์ต)
  3. I/O Read (4T) — A0–A7 = 84H, A8–A15 = ค่าเดิมใน A, IORQ+RD = 0 ที่ T2↑, มี Tw แทรกอัตโนมัติ, อ่าน C3H จาก 74LS244 เข้า register A

Instruction cycle ที่ 2 · LD (1000H),A

อธิบาย
  1. M1 (4T) — อ่าน opcode 32H ที่ 0005H
  2. Memory Read (3T) — อ่าน 00H ที่ 0006H = ไบต์ต่ำของ address (little-endian)
  3. Memory Read (3T) — อ่าน 10H ที่ 0007H = ไบต์สูง ⇒ ได้ address 1000H
  4. Memory Write (3T) — วาง 1000H บนบัส, MREQ ลงที่ T1↓, CPU ขับ C3H ลง data bus, WR ลงที่ T2↓ (ช้ากว่า MREQ เต็ม 1 T) แล้วปลดที่ T3↓ ก่อน address เปลี่ยนครึ่ง T

Instruction cycle ที่ 3 · LD A,(1000H)

อธิบาย

โครงเหมือนคำสั่งที่ 2 ทุกประการ ต่างกันแค่ machine cycle สุดท้ายเป็น Memory Read แทน Memory Write — RD ลงพร้อม MREQ ที่ T1↓ (ไม่มีการหน่วง 1 T แบบตอนเขียน) และ data bus เปลี่ยนเป็นทิศทางเข้า CPU

Instruction cycle ที่ 4 · OUT (40H),A

อธิบาย
  1. M1 (4T) — อ่าน opcode D3H ที่ 000BH
  2. Memory Read (3T) — อ่าน 40H ที่ 000CH
  3. I/O Write (4T) — A0–A7 = 40H, A8–A15 = ค่าใน A (= C3H), CPU ขับ C3H ลง data bus ตั้งแต่ครึ่งหลังของ T1, IORQ และ WR ลงพร้อมกันที่ T2↑, มี Tw แทรก, ขอบขาขึ้นของ IOWR ตอนจบ T3 ใช้ clock ให้ 74LS273 เก็บค่า → LED ติดตามรหัส C3H
อย่าลืมเขียนสรุปตอนท้าย
  • 4 instruction cycles = 14 machine cycles = 48 T-state
  • ที่ f = 4 MHz ⇒ T = 0.25 µs ⇒ ใช้เวลารวม 12.00 µs
  • ครบทั้ง 5 ชนิดของ machine cycle: M1, Memory Read, Memory Write, I/O Read, I/O Write
  • สังเกตความต่าง: I/O cycle ยาว 4 T เพราะ Z80 แทรก Tw ให้เอง ส่วน memory cycle ยาว 3 T

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

ตัวอย่างที่ 1 · แบบที่อยู่ในสไลด์

Accumulator ของ Z80 เก็บค่า 9FH และ opcode ของคำสั่ง LD B,A คือ 0100 0111 (47H) เก็บไว้ที่ 2002H จงวาด timing diagram และอธิบายลำดับเหตุการณ์

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

LD B,A เป็นคำสั่ง 1 ไบต์ ใช้ M1 cycle เดียว 4 T เท่านั้น (ไม่มี memory access เพิ่ม)

ที่ 4 MHz ⇒ 4 × 0.25 = 1.00 µs · หลัง fetch เสร็จ PC เพิ่มเป็น 2003H อัตโนมัติ และ decode/execute เกิดใน T3–T4 พร้อม ๆ กับ refresh

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

machine code 3EH และ 9FH เก็บที่ 2000H และ 2001H (คือคำสั่ง LD A,9FH) จงวาด bus timing และหาเวลาของ opcode fetch, memory read และทั้ง instruction เมื่อ clock = 4 MHz

เฉลยตัวอย่างที่ 2
T-state = 1/f = 1/(4 MHz) = 0.25 µs

Opcode Fetch  : 4 × 0.25 = 1.00 µs
Memory Read   : 3 × 0.25 = 0.75 µs
ทั้ง instruction: 7 × 0.25 = 1.75 µs
ระวังเลขในสไลด์

สไลด์เขียนว่า “1001 1110 (9EH)” แต่ในกล่อง machine code เขียน 1001 1111 ซึ่งคือ 9FH — เลข 9E เป็นการพิมพ์ผิด ให้ยึด 9FH

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

Register HL เก็บ 2350H, accumulator เก็บ 9FH, instruction code 0111 0111 (77H) เก็บที่ 2003H จงวาด timing ของ LD (HL),A

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

2 machine cycle = M1 (4T) + Memory Write (3T) = 7 T = 1.75 µs ที่ 4 MHz

ระวังข้อความในสไลด์

สไลด์เขียนว่า “Z80 จะคัดลอก byte 9FH จาก accumulator ไปไว้ที่ memory ตำแหน่ง 77H” — ผิด! 77H คือ opcode ของคำสั่ง ตำแหน่งปลายทางคือค่าใน HL = 2350H ตามที่รูปวาดไว้ถูกแล้ว

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

จงวาด timing ของ OUT (07H),A ที่เก็บอยู่ตำแหน่ง 2050H พร้อมแสดงสัญญาณ IOWR ที่สร้างจากเกต และบอกว่า A8–A15 มีค่าอะไร

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

3 machine cycle: M1 (4T) + Memory Read (3T) + I/O Write (4T) = 11 T = 2.75 µs ที่ 4 MHz

คำตอบเรื่อง A8–A15

ในสไลด์วาด A15–A8 ไว้ว่างระหว่าง M3 แต่ความจริง Z80 วาง ค่าใน accumulator A ไว้ที่ A8–A15 ระหว่าง OUT (n),A (และวางค่าใน B ถ้าเป็น OUT (C),r)
⇒ ถ้า A = 9FH ตอนนั้น address bus เต็ม ๆ จะเป็น 9F07H

อ้างอิง: Sean Young, “The Undocumented Z80 Documented” — “IN A,(n) and OUT (n),A put A×256+n on the address bus”

ตัวอย่างที่ 5 · Memory-mapped I/O

คำสั่ง LD (8000H),A ที่ตำแหน่ง 2050H จงวาด timing ทั้ง 4 machine cycle พร้อมสัญญาณ MEMRD และ MEMWR

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

4 machine cycle: M1 (4T) + MemRead (3T) + MemRead (3T) + MemWrite (3T) = 13 T = 3.25 µs

จุดที่ควรชี้ให้เห็น
  • เพราะเป็น memory-mapped I/O จึงใช้ MREQ ไม่ใช่ IORQ — และไม่มี Tw แถม จึงเร็วกว่า OUT อยู่ 1 T ในรอบสุดท้าย
  • operand เก็บแบบ little-endian: 00H ก่อน แล้วค่อย 80H
  • สังเกตแถว MEMRD ว่าไม่ active ระหว่างช่วง refresh ทั้งที่ MREQ ลง — เพราะ RD ไม่ลงด้วย
← ข้อ 4 · Opcode ข้อ 6 · RAM ก่อน →