next up previous contents index
Next: ค่า CPI ในโปรเซสเซอร์แบบหลายวงรอบสัญญาณนาฬิกา Up: โปรเซสเซอร์แบบทำงานหลายวงรอบ Previous: โปรเซสเซอร์แบบทำงานหลายวงรอบ   Contents   Index

การแบ่งการประมวลผลออกเป็นส่วนๆ สำหรับการทำงานของโปรเซสเซอร์แบบหลายวงรอบสัญญาณนาฬิกา

จากรูปที่ 5.30 เราจะมาพิจารณาการทำงานในแต่ละวงรอบของการประมวลผลในโปรเซสเซอร์แบบหลายวงรอบ โดยมีจุดมุ่งหมายในการเพิ่มประสิทธิภาพการทำงาน เริ่มจากทำการแบ่งส่วนการทำงานออกให้มีการประมาณการทำงานเท่ากัน ตัวอย่างเช่นการทำงานของ ALU Operationหนึ่งครั้ง, Register File Access หนึ่งครั้ง, หรือ Memory Access หนึ่งครั้ง โดยที่สัญญาณนาฬิกาต้องครอบคลุมการทำงานดังกล่าวที่ยาวที่สุด หลังจากการทำงานในแต่ละวงรอบ ข้อมูลที่ประมวลผลได้จะถูกเก็บไว้ในรีจีสเตอร์ แต่เนื่องจากเราใช้งานวงจรที่ทำงานตามขอบสัญญาณนาฬิกา การทำงานของวงจรยังคงถูกต้องอยู่

ในการทำงานตามคำสั่งของคอมพิวเตอร์ MIPS ในโปรเซสเซอร์แบบหลายวงรอบสัญญาณนาฬิกามีการทำงาน สาม ถึง ห้า วงรอบการทำงานสัญญาณนาฬิกา โดยประกอบด้วยขั้นตอนดังต่อไปนี้

  1. ขั้นตอน Instruction Fetch

    ทำการอ่านคำสั่งจากหน่วยความจำและคำนวณแอดเดรสสำหรับคำสั่งต่อไป

        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 ใหม่จะไม่ปรากฎจนกว่าจะขึ้นวงรอบใหม่

  2. ขั้นตอน Instruction Decode และ Register Fetch

    การงานทุกคำสั่งจำเป็นต้องทำ 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

  3. ขั้นตอน Execution, Memory Address Computation, หรือ Branch Completion

    ในขั้นตอนนี้เป็นขั้นตอนแรกที่แต่ละคำสั่งทำงานต่างกัน ซึ่งขั้นอยู่กับว่าเป็นคำสั้งประเภทใดในการทำงาน โดยเราแบ่งคำสั่งออกเป็นชุดต่างๆ

    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

  4. ขั้นตอน Memory Access หรือ R-Type Instruction Completion Step:

    ในขั้นตอนนี้ คำสั่ง 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 ในการทำงาน

  5. ขั้นตอน Memory Read Completion

    ในขั้นตอนนี้เป็นการเขียนค่าที่ได้จากการอ่านค่าจากหน่วยความจำลงใน 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 ในการออกแบบ


next up previous contents index
Next: ค่า CPI ในโปรเซสเซอร์แบบหลายวงรอบสัญญาณนาฬิกา Up: โปรเซสเซอร์แบบทำงานหลายวงรอบ Previous: โปรเซสเซอร์แบบทำงานหลายวงรอบ   Contents   Index
Vara Varavithya 2006-11-06