จากรูปที่ 5.30 เราจะมาพิจารณาการทำงานในแต่ละวงรอบของการประมวลผลในโปรเซสเซอร์แบบหลายวงรอบ โดยมีจุดมุ่งหมายในการเพิ่มประสิทธิภาพการทำงาน เริ่มจากทำการแบ่งส่วนการทำงานออกให้มีการประมาณการทำงานเท่ากัน ตัวอย่างเช่นการทำงานของ ALU Operationหนึ่งครั้ง, Register File Access หนึ่งครั้ง, หรือ Memory Access หนึ่งครั้ง โดยที่สัญญาณนาฬิกาต้องครอบคลุมการทำงานดังกล่าวที่ยาวที่สุด หลังจากการทำงานในแต่ละวงรอบ ข้อมูลที่ประมวลผลได้จะถูกเก็บไว้ในรีจีสเตอร์ แต่เนื่องจากเราใช้งานวงจรที่ทำงานตามขอบสัญญาณนาฬิกา การทำงานของวงจรยังคงถูกต้องอยู่
ในการทำงานตามคำสั่งของคอมพิวเตอร์ MIPS ในโปรเซสเซอร์แบบหลายวงรอบสัญญาณนาฬิกามีการทำงาน สาม ถึง ห้า วงรอบการทำงานสัญญาณนาฬิกา โดยประกอบด้วยขั้นตอนดังต่อไปนี้
ทำการอ่านคำสั่งจากหน่วยความจำและคำนวณแอดเดรสสำหรับคำสั่งต่อไป
IR <= Memory[PC];
PC <= PC + 4;
เริ่มจากส่งค่า PC ไปยังหน่วยความจำ และทำการอ่านหน่วยความจำนั้น จากนั้นทำการเขียนคำสั่งลงใน Instruction Register (IR) และทำการบวกค่า PC ด้วยค่า 4 การทำงานในขั้นตอนนี้ ต้องทำการตั้งค่าสัญญาณควบคุม MemRead และ IRWrite จากนั้นทำการตั้งค่า IorD เป็น เพื่อทำการเลือกค่า PC เป็นแอดเดรสที่จะป้อนให้หน่วยความจำ และตั้งค่า ALUSrcA เป็น 0 และ ALUSrcB เป็น 01 อีกทั้งตั้งค่า ALUOp เป็น 00 สุดท้ายเราต้องส่งค่า PC ที่เพิ่มค่าใหม่กลับเข้าไป โดยการตั้งค่า PC Source เป็น 00 และตั้งค่า PC Write โดยค่า PC ใหม่จะไม่ปรากฎจนกว่าจะขึ้นวงรอบใหม่
การงานทุกคำสั่งจำเป็นต้องทำ Instruction Fetch ซึ่งการทำงานในขั้นตอนต่างเป็นการทำงานที่จำเป็นสำหรับขั้นตอนนั้นๆ อย่างไรก็ตามการทำงานบางอย่างไม่เป็นผลเสียหรือส่งผลกระทบต่อการทำงานของวงรอบต่อไป เช่น การอ่านค่ารีจีสเตอร์ rs และ rt ซึ่งสามารถอ่านค่าโดยที่ว่าจำเป็นต้องใช้หรือไม่ โดยที่เมื่ออ่านค่าได้แล้วจะเป็บไว้ในรีจีสเตอร์ A และ B
ในวงรอบนี้เราสามารถคำนวณ Branch Target Address โดย ALU ซึ่งเราสามารถใช้งานในกรณีที่เป็นคำสั่ง Branch ในกรณีที่เป็นคำสั่งอื่นเราจะไม่สนใจค่าที่คำนวณได้ โดยที่ค่าที่ได้จะเก็บไว้ใน ALUOut
การประมวลผลต่างๆ ดังกล่าวขั้นต้น ที่ไม่ส่งผลเสียในการทำงาน มีรายละเอียดดังนี้
A <= Reg[IR[25:31]];
B <= Reg[IR[20:16]];
ALUOut <= PC + (sign-extend (IR[15-0]) << 2);
โดยทำการอ่านค่ารีจีสเตอร์ rs และ rt จาก Register File และเก็บค่าที่ได้ไว้ในรีจีสเตอร์ A และ B โดยที่ค่าในรีจีสเตอร์ A และ B จะถูกเขียนทุกวงรอบ ในขั้นตอนนี้จะทำการคำนวณ ALUOut ด้วยและจะถูกใช้งานในวงรอบต่อไปในกรณีที่เป็นคำสั่ง Branch โดยตั้งค่า ALUSrcA เป็น 0, ALUSrcB เป็น 11, และค่า ALUOp เป็น 00
ในขั้นตอนนี้เป็นขั้นตอนแรกที่แต่ละคำสั่งทำงานต่างกัน ซึ่งขั้นอยู่กับว่าเป็นคำสั้งประเภทใดในการทำงาน โดยเราแบ่งคำสั่งออกเป็นชุดต่างๆ
Memory Reference:
ALUOut <= A + sign-extend (IR[15:0]);
ALU ทำการบวกค่าที่ได้เพื่อคำนวณค่าแอดเดรสของหน่วยความจำ โดยตั้งค่า ALUSrcA เป็น 1 และ ALUSrcB เป็น 10 อีกทั้งค่า ALUOp เป็น 00 สำหรับการบวก
Arithmetic-logical Instruction (R-Type):
ALUOut <= A op B;
สำหรับในคำสั่งกลุ่มนี้ ALU ทำการคำนวณผลตาม function code ที่ระบุในคำสั่ง โดยใช้ค่าที่อ่านได้จากรีจีสเตอร์ในวงรอบก่อนหน้า ซึ่งการทำงานดังกล่าวทำโดยการตั้งค่า ALUSrcA เป็น 1 และ ALUSrcB เป็น 00 อีกทั้งค่า ALUOp เป็น 10
Branch:
if (A == B) PC <= ALUOut;
ในกรณีนี้ ALU จะถูกใช้สำหรับทำการเปรียบเทียบรีจีสเตอร์สองตัวที่อ่านได้ว่าเท่ากันหรือไม่ สัญญาณ Zero เป็นตัวบอกว่าจะทำ Branch หรือไม่ มีการตั้งค่า ALUSrcA เป็น 1 และ ALUSrcB เป็น 00 อีกทั้งค่า ALUOp เป็น 01 สำหรับทดสอบเท่ากัน และตั้งค่าสัญญาณ PCWriteCond สำหรับเปลี่ยนค่า PC ในกรณี มีการให้สัญญาณ Zero ค่า PCSource จะมีค่าเท่ากับ 01 เพื่อเขียนค่า ALUOut ลงไปใน PC จะเป็นได้ว่ามีการเขียน PC ในสองขั้นตอนได้แก่การเขียนจาก PC หลังทำการบวก 4 และหลังการคำนวณค่าที่ได้ใหม่จากการทำ Branch
jump:
bit fields x and y
PC <= {PC[31:28], (IR[25:0]], 2'b00)};
ค่าใน PC จะถูกแทนที่ด้วยแอดเดรสในการ Jump ทำการตั้งค่า PCSource ให้เขียน Jump Address ลงใน PC โดยตรง และตั้งค่า PCWrite
ในขั้นตอนนี้ คำสั่ง load หรือ store จะเข้าในงานหน่วยความจำ ส่วนของคำสั่ง R-Type จำทำการเขียนผลที่คำนวณได้กลับเข้าไปใน Register File เมื่อเกิดการอ่านค่าจากหน่วยความจำผลที่ได้จะถูกเก็บไว้ใน Memory Data Register (MDR) สำหรับการใช้งานในวงรอบต่อไป
Memory Reference:
ADR <= Memory [ALUOut];
หรือ
Memory [ALUOut] <= B;
ในคำสั่ง load ข้อมูลที่อ่านได้หนึ่ง Word จากหน่วยความจำจะถูกเขียนลงใน MDR ส่วนคำสั่ง Store ข้อมูลจะถูกเขียนลงในหน่วยความจำ โดยทั้งสองกรณีจะใช้ค่าแอดเดรสจากการคำนวณในรอบที่แล้วที่อยู่ใน ALUOut สำหรับคำสั่ง Store ข้อมูลที่ถูกจัดเก็บอยู่ในรีจีสเตอร์ B สายสัญญาณ MemRead หรือ MemWrite จะถูกตั้งค่าตามความเหมาะสม
Arithmetic-logical Instruction (R-Type):
Reg[IR[15:11]] <= ALUOut;
จากค่า ALUOut ที่ทำการคำนวณได้จาก ALU ตาม function code ในคำสั่งจากวงรอบห่อนหน้า จะถูกนำมาเขียนลง Register File โดยตั้งค่า RegDst ให้เป็น 1 เพื่อให้ค่า IR[15:11] ถูกนำมาเลือกค่า Write Register ค่า RegWrite จะต้องถูกตั้งค่า และ MemtoReg มีค่าเป็น 0 ในการทำงาน
ในขั้นตอนนี้เป็นการเขียนค่าที่ได้จากการอ่านค่าจากหน่วยความจำลงใน Register File
load:
Reg[IR[20:16] <= MDR;
ในการเขียนค่าที่อ่านได้จากหน่วยความจำที่อยู่ใน MDR จากวงรอบก่อนหน้า ทำโดยการตั้งค่า MemtoReg เป็น 1 และตั้งค่า RegWrite อีกทั้งค่า RegDst = 0 เพื่อเลือก rt (IR[20:16]) เป็นรีจีสเตอร์ที่ทำการเขียน
การออกแบบชุดควบคุมสามารถออกแบบโดยใช้ Finite State Machine หรือ Microprogramming ซึ่งสามารถนำไปสร้างบน ROM, PLA หรือ ใช้โปรแกรม CAD ในการออกแบบ