Com sys lab/control unit that works with registers

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
มาจาก com sys lab

ใช้เทมเพลตใหม่ ในแบบฝึกหัดนี้ control unit จะเชื่อมโยงกับส่วนอื่น ๆ ซับซ้อนขึ้น อ่าน instruction set ของ CPU ได้ที่นี่

หมายเหตุ มีการแก้ op-code format ของ ADD และ SUB (เพื่อไม่ให้ชนกับ NOP = 0x00)

สำหรับปฏิบัติการนี้ เราจะทยอยเพิ่มความสามารถของ Control Unit ให้รองรับคำสั่งที่ทำงานหลัก ๆ บน register เพื่อการทดสอบสามส่วนแรก เราจะกำหนดให้ register $1 มีค่าเป็น 1 ก่อน (เพราะจะได้มีค่าคงที่เอาไว้ใช้ประมวลผล) เราจะใช้คำสั่ง LDAI เพื่อแก้ข้อจำกัดนี้ในส่วนที่ 4

โครงสร้างของระบบ

ส่วนที่ 1: Load to $0, Store from $0

ให้แก้ส่วน control unit ให้รองรับคำสั่ง LDA และ STA

เพื่อทดสอบการออกแบบ control unit ในส่วนนี้เราจะใช้โค้ดในการเตรียมค่า register และคำสั่งใน instruction memory ดังด้านล่าง

  // set register $1 = 1
  reg.set(1,1);

  // set instruction memory
  rom.set(0,0x11);   // ADD $1     $0 = 1
  rom.set(1,0x8b);   // STA $3     $3 = 1
  rom.set(2,0x19);   // SUB $1     $0 = 0
  rom.set(3,0x13);   // ADD $3     $0 = 1
  rom.set(4,0x13);   // ADD $3     $0 = 2
  rom.set(5,0x8c);   // STA $4     $4 = 2
  rom.set(6,0x14);   // ADD $4     $0 = 4
  rom.set(7,0x19);   // SUB $1     $0 = 3
  rom.set(8,0x8d);   // STA $5     $5 = 3
  rom.set(9,0x84);   // LDA $4     $0 = 2
  rom.set(10,0x1d);  // SUB $5     $0 = -1 = 0x0f
  rom.set(11,0x8c);  // STA $4     $4 = 0xf

ตัวอย่าง signal การทำงานดูด้านล่าง (ในการทดสอบ สังเกตว่าเราสามารถไล่การทำงานจาก regw0 และ dataw0 เพื่อดูลำดับการเขียนค่าลงใน register file ได้)

Com-sys-lab-cpureg-aluregldst.png

ส่วนที่ 2: Unconditional short jump

ให้แก้ส่วน control unit ให้รองรับคำสั่ง JMP

เพื่อทดสอบการออกแบบ control unit ในส่วนนี้เราจะใช้โค้ดในการเตรียมค่า register และคำสั่งใน instruction memory ดังด้านล่าง

  // set register $1 = 1
  reg.set(1,1);

  // set instruction memory

  rom.set(0,0x11);   // ADD $1     $0 = 1
  rom.set(1,0xc3);   // JMP 3      PC = 4
  rom.set(2,0x19);   // SUB $1     
  rom.set(3,0x89);   // STA $1     
  rom.set(4,0x11);   // ADD $1     $0 = 2,3,4,...
  rom.set(5,0xcf);   // JMP -1     PC = 4

ตัวอย่าง signal การทำงานดูด้านล่าง (ในการทดสอบ สังเกตว่าเราสามารถไล่การทำงานจาก inst_addr, regw0, และ dataw0 เพื่อดูลำดับการเขียนค่าลงใน register file ได้)

Com-sys-lab-cpureg-unconjump.png

ส่วนที่ 3: Jump if zero และ NOP

ให้แก้ส่วน control unit ให้รองรับคำสั่ง NOP และ JZ

เพื่อทดสอบการออกแบบ control unit ในส่วนนี้เราจะใช้โค้ดในการเตรียมค่า register และคำสั่งใน instruction memory ดังด้านล่าง

  // set register $1 = 1
  reg.set(1,1);

  // set instruction memory

  rom.set(0,0x11);   // ADD $1     $0 = 1
  rom.set(1,0xc3);   // JMP 3      PC = 4
  rom.set(2,0x19);   // SUB $1     
  rom.set(3,0x89);   // STA $1     
  rom.set(4,0x11);   // ADD $1     $0 = 2,3,4,...
  rom.set(5,0xd2);   // JZ  2      PC = 7 if $0 = 0
  rom.set(6,0xce);   // JMP -2     PC = 4
  rom.set(7,0x00);   // NOP
  rom.set(8,0xcf);   // JMP -1     PC = 7

ตัวอย่าง signal การทำงานดูด้านล่างซึ่งแสดงส่วนของการทำงานที่มีการสั่ง JZ (เมื่อ $0=0) และลูประหว่างคำสั่งที่ตำแหน่ง 7 และ 8 (ในการทดสอบ สังเกตว่าเราสามารถไล่การทำงานจาก inst_addr, regw0, และ dataw0 เพื่อดูลำดับการเขียนค่าลงใน register file ได้)

Com-sys-lab-cpureg-conjump.png

ส่วนที่ 4: Load immediate