โจทย์บอกว่า “ให้กำหนดค่าข้อมูลอื่น ๆ ที่เกี่ยวข้องเองตามความเหมาะสม” แปลว่าเราเลือกคำสั่ง เลือก address เลือกข้อมูล และเลือกความถี่ clock ได้เอง — ควรเลือกให้ครอบคลุม machine cycle ครบทุกชนิด จะได้อธิบายได้ยาว ๆ และเก็บคะแนนได้เต็ม
1 คาบของ clock · ความยาว T = 1/f
ที่ 4 MHz ⇒ T = 0.25 µs
ที่ 2 MHz ⇒ T = 0.5 µs
1 ครั้งที่ CPU ใช้บัส ทำอะไรสักอย่าง
มี 5 ชนิดหลัก: M1, Mem Read, Mem Write, I/O Read, I/O Write
คำสั่งหนึ่งคำสั่งตั้งแต่ fetch จนจบ execute
= ผลรวมของ machine cycle ทั้งหมดของคำสั่งนั้น
ทุก instruction cycle เริ่มด้วย M1 (Opcode Fetch) เสมอ
แล้วต่อด้วย machine cycle อื่นตามที่คำสั่งต้องการ
โจทย์ขอ “4 Instruction Cycles” = คำสั่ง 4 คำสั่ง ไม่ใช่ 4 machine cycle
Logic 0 = active, 1 = inactive, Z = high impedance
| Machine Cycle | M1 | MREQ | IORQ | RD | WR | T-state |
|---|---|---|---|---|---|---|
| Opcode Fetch (M1) | 0 | 0 | 1 | 0 | 1 | 4 |
| Memory Read | 1 | 0 | 1 | 0 | 1 | 3 |
| Memory Write | 1 | 0 | 1 | 1 | 0 | 3 |
| I/O Read | 1 | 1 | 0 | 0 | 1 | 4 (มี Tw) |
| I/O Write | 1 | 1 | 0 | 1 | 0 | 4 (มี Tw) |
| Interrupt Acknowledge | 0 | 1 | 0 | 1 | 1 | 6 (แทรก 2 Tw) |
| Non-maskable Interrupt | 0 | 0 | 1 | 0 | 1 | 5 |
| Bus Acknowledge | 1 | Z | Z | Z | Z | — |
แถวที่มี M1 = 0 และ IORQ = 0 พร้อมกัน คือ interrupt acknowledge — ไม่ใช่ I/O ธรรมดา สังเกตว่า RD กับ WR เป็น 1 ทั้งคู่ นั่นคือเหตุผลว่าทำไมการ gate ด้วย IORD/IOWR ถึงกัน INTACK ได้เอง
เลือกชนิดของ machine cycle แล้วกด เล่น เพื่อไล่ทีละขอบสัญญาณ แต่ละขั้นจะบอกว่าเกิดอะไรขึ้นที่ขอบไหนของ T-state ไหน
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
จงวาด Timing Diagram ของคำสั่งที่ใช้ในการติดต่อหน่วยความจำ และอุปกรณ์ I/O รวม 4 Instruction Cycles พร้อมคำอธิบายมาอย่างละเอียด โดยให้กำหนดค่าข้อมูลอื่น ๆ ที่เกี่ยวข้องเองตามความเหมาะสม
เลือก 4 คำสั่งที่รวมกันแล้วครบทุกชนิดของ machine cycle — จะได้อธิบายได้ทุกกรณีในคำตอบเดียว และสอดคล้องกับวงจรที่วาดในข้อ 1 (พอร์ต 40H / 84H, RAM ที่ 1000H)
ค่าที่กำหนดเอง: clock = 4 MHz, สวิตช์อ่านได้ C3H, RAM ที่ 1000H เก็บ C3H
| Address | Machine code | Instruction | Machine cycles | T |
|---|---|---|---|---|
| 0003H | DB 84 | IN A,(84H) | M1 + MemRead + I/O Read | 11 |
| 0005H | 32 00 10 | LD (1000H),A | M1 + MemRead + MemRead + MemWrite | 13 |
| 0008H | 3A 00 10 | LD A,(1000H) | M1 + MemRead + MemRead + MemRead | 13 |
| 000BH | D3 40 | OUT (40H),A | M1 + MemRead + I/O Write | 11 |
| รวม 4 instruction cycles · 14 machine cycles | 48 | |||
ที่ 4 MHz ⇒ 48 × 0.25 µs = 12.00 µs
IN A,(84H)DBH ที่ขอบขาขึ้นของ T3, T3–T4 ทำ refresh + decode84H (เลขพอร์ต)C3H จาก 74LS244 เข้า register ALD (1000H),A32H ที่ 0005H00H ที่ 0006H = ไบต์ต่ำของ address (little-endian)10H ที่ 0007H = ไบต์สูง ⇒ ได้ address 1000HC3H ลง data bus, WR ลงที่ T2↓ (ช้ากว่า MREQ เต็ม 1 T)
แล้วปลดที่ T3↓ ก่อน address เปลี่ยนครึ่ง TLD A,(1000H)โครงเหมือนคำสั่งที่ 2 ทุกประการ ต่างกันแค่ machine cycle สุดท้ายเป็น Memory Read แทน Memory Write — RD ลงพร้อม MREQ ที่ T1↓ (ไม่มีการหน่วง 1 T แบบตอนเขียน) และ data bus เปลี่ยนเป็นทิศทางเข้า CPU
OUT (40H),AD3H ที่ 000BH40H ที่ 000CHC3H ลง data bus ตั้งแต่ครึ่งหลังของ T1,
IORQ และ WR ลงพร้อมกันที่ T2↑,
มี Tw แทรก, ขอบขาขึ้นของ IOWR ตอนจบ T3 ใช้ clock ให้ 74LS273 เก็บค่า → LED ติดตามรหัส C3HAccumulator ของ Z80 เก็บค่า 9FH และ opcode ของคำสั่ง LD B,A
คือ 0100 0111 (47H) เก็บไว้ที่ 2002H จงวาด timing diagram และอธิบายลำดับเหตุการณ์
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
machine code 3EH และ 9FH เก็บที่ 2000H และ 2001H
(คือคำสั่ง LD A,9FH) จงวาด bus timing และหาเวลาของ opcode fetch, memory read
และทั้ง instruction เมื่อ clock = 4 MHz
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
Register HL เก็บ 2350H, accumulator เก็บ 9FH, instruction code
0111 0111 (77H) เก็บที่ 2003H จงวาด timing ของ LD (HL),A
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 ตามที่รูปวาดไว้ถูกแล้ว
จงวาด timing ของ OUT (07H),A ที่เก็บอยู่ตำแหน่ง 2050H
พร้อมแสดงสัญญาณ IOWR ที่สร้างจากเกต และบอกว่า A8–A15 มีค่าอะไร
3 machine cycle: M1 (4T) + Memory Read (3T) + I/O Write (4T) = 11 T = 2.75 µs ที่ 4 MHz
ในสไลด์วาด 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”
คำสั่ง LD (8000H),A ที่ตำแหน่ง 2050H
จงวาด timing ทั้ง 4 machine cycle พร้อมสัญญาณ MEMRD และ MEMWR
4 machine cycle: M1 (4T) + MemRead (3T) + MemRead (3T) + MemWrite (3T) = 13 T = 3.25 µs
OUT อยู่ 1 T ในรอบสุดท้าย00H ก่อน แล้วค่อย 80H