Computer Organization Lecture 2 - 3 กันยายน 2014
- สถาปัตยกรรม Von Neumann:
- นาย Von Neumann ได้กล่าวถึงคอขวดในระบบคอมพิวเตอร์ที่เกิดขึ้นระหว่าง CPU และหน่วยความจำ เนื่องจาก CPU สามารถคำนวณได้อย่างรวดเร็วมาก แต่หน่วยความจำกลับเก็บข้อมูลได้ช้ากว่า
- ในสถาปัตยกรรม Von Neumann จะแบ่ง CPU ออกเป็นสองส่วน ได้แก่
- ส่วนควบคุม (Control)
- เส้นทางข้อมูล (Data path) - ประกอบด้วย ALU (Arithmetic Logic Unit -- หน่วยตรรกะทางคณิตศาสตร์) และรีจิสเตอร์ (ที่พักข้อมูลที่ใช้คำนวณ)
- การทำงานของส่วนควบคุม:
- รับคำสั่ง (Fetch): รับคำสั่งจากหน่วยความจำ (เช่น แรม) ฉะนั้นแล้วแรมจะเก็บทั้งโค้ดโปรแกรมและข้อมูล คำสั่งที่ได้จะถูกเก็บไว้ใน IR (Instruction Register ซึ่งเป็นที่เก็บข้อมูลพิเศษสำหรับเก็บคำสั่งไว้ใน CPU)
- ถอดรหัส (Decode): จำแนกชนิดคำสั่งที่ได้รับมา
- ปฏิบัติ (Exec): ส่งสัญญาณไปยังส่วนที่เกี่ยวข้องให้ทำงานตามคำสั่งที่ได้รับ
- ตัวอย่างเช่น ถ้าได้รับคำสั่ง
ADD
ส่วนควบคุมจะส่งสัญญาณให้ ALU ทำการบวก - มีคำสั่งอยู่สองประเภท 2:
- ควบคุมคำสั่งของ CPU
- ควบคุมแหล่งที่มาของข้อมูล
- หน้าที่ของส่วนควบคุม:
- รับคำสั่งจากหน่วยความจำ
- ส่งสัญญาณไปยังส่วนต่างๆ
- ควบคุมการทำงานของโปรแกรมด้วยคำสั่ง
JUMP
และBRANCH
- Datapath ประกอบด้วย:
- ส่วนปฏิบัติงาน: หน่วยที่ทำงานต่างๆ เช่น ALU, Register file (หน่วยเก็บข้อมูล)
- การเชื่อมต่อ: เชื่อมต่อไปยังแหล่งข้อมูลต่างๆ
RISC
RISC ย่อมาจาก Reduced Instruction Set Computer คอมพิวเตอร์ที่มีชุดคำสั่งลดลง
- มีความยาวของคำสั่งคงที่ (32 บิต)
- มีวิธีเข้าถึงหน่วยความจำจำกัด
ข้อจำกัดเหล่านี้มีไว้เพื่อให้ฮาร์ดแวร์เล็กและเรียบง่าย เพื่อที่จะทำงานได้อย่างรวดเร็ว
สถาปัตยกรรมชุดคำสั่ง MIPS R3000 (ISA)
- ประเภทของคำสั่ง
- คำนวณ - เกี่ยวกับ ALU เช่น
ADD
SUB
MUL
- โหลด/เก็บ - เกี่ยวกับหน่วยความจำ
- กระโดด และแตกกิ่ง - กระโดด (Jump) คือให้ไปที่ตำแหน่งที่ระบุ ส่วนแตกกิ่ง (Branch) คือการกระโดดไปยังตำแหน่งที่ระบุอย่างมีเงื่อนไข
- รูปแบบของชุดคำสั่งมีขนาด 32 บิต
- R format:
OP rs rt rd sa funct
- I format:
OP rs rt immediate
- J format:
OP jumptarget
การแปลงเลขฐานสอง
1 1 1 1
2^3 2^2 2^1 2^0
8 + 4 + 2 + 1 = 15
or 2^4 - 1
1 1 1 1 1 1 1 1
2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0
128+64+ 32+ 16+ 8 + 4 + 2 + 1 = 255
or 2^8 - 1
สามารถอ่านค่าจากฐาน 2 เป็นฐาน 16 ได้โดยจัดกลุ่มละ 4 แล้วอ่านรวมแต่ละชุด
1 1 1 1 1 1 1 1
---sum=15---- ----sum=15---
F F
เราเรียกตัวเลขที่มีค่านัยสำคัญมากที่สุด (เลขซ้ายสุด) ว่า MSB - Most Significant Bit และเลขที่มีค่านัยสำคัญน้อยที่สุด (เลขขวาสุด) ว่า LSB - Least Significant Bit
คำสั่งทางคณิตศาสตร์ของ MIPS
add $t0, $s1, $s2
sub $t0, $s1, $s2
(ให้บวก/ลบค่าใน $s1 และ $s2 แล้วบันทึกไปยัง $t0)
คำสั่งทางคณิตศาสตร์แต่ละตัวจะทำแค่เครื่องหมายเดียวเท่านั้น สัญลักษณ์ $
มีไว้เพื่อบอกว่าตำแหน่งนั้นอยู่ใน register file
คำสั่งบวกในภาษาเครื่อง
เทียบคำสั่งบวกกับ R format ซึ่งใช้ในกระบวนการทางคณิตศาสตร์
- op:
add
- rs:
$s1
- rt:
$s2
- rd:
$t0
- shamt
-
funct:
add
-
op มีขนาด 6 บิตไว้ระบุคำสั่ง - operation
- rs มีขนาด 5 บิตไว้ระบุตำแหน่งในรีจิสเตอร์ของตัวเลขตัวแรก - register file address of the first source operand
- rt มีขนาด 5 บิตไว้ระบุตำแหน่งในรีจิสเตอร์ของตัวเลขตัวที่สอง - register file address of the second source operand
- rd มีขนาด 5 บิตไว้ระบุตำแหน่งรีจิสเตอร์ที่ไว้เก็บผลลัพท์ - register file address of the result's destination
- shamt มีขนาด 5 บิตสำหรับระบุปริมาณที่ต้องการเลื่อน shift amount (สำหรับคำสั่ง shift)
- funct มีขนาด 6 บิตสำหรับระบุฟังก์ชั่นที่ทำงานกับ opcode นั้น - function code augmenting the opcode
MIPS Register file
- มีรีจิสเตอร์ขนาด 32 บิตจำนวน 32 ตัว
- อยู่ภายใน ALU
- มีพอร์ทเขียน 1 พอร์ต และพอร์ตอ่าน 2 พอร์ต
- พอร์ตรับข้อมูลเข้า:
src1 addr
,src2 addr
,dst addr
(ทั้งหมดขนาด 5 บิต),write data
(ขนาด 32 บิต),write control
(ขนาด 1 บิต) - พอร์สสำหรับส่งออกข้อมูล:
src1 data
,src2 data
(ทั้งหมดขนาด 32 บิต) - มีสัญญาณ
write control
หนึ่งบิต - ถ้า
write control
เปิด ข้อมูลที่ส่งเข้ามาทางพอร์ตwrite data
จะถูกเขียนลงในตำแหน่งที่ระบุมาทางพอร์ตdst addr
-
ถ้า
write control
ปิด ข้อมูลที่ส่งเข้ามาทางพอร์ตsrc1 addr
และsrc2 addr
จะถูกส่งไปยังพอร์ตsrc1 data
และsrc2 data
-
คุณสมบัติของรีจิสเตอร์
- ไวกว่าหน่วยความจำ (รีจิสเตอร์ที่มีขนาดใหญ่กว่าจะทำงานช้ากว่ารีจิสเตอร์ขนาดเล็กกว่า)
- คอมไพเลอร์ทำงานได้สะดวกกว่า
- เรียกง่ายกว่าตำแหน่งในหน่วยความจำ
คำสั่งเข้าถึงหน่วยความจำของ MIPS
คำสั่งโหลด
lw $t0, 4($s3)
โหลด word มาจากตำแหน่งที่ (ค่าของรีจิสเตอร์ $s3
+ 4
) ไปยังรีจิสเตอร์ $t0
คำสั่งบันทึก
sw $t0, 8($s3)
บันทึกค่าใน $t0
ไปยังหน่วยความจำตำแหน่งที่ (ค่าของรีจิสเตอร์ $s3
+ 8
)
- ตำแหน่งของหน่วยความจำมีขนาด 32 บิต มาจากค่าของรีจิสเตอร์ฐาน บวกกับค่า offset ซึ่งสามารถเป็นได้ทั้งบวกและลบ
- offset ขนาด 16 บิต ทำให้สามารถเข้าถึงตำแหน่งได้ไม่เกิน +-2^12 words (+-2^15 bytes) จากค่าของรีจิสเตอร์ฐาน
ตัวอย่างเช่น:
- รีจิสเตอร์ฐาน
$s3
มีค่า 1000 4($s3)
หมายความว่าให้เข้าถึงตำแหน่งที่ 1000 + 4 = 1004- ในการเขียนลูปอาจจะกลับข้างกันใช้
1000($s3)
แล้วเลื่อน$s3
ในแต่ละลูปไปทีละ 4 เพื่อเข้าถึงตำแหน่งที่ 1000, 1004, 1008, ...
คำสั่งนี้ใช้รูปแบบ I format
- op:
lw
- rs:
$s2
- rt:
$t0
- 16-bit offset: 4
คำสั่งเงื่อนไข
bne $s0, $s1, Lbl
: Go toLbl
if$s0
!=$s1
beq $s0, $s1, Lbl
: Go toLbl
if$s0
==$s1
ตัวอย่างเช่น
if(i == j){
h = i+j;
}
เทียบเท่ากับ
bne $s0, $s1, Lbl1
add $s3, $s0, $s1 ; $s3 = $s0+$s1
Lbl1: ...
คำสั่งนี้ใช้รูปแบบ I format
- op:
bne
/beq
- rs:
$s0
- rt:
$s1
- 16 bit offset: ตำแหน่งระหว่าง
Lbl
กับคำสั่งถัดไป
ที่ใช้ offset เทียบกับคำสั่งถัดไปจาก bne
/beq
ก็เพราะว่าเมื่อมีการอ่านคำสั่งมาแล้ว ตัวรีจิสเตอร์ที่เก็บ instruction address จะเลื่อนไปยังตำแหน่งถัดไปโดยอัตโนมัติ
และเนื่องจาก offset นั้นมีขนาด 16 บิตจึงสามารถกระโดดไปได้ไม่เกิน +- 2^15-1 คำสั่งจากคำสั่งถัดไป