Computer System
Concept
Chapter 1 : Computer Architecture
1.
History
of Computer
1.1.
Mechanical
Era (1600-1940)
1.2.
Electronic
Era
1.2.1.
Generation
1 (1945-1958) ENIAC, IAS
1.2.2.
Generation
2 (1958-1964)
1.2.3.
Generation
3 (1964-1974)
1.2.4.
Generation
4 (1974-present)
1.2.5.
Generation
5 (?-?)
2.
Computer
Performance measurement :
2.1.
Memory
Bandwidth bits per second
2.2.
MIPS
Million Instruction Per Second (แต่จะ Base on
Instruction set ของแต่ CPU ที่ต่างกันด้วย)
2.3.
MFLOPS
Million of Floating point operation per second แต่ก็ยัง Base
on Instruction set อยู่ดี
2.4.
Program
for performance analysis
1.
ส่วนประกอบหลักของ
Computer
1.1.
CPU
(ALU, Control unit)
1.2.
Memories
1.3.
I/O
devices
1.4.
Interconnection
structures
2.
Von
Neumanns architecture
: used the memory of the computer to store the sequence of the control signal
manipulations required to perform a task software programming >> Both
data and instructions (control sequence) are stored in a single read-write
memory
3.
A
cycle of instruction execution : Fetch à Decode à Execute à Write back
4.
Interrupt : จะเกิดที่ท้าย
cycle ทุก instruction เสมอ
โดยก่อนที่จะกระโดดไปทำงานตาม Interrupt อื่นที่เข้ามา
มันจะต้อง Save ข้อมูลที่อยู่ใน Register เก็บไว้ก่อน ไม่งั้น จะมีข้อมูลอื่นมาทับแทน
5.
Interrupt : Processor and OS
จะเป็นคนคอยจัดการ recognizing an interrupt, suspending the
user program, service the interrupt and then resuming the user program
6.
Interrupt : ประโยชน์คือ
ทำให้ Performance ดีขึ้น เพราะทำให้ I/O กับ CPU ทำงานพร้อมกันได้ นั่นคือในขณะที่ รอ I/O
ทำงานอยู่ CPU ก็จะทำงานอื่นไปด้วย ถ้า I/O
เสร็จเมื่อไหร่ก็ค่อยไปบอกให้ CPU มาจัดการต่อ
7.
ISR
Interrupt Service Routine มีได้หลายตัว
แต่ Interrupt signal มันจะมีแค่ตัวเดียว
ดังนั้นจึงต้องอาศัย IRQ (Interrupt vector) มากำกับว่าเมื่อเกิด
Interrupt แล้วต้องกระโดดไปทำงานที่ ISR ตัวไหน
8.
Multiple
interrupt
กรณีที่มี Interrupt เกิดซ้อนกันมา CPU
อาจทำ2แบบนี้คือ อย่างแรก
มันอาจไม่สนใจตัวที่มาทีหลังจนกว่าตัวแรกจะเสร็จก่อน หรือ ถ้าตัวที่มาทีหลังมี Priority
ที่สูงกว่า มันก็จะหันไปทำงานตัวที่มาทีหลังแทน
9.
Priority : การจัด
Priority ของ Interrupt ของ I/O
device ต่างๆนั้นทำได้2แบบ หลักๆคือ
อย่างแรกใช้ daisy chain อย่างที่สองใช้ Interrupt
controller
10.
Bus
interconnection
: เป็น Share media , แบ่งเป็น 4 ประเภท Address bus, Data bus, Control bus, miscellaneous bus
(power, ground, clock) , Bus performance limit by propagation delay and
aggregate demand แก้ไขได้โดยออกแบบเป็น Multiple bus ให้ Bus เร็วๆอยู่ใกล้ๆกับ CPU ส่วน Bus ช้าๆก็ไปต่ออยู่กับ I/O device ที่มี Speed ต่ำๆ เช่น modem
11.
Bus
arbitration
: เป็นกรรมวิธีในการเลือกว่าใครจะได้ใช้ Bus (เพราะ
bus เป็น share media จึงต้องผลัดกันใช้)
มี2วิธีหลักๆคือ Centralized โดยใช้ Bus controller มาเป็นคนคุม อีกแบบคือ Decentralized
จะให้ทุก Device มีส่วนร่วมในการคนใช้ Bus
12.
Bus
timing
: มี 2 แบบ Synchronous คือแบบที่เราใช้กันอยู่ทั่วไป อีกแบบคือ Asynchronous แบบนี้คงมีให้เห็นในอนาคต
13.
PC
Buses
: ISA (8bit , 16bit)
13.1.
ISA
เป็นแบบ 8bit, 16bit , ต่อได้สูงสุด 4
slot ต่อ 1 ระบบ
13.2.
Micro
Channel Architecture เป็น IBM proprietary 16 and 32 bit
13.3.
EISA
(Extended-ISA) 16/32 bit data, 24/32 bit address
13.4.
VESA
Video Local Bus ใช้ต่อกับการ์ดจอ
13.5.
PCI
(by intel) 64 bit address 32 bit data
13.6.
AGP
Accelerator Graphic Port ใช้ต่อกับการ์ดจอ
1.
1
byte = 8 bit , 1 word = ? bit (ขึ้นกับ Instruction set เช่น CPU 32 bit , 1 word = 32 bit)
2.
Access
technique
: มีหลายแบบ Random access , Sequential access, Direct
access, Associate access
3.
Memory
Hierarchy
:
3.1.
Major
design objective : ความจุสูง, เร็ว และไม่แพง
3.2.
มี4วิธีที่จะช่วยให้บรรลุวัตถุประสงค์
3.2.1.
Use
a hierarchy of storage device : เอา Mem หลายๆแบบมาผสมกันให้เป็น
1 memory system
3.2.2.
Develop
automatic space allocation for efficient use of the memory
3.2.3.
Use
of virtual memory technique : ใช้ Hard disk มาช่วยทำเป็น
Memory
3.2.4.
ออกแบบลายวงจรให้มันทำงานได้คล่องและสะดวกมากขึ้น
3.3.
Basis
of the memory hierarchy
3.3.1.
Register
internal to the CPU
3.3.2.
External
storage for data and program
3.3.3.
External
permanent storage
3.4.
Characteristics
of the memory hierarchy ตัวที่เร็วๆขนาดเล็กหน่อยราคาสูง จะอยู่ใกล้กับ
CPU มากที่สุด ส่วน Memory แบบที่ช้าๆขนาดใหญ่ๆราคาถูกก็จะอยู่ไกลจากตัว
CPU หน่อย
3.5.
The
memory hierarchy works because of locality of reference เอาส่วนที่ใช้บ่อยๆไปเก็บไว้ใน
memory ที่เร็วๆเพื่อให้ CPU access ไปใช้ได้เร็วๆ
4.
Main
memory
: มีหลายแบบ
4.1.
Core
Memory : ใช้ขดลวดกับแม่เหล็ก
โดยใช้ขั้วสนามแม่เหล็กเป็นตัวบอกสถานะ bit
4.2.
Semiconductor
memory (typically random access)
4.2.1.
RAM
(Dynamic RAM, Static RAM)
4.2.2.
ROM
(ROM, PROM, EPROM, EEPROMS, Flash memory
4.3.
Improvement
to DRAM โดยเอา cache เข้ามาช่วย cache
ทำจาก SRAM ที่เร็วกว่าแพงกว่า DRAM โดยเอา cache มาประกอบเข้ากับ DRAM อาจจะแค่ 1 line หรือ Multi line เพื่อช่วยให้ CPU access memory ได้เร็วขึ้น เพราะ CPU
จะมา access ที่ cache แทน
5.
Error
correction ใช้สูตร 2K-1
> M+K เพื่อคำนวณหาค่าจำนวน K bit ที่จะเพิ่มขึ้นมาเพื่อทำ
Error correction ให้กับ Data ขนาด M
bit เช่น Data ขนาด 8 bit ต้องใช้ K=4 à 24-1 > 8+4 à 15 > 12
6.
Cache
Memory : เล็กกว่า
แพงกว่า เร็วกว่า Main
memory ทำงานโดย Copy ข้อมูลจาก Main
memory มาเก็บไว้ (ไม่ใช่การ move) ที่เหลืออ่านชีทเอง เพราะเป็นเรื่องที่ยุ่งพอควร
7.
External
Memory
:
7.1.
Magnetic
Disks :
7.1.1.
มีการแบ่งเป็น
Track,
Sector โดย Track คือการแบ่งเป็นวงรอบ ส่วน Sector
คือการแบ่งวงรอบตามมุมรัศมี เหมือนการแบ่งพิซซ่านั่นแหละ
7.1.2.
ส่วนขั้นตอนการอ่านข้อมูลจะเริ่มหา
Syn
byte ให้เจอก่อน เพื่อเป็นตัวบอกว่านี่เป็นจุดเริ่มต้น จากนั้นเช็ค Gap
ที่คั่นกลางอยู่เรื่อยๆเพื่อเป็นตัวบอกว่าข้อมูลอยู่ตรงไหน
7.1.3.
Data
access time
7.1.3.1.
Seek
time เวลาเคลื่อนหัวอ่านจนเจอ track ที่ต้องการ
7.1.3.2.
Rotational
latency เวลารอจนเจอ Sector ที่ต้องการ
7.1.3.3.
Access
time = Seek time + Rotational latency
7.1.3.4.
Block
transfer time : time to read the block (Sector) off of the disk and transfer it
to main memory
7.2.
RAID
technology คือ Concept การสร้าง Parallel
disk
7.2.1.
RAID
0 ใช้วิธีแบ่งข้อมูลเป็น Block, strip (1 Block มีหลาย Strip) แล้วกระจายข้อมูลไปใน Disk หลายๆตัว RAID0 จะทำให้มี High transfer rate
แต่ยังไม่มี Redundant
7.2.2.
RAID1 มี Redundant โดยการทำ Disk mirror ข้อเสียคือแพงเพราะใช้ Disk จำนวนมาก
7.2.3.
RAID2 ต้องการลดจำนวน Disk จาก RAID 1 ลง โดยใช้วิธี CRC แทน แล้วเก็บค่า CRC ไว้ใน Disk ซึ่งจะใช้จำนวน Disk น้อยกว่าการทำ Mirror แต่ก็ลดลงได้นิดหน่อย
7.2.4.
RAID3 ต้องการลดจำนวน Disk ลงอีกก็เลยเปลี่ยนจาก CRC
มาใช้ Parity bit แทน
7.2.5.
RAID4 ต้องการเพิ่มประสิทธิภาพจาก RAID3 ดังนั้น RAID4 จึงไม่ทำ parity แบบ bit per bit แต่จะทำแบบ Block per Block นั่นคือมันจะอ่าน Parity
block ก็ต่อเมื่อพบว่ามี error เกิดขึ้นเท่านั้น
7.2.6.
RAID
5 ต้องการเพิ่มประสิทธิภาพจาก RAID4 เพราะ Disk
ที่เก็บ Parity
ทำงานหนักเกินไป ก็เลยกระจายให้ Parity กระจายอยู่ตาม Disk ต่างๆ
7.3.
Optical
disk
7.3.1.
CD
is operated using constant linear velocity
7.3.2.
CD
เวลาสร้างจะต้องใช้ Master Disk เป็นแม่พิมพ์ปั๊มแผ่นลูกๆออกมา
7.3.3.
CD-R
จะเขียนได้ครั้งเดียว โดยการยิงแสงเลเซอร์ไปเผาพื้นผิวเป็นจุดๆ
เพื่อเปลี่ยนทิศการหักเหของแสง
7.3.4.
CD-RW
แบบนี้จะเขียนลบได้หลายครั้ง
7.3.5.
Magneto
Optical Disk เป็นแผ่นแม่เหล็กแสง
คือใช้แสงเลเซอร์ไปเผาพื้นผิวให้ร้อนจนทิศสนามแม่เหล็กบนพื้นผิวเปลี่ยนทิศทาง
เพื่อเป็นการเก็บสถานะ bit ที่ต้องการ
7.4.
Magnetic
Tape ราคาถูกมากแต่ก็ช้ามากเช่นเดียวกัน เป็น Sequential
access
1.
External
devices are not generally connected directly into the bus structure of the
computer แต่จะมี I/O module ที่มีมาตรฐานเป็นกลางมาคั่นกลางระหว่าง
Bus กับ I/O devices
2.
The
I/O module
: Provide a standard interface to the CPU and the bus
3.
Interface
consist of : Control, Status and Data signal ทั้ง3 อย่างนี้คือมาตรฐานที่จะใช้ในการต่อกับ I/O
device ที่มาจากบริษัทร้อยพ่อพันแม่ที่เป็นเจ้าของ I/O
device ต่างๆ
4.
Programmed
I/O : การทำงานแบบนี้ จะมีการ Provide
standard interface ให้กับ CPU แต่ CPU
จะต้องมานั่งคุม device เองตลอด
ซึ่งจะทำให้ระบบทั้งหมดช้าลงตามความเร็วของ I/O เพราะ CPU
มานั่งคุมอยู่ตรงนี้ ไม่ได้ไปทำงานอื่น ข้อดีจะมีก็แค่การมีมาตรฐานการเชื่อมต่อ
I/O device ให้กับ CPU ก็เท่านั้นเอง
5.
I/O
addressing :
แบบนี้จะใช้การอ้างถึง I/O address กับ Memory
แยกจากกัน แล้วออกแบบ instruction set ให้ชัดเจนว่าอันไหนใช้กับ
I/O สำหรับการที่จะรู้ว่าเมื่อไหร่อ้างถึง Memory หรือ I/O ก็จะใช้สัญญาณ Chip enable มาช่วยเลือก ข้อเสียคือทำให้ Real memory address ลดลง
แต่ในปัจจุบันก็ไม่ใช่ปัญหาใหญ่ เพราะ real address memory ใหญ่มากๆ
เพราะฉะนั้นเสียไปนิดหน่อยก็ไม่เป็นไรนัก
6.
Interrupt-Driven
I/O
: แบบนี้จะช่วยลดเวลาที่ CPU ต้องมานั่งคุม I/O
โดยมีขั้นตอนหลักๆดังนี้
CPU สั่งงาน I/O , CPU กลับไปทำงานอื่นต่อ
, I/O ทำงานต่อเองจนเสร็จ และเมื่อเสร็จแล้วก็ขอ Interrupt
ไปยัง CPU , CPU หันมาดู I/O ที่บอกว่าเสร็จแล้วเพื่อปิดงาน จากนั้นก็หันไปทำงานอื่นต่อเหมือนเดิม
7.
Direct
Memory Access (DMA) : จะเข้ามาช่วยตอนที่ CPU
ต้องถ่ายโอนข้อมูลจาก I/O ไปยัง Memory
โดยปกติการถ่ายโอนแบบปกติ ก่อนจะถ่ายโอนข้อมูล 1 word ต้องมีคำสั่ง Initial ส่งเสร็จก็ต้องมีคำสั่ง Finish
ว่าจบ แล้วถ้าจะโอนข้อมูล 1000 word เราก็จะเปลืองเวลาการ
Initial มาก DMA ก็เลยจะมาช่วยลดสิ่งเหล่านี้
โดยจะทำการ Initial ครั้งแรกครั้งเดียว
จากนั้นการส่งข้อมูลจะกี่ word ที่ตามมาก็ไม่ต้อง Initial
อีกจนจบ ซึ่ง CPU ก็ไม่ต้องมานั่ง Initial
อยู่ตลอด CPU ก็ไปทำงานอื่นได้ Performance
ก็จะดีขึ้นอีก
8.
การใช้
Bus เพื่อส่งข้อมูลระหว่าง I/O กับ Memory นั้นมีสองวิธี
8.1.
รอจังหวะที่ไม่มีคนอื่นใช้
Bus เช่นช่วง exec, decode แล้วก็แอบใช้ Bus ในจังหวะนั้นส่งข้อมูล
8.2.
บังคับใช้
Bus เลย คือพอจะส่งข้อมูลก็บอกให้คนอื่นที่จะใช้ Bus ด้วยรอก่อนแป๊ปนึง
แล้วก็ส่งข้อมูล จากนั้นค่อยผลัดให้ คนอื่นได้ใช้ Bus
9.
External
Interface
: จะต้องมีการกำหนดรูปแบบการส่งข้อมูลว่า
·
Parallel
or serial data transfer
·
Data
format conversions
·
Transfer
rates
·
Number
of devices supported
·
ตัวอย่างเช่น
RS232
serial port, Game port, SCSI, USB, P1394
1.
Operating
System :
Is program that manages the resources, provides services to programmer,
schedules execution of other programs, mediates programmer and application
programs requests for facilities and services
2.
Services
provided
: Program creation, Program execution, Standardized access to I/O devices,
Controlled access to files, Overall system access control
3.
Types
of O/S
: Interactive, Batch, Multiprogramming / time sharing
4.
Scheduling : กรณีของ
multiprogramming จะทำงานได้จะต้องมี Scheduling เป็นคนคอยจัดการให้โดยแบ่งเป็น 3 ด้าน
4.1.
High
level scheduling : จะดูว่าเครื่องมี Resource พอหรือไม่ ถ้าพอก็จะจองไว้ให้แล้วโหลดโปรแกรมลง Memoryให้
4.2.
Short
term scheduling : จะเป็นส่วนที่จะเลือกว่าโปรแกรมตัวไหนที่อยู่ใน queue
ที่จะถูกรัน โดยจะดูจาก status ของโปรแกรม
ซึ่งมีดังนี้ New, Ready, Running, waiting, halted
4.3.
I/O
: เป็นส่วนที่ดูแล I/O ที่รออยู่ใน queue
5.
จุดอ่อนที่
Scheduling
มีอยู่คือ มันจะพยายามโหลดโปแกรมลง memory ให้มากที่สุดเท่าที่จะทำได้
แต่พอทำงานจริงกับปรากฏว่ามีโปรแกรมที่หยุดชั่วขณะ หรือตัวที่ต้องรอการทำงานของ I/O
อยู่ใน memory สิ่งเหล่านี้ทำให้การใช้งาน memory
ไม่มีประสิทธิภาพ เพราะแทนที่จะเป็นที่อยู่ของตัวที่ต้องทำงานจริงๆ
แต่กัยไปเป็นที่อยู่ของพวกที่หยุดรอคนอื่นๆแทน เขาก็เลยมี memory
management มาช่วยแก้ปัญหานี้ให้
6.
Memory
management :
Idea หลักคือย้ายตัวที่หยุดรอหรือไม่ได้ทำงานออกนอก memory ไปเก็บไว้ใน Intermediate queue แล้วเอาตัวที่มี status
ready พร้อมที่จะรันจริงมาไว้ใน memory แทน
วิธีการแบบนี้เราเรียกว่าการทำ swapping
7.
การย้ายโปรแกรมมาใส่ใน
memory
ก็ต้องมาดูเรื่องพื้นที่ที่จะลง นั่นคือ partition ซึ่ง partition มีอยู่ 2 แบบคือ
Fix size และแบบ Variable size มาถึงตอนนี้เราก็สามารถ
swap โปรแกรมเข้าออก memory ได้แล้ว
แต่ก็ติดปัญหาเรื่องการอ้างอิง address อีก คือ
เวลาโปรแกรมทำงานมันจะใช้ Program address หรือ logical
address ในการทำงาน แต่พอเรา swap โปกแกรมเข้าออก
memory จะพบว่า physical address มันไม่ได้เรียงกันอย่างต่อเนื่อง
เพราะเราสลับไปมาตามแต่ว่าพื้นที่ไหนว่างก็จับใส่ลง ดังนั้น
จึงต้องมีกลไกในการช่วย convert ระหว่าง logical
address และ physical address ให้เข้าใจตรงกัน
วิธีที่ว่าก็คือการทำ Paging นั่นเอง
8.
Paging
: จะใช้ page table ในการช่วย map ระหว่าง Physical address กับ Logical address
9.
Virtual
Memory
: คือการใช้ Hard disk มาช่วยทำเป็น memory
โดยมี idea ว่าส่วนไหนของโปรแกรมที่รันอยู่บ่อยๆก็ให้เก็บไว้ใน
memory ส่วนไหนที่ไม่ค่อยได้ใช้ก็เก็บไว้ใน Hard disk
โดยที่ยังให้มองเสมือนว่า เป็น memory ก้อนเดียวกันทั้งหมด
จึงมีการใช้ Page table มาช่วยเพื่อบอกว่าตอนนี้ส่วนไหนอยู่ใน
Mem ใน HD แต่ปัญหาที่ตามมาอีกคือถ้าโปรแกรมที่ใหญ่มากๆก็จะมี
Page table ที่ใหญ่ตามไปด้วย ซึ่งก็จะกลายเป็นปัญหาตามมาอีก
จึงต้องมีวิธีลดขนาด Page table ลง
10.
การลดขนาด Page table ทำได้ 2 แบบหลักๆคือ
10.1.
Using a 2-level page table คือใช้ first level table เก็บ index ของ second level table ที่เก็บที่อยู่จริง
10.2.
Use
an inverted table structure มี 1 table ที่ support
ทุกโปรแกรม โดยใช้ hash function ในการ map
หา page request
11.
จากข้อ
10 จะเห็นว่าเราต้อง access page table ก่อน แล้วค่อย access
memory จริง ซึ่งต้องเสียเวลา ก็เลยเอา cache มาช่วยเก็บ
table information โดยเฉพาะ เพื่อให้ access เร็วขึ้น ซึ่งเราเรียก cache นี้ว่า TLB
(Translation lookaside buffer)
12.
เมื่อจะโหลดโปรแกรมลง
memory
ต้องดูก่อนว่ามีที่ว่างหรือไม่ ถ้ามีก็ Ok ไป
แต่ถ้าไม่มีก็ต้องย้ายบางตัวออก ซึ่งตอนย้ายก็ต้องมีกรรมวิธีในการ Update ข้อมูลไปลง HD ไว้ก่อน
ซึ่งวิธีก็จะใช้แบบเดียวกับที่ทำใน Cache คือมี 3 แบบ LRU, FIFO, Random
13.
Segmentation : ในกรณีที่มีหลายๆโปรแกรมต้องการ
Share Page ร่วมกัน ถ้าใช้ Paging ธรรมดาก็จะลำบากหน่อย
เพราะแต่ละโปรแกรมเหมือนแยกกันอยู่คนละโลกไม่เชื่อมถึงกัน เพราะมี Page
table แยกจากกัน วิธีแก้คือ Segmentation
1.
ALU : performs
arithmetic and logical operations on data, all other elements of the computer
system are there mainly to bring data to the ALU for processing
2.
2
Basic component
: are required to produce a fully functional ALU
·
A
bit-wide full adder unit
·
A
2-input NAND gate
3.
Integer
Representation
:
3.1.
Sign-magnitude
format : ใช้ bit ซ้ายสุดเป็นตัวบอกว่าเป็นบวก(0)หรือลบ(1)
3.2.
Ones
complement format :
3.3.
Twos
complement format : สองอันนี้ให้ดูรายละเอียดในชีทเอง (อย่าลืมแยกให้ออกระหว่างความแตกต่างของ two complement format กับ two complement operation)
4.
การบวกลบคูณหาร
ให้ดูรายละเอียดในชีทจะสะดวกกว่า
1.
Each
instruction must contain 4 basic information :
1.1.
Operation
code : คำสั่งที่จะทำคืออะไร
1.2.
Source
operand references : operand ที่จะใช้คืออะไร
1.3.
Result
reference : ผลลัพธ์เก็บที่ไหน
1.4.
Next
instruction reference : คำสั่งต่อไปอยู่ที่ไหน
2.
Five
categories of instructions
2.1.
Arithmetic
operation
2.2.
Logic
operations
2.3.
Data
movement (internal to the system)
2.4.
I/o
(Data movements between the computer and external devices)
2.5.
Control
operations
3.
RISC : จำนวน
instruction ต้องให้มีน้อยที่สุดและเล็ก และจำนวน clock
ที่ใช้แต่ละตะวต้องเท่ากัน และสามารถประกอบเป็นคำสั่งต่างๆกันได้
4.
CISC : จำนวน
instruction มากเพื่อสะดวกต่อ user โดยจะ
base on memory ที่ใช้เก็บ micro instruction อีกที (แบบนี้อาจจะใช้กว่า RISC แต่จะง่ายต่อ user)
5.
Address
in an instruction :
มี 4 แบบหลักๆ
5.1.
3
address instruction เช่น x=y+z , SUB
Y,A,B
5.2.
2
address instruction เช่น x=x+y , MOV Y,A
5.3.
1
address instruction เช่น Acc=Acc+x LOAD D
5.4.
0
address instruction เช่น TBA (transfer register B to A)
6.
Control
operation
: เช่น Branch, Skip, Subroutine call/ return
7.
Endian
war
:
·
Big
endian : stores most significant byte in the lowest address (เก็บเหมือนที่คนอ่านตามปกติ)
CPU ที่มาจาก motorola มักใช้แบบนี้
·
Little
endian : stores the word in reverse คือจะเก็บตรงข้ามกับ big
endian CPU จาก Intel มักเป็นแบบนี้
·
ปัญหาที่ตามมาคือ
เวลาจะโอนข้อมูลข้ามถึงกันก็ต้องมีตัวทำ format conversion ไม่งั้นก็จะคุยกันไม่รู้เรื่อง
8.
Addressing
Modes
:
8.1.
Immediate
mode : ADD A,5 บวก A ด้วย 5
8.2.
Direct
mode : ADD A,(5) บวก
A ด้วยค่าที่อยู่ใน address 5
8.3.
Indirect
addressing : ADD A,((5)) บวก A ด้วยค่าที่ address
5 บอกที่เก็บ address ที่บอกที่เก็บข้อมูล
8.4.
Register-based
addressing modes เหมือน3อันแรก
แต่เป็นการกระทำกับ register แทน
8.5.
Displacement
or address relative addressing ใช้ 2 address คือ base address และ relative address
8.6.
Indexing
1.
4
Cycles of CPU : Fetch instruction , Fetch data ,
Process data , Write data
2.
การจะทำงานตามข้อ
1 ได้ต้องอาศัยสิ่งเหล่านี้ : ALU, Control unit, Register
3.
Register
organization
:
3.1.
มีขนาดเล็ก
จำนวนน้อย แต่เร็วสุดๆ
3.2.
มี
2 type
3.2.1.
User
visible : แบบนี้ user สามารถมองเห็นและนำมาใช้งานได้
3.2.2.
Control
and status register : แบบนี้ user มองไม่เห็น
และเอามาใช้งานไม่ได้
4.
User-visible
registers
: มีหลายแบบ
4.1.
General
purpose : เอาไว้ใช้งานทั่วไป เก็บอะไรก็ได้
4.2.
Data
: ใช้เก็บได้แต่ data อย่างเดียว
4.3.
Address
: ใช้เก็บได้แต่ address อย่างเดียว
4.4.
Condition
code : ถูก set โดย CPU à User มองเห็น
แต่แก้ไขอะไรไม่ได้
4.5.
ถามว่าขนาด
Register
ควรกว้างเท่าไหร่ดี : ตอบว่าเอาแค่กว้างพอที่จะรองรับขนาด
Architecture CPU ได้ก็พอ นั่นคือ CPU 32 bit ก็ใช้ register ขนาดกว้าง 32 bit ก็พอ ไม่ต้องถึงขนาดกว้าง 64 bit
5.
Control
and status registers
: เช่น PC, IR, MAR, MBR, program status word
6.
Instruction
cycle
: Fetch the instruction à Decode it à Fetch operands à Perform the operation à store results à recognize pending interrupts ทั้งหมดนี้ต้องขึ้นกับแต่ละ CPU ด้วย
เพราะอาจแตกต่างกันได้ตามชนิดของ CPU
7.
Instruction
Pipelining :
to divide a task into K independent sequential subtasks, each subtask requires
1 time unit to complete, The task itself then requires k time units to complete
8.
For
n iterations of the task :
·
With
no pipelining : nk time unit
·
With
pipelining : k + (n-1) time units
·
So,
Speed up S= nk / [k+(n-1)]
9.
Speed
ของ Pipeline จะขึ้นกับ Stage ที่ทำงานช้าที่สุด
10.
กรณีที่เจอ
branch
มันจะต้อง Flush สิ่งอยู่ใน Pipeline ออกให้หมดให้เป็น empty แล้วเริ่มโหลดเข้ามาใหม่
ซึ่ง Pipeline ที่มี stage เยอะๆ
ก็จะใช้เวลา flush นานกว่าแบบที่ pipe สั้นกว่า
11.
เราสามารถเพิ่ม
ALU เข้ามาใน CPU ให้ทำงานขนานกัน เพื่อช่วยเพิ่ม efficiency
ขึ้น แต่ก็ต้องระวังเรื่อง dependency ด้วย
ที่อาจทำให้ข้อมูลผิดได้
12.
Pipeline
Limitation
:
12.1.
Pipeline
Depth
: ทั้งนี้มันจะมี delay ของ buffer ที่ใช้คั่นแต่ละ stage เพราะงั้นยิ่ง stage มาก delay ยิ่งมาก แถมต้องมีวงจรควบคุม buffer
เหล่านี้ด้วย เราจึงทำให้มันลึกมากๆไม่ได้
12.2.
Data
dependencies :
ถ้าออกแบบไม่ดีทำให้แต่ละ stage เกิด data
dependency ขึ้นจะทำให้ข้อมูลผิดได้ และถ้า stage มีมากไปก็มีโอกาสเกิด data dependency ได้ง่ายด้วย
12.3.
Branching : พอเจอ
branch ก็ต้องมีการ flush แล้วเริ่มใหม่
สิ่งเหล่านี้หลีกเลี่ยงไม่ได้
แต่ก็พอมีวิธีช่วยลดผลกระทบของการต้องโหลดใหม่อยู่บ้างดังนี้
12.3.1.
Multiple
streams : ก็ทำ duplicate ช่วงก่อน execute
เป็น 2 เท่าเลย เพื่อ parallel branch รอไว้
12.3.2.
Prefetch
branch target : พอมันเจอ branch (แต่ยังไม่แน่ใจว่าจะ
jump ไปหรือไม่ )มันก็จะ Prefetch
มาเก็บไว้ใน high speed memory แล้วรอ ถ้าไม่ Jump
ก็แล้วไป แต่ถ้า Jump มันก็จะ Flush และโหลดตามปกติ แต่จะดีหน่อยตรงที่ทำกับ high speed memory แทน ไม่ต้องไปทำกับ low speed memory เพราะงั้นก็ช่วยลดเวลามาได้หน่อย
12.3.3.
Look
ahead, look behind buffer (loop buffer) : คือไปขยาย buffer
ให้ใหญ่มากพอจนเก็บ Instruction ที่จะวนลูปได้ทั้งหมด
เพราะงั้นเวลาเจอ branch มันก็จะกระโดดไปมาใน buffer นี้แหละ ก็จะทำให้เร็วขึ้น ไม่ต้องไปยุ่งกับพวก low speed memory (ใช้ concept ของ cache แต่ใช้เฉพาะกับ
branch)
12.3.4.
Branch
prediction : แบบนี้พยายามจะลด Flush ให้เหลือน้อยที่สุด
โดยพยายามจะทาย Branch ที่จะไปล่วงหน้าแล้วโหลดมารอเลย วิธีนี้ขึ้นกับความถูกต้องการเดาว่าจะมากน้อยแค่ไหน
ซึ่งการเดาก็มี 2 แบบหลักๆคือ Static guesses และ Dynamic guesses
12.3.5.
Delayed
branch : แบบนี้พยายามจะลด Flush ให้เหลือน้อยที่สุด
โดยอาศัยความสามารถของ compiler โดยพยายาม compile ให้โปรแกรมมีคำสั่งที่ถูกลำดับส่งไปให้ CPU รันเสมอ
เพื่อไม่ให้เกิดการ flush โดย compiler จะคำนึงถึงเรื่อง data dependency ร่วมด้วยเสมอ
13.
Superpipeline
design :
พยายามออกแบบให้ Pipeline มี stage ที่มากขึ้น ใช้ clock ที่เร็วขึ้นเพื่อให้ระบบทำงานได้เร็วขึ้น
14.
Superscalar
design
: พยายามออกแบบให้มีส่วน Operate มากกว่า 1 ตัว เช่นมี ALU 2 ชุด มี Pipeline 2 ชุด เพื่อให้ทำงานขนานกันจะได้เร็วขึ้น
15.
Superscalar design Limitation :
15.1.
Data
dependencies
15.2.
Resource
dependencies
15.3.
Instruction
issue policy
·
In-order
issue, in-order completion วิธีนี้ธรรมดา ช้า
·
In-order
issue, out-of-order completion วิธีนี้ต้องระวังเรื่อง Output
dependencies ด้วย
·
Out-of-order
issue, out-of-order completion วิธีนี้ต้องระวังเรื่อง Antidependence
15.4.
Register
renaming เพ่อแก้ปัญหา Output dependencies , Antidependence
15.5.
Impact
on machine parallelism
·
การเพิ่มแต่
ALU โดยไม่มีการทำ Register renaming มา support จะทำให้ performance ถูกจำกัดด้วยเรื่องของ data
dependencies
·
Out-of-order
issue จะเกิดประโยชน์สูงถ้ามี instruction buffer windows ที่ใหญ่ๆ
1.
แต่ละคำสั่งของ
CPU นั้นจริงๆแล้วประกอบด้วยการทำงานแบบ Serial ของ microoperations
ซึ่งจะถูกควบคุมโดย Control unit อีกที
2.
Control
Unit
: หน้าที่คือ
2.1.
Define
ว่า element ไหนของ CPU ที่จะต้องทำงานร่วมกัน
(Select element)
2.2.
Define
microoperation ไหนที่จะให้ CPU ทำ (Select
function)
2.3.
คุม
Sequence
การทำงาน (Data flow)
3.
Microoperations : เป็นหน้าที่การทำงานเล็กๆที่สามารถประกอบเป็น
1 คำสั่งของ CPU ได้
ซึ่งจะถูกควบคุมการทำงานโดย control unit การสร้าง microoperation มี
2 แบบหลักๆ
3.1.
Hardwired
logic : เล็ก เร็ว แต่ modify ได้ยาก
อาจถึงรับต้องออกแบบใหม่เลยถ้าจะแก้ไขมันนิดหน่อย พวกนี้จะเห็นใน RISC เป็นส่วนใหญ่
3.2.
Microprogrammed
control unit : คำสั่งเล็กๆจะเก็บใน memory เฉพาะของมัน
ซึ่งเราสามารถเขียนโปรแกรมเล็กๆสั่งการทำงานไว้ในนี้ได้ ทำให้การ modify ทำได้ง่าย แต่จะมีขนาดใหญ่กว่าและช้ากว่าแบบ RISC
4.
Hardwired
approach
: Three general design approaches
4.1.
Traditional
state-stable method from a digital logic course
4.2.
Clocked
delay element
4.3.
Sequence
counter approach
5.
Microprogramming : ใน
control unit จะมี memory เอาไปเก็บ microprogram
เลย เรียกว่า micro code (เก็บ data ที่จะเอาไปคุม switch)
6.
Vertical
microprogramming
: each micro instruction specified a single (or few) microoperations to be
performed
7.
Horizontal
microprogramming
: each micro instruction specified many different microoperations to be
performed in parallel
8.
Compromise
: จะใช้ผสมกันทั้งแบบ Vertical
และ Horizontal
โดยเอากลุ่มที่มีโอกาสเปิด(switch)พร้อมกันมาอยู่
Horizontal แต่ถ้าเปิดไม่พร้อมกันก็ใช้แบบ vertical
9.
Second
compromise :
nanoprogramming
9.1.
Use
a 2-level control storage organization
9.2.
Top
level is a vertical format memory
·
Output
will drives the address register of the bottom (nano-level) memory
9.3.
Nanomemory
uses the horizontal format à produce the actual control signal outputs
9.4.
ข้อดีของวิธีนี้คือช่วยลดขนาด
Control
memory ลง
9.5.
ข้อเสียคือซับซ้อนมากขึ้นทำให้ช้าลง
9.6.
nanoprogramming
มีใช้กันมากใน CISC microprocessors
เพิ่มเติม
Cache
memory
1.
คุณสมบัติของ
cache
: เล็ก (แต่ต้องใช้เป็นตัวแทน RAM ขนาดใหญ่ได้) เร็ว (เพราะใช้เทคโนโลยีการผลิตเดียวกับ
CPU) แพง (เพราะสร้างจาก SRAM ไม่ใช่ DRAM ถูกๆ)
2.
การทำงาน :
2.1.
เราจะ
Transfer
ข้อมูลจาก RAM (Memory นั่นแหละแต่ในที่นี้จะเรียกว่า
RAM นะจะได้เห็นภาพชัด) มาเก็บ (Copy
นะไม่ใช่ Cut and paste) ไว้ใน Cache ที่ละ block โดยที่เมื่อเอามาเก็บใน Cache แล้วเราจะเรียก block นั้นว่า line หรือ line แทน (แค่เปลี่ยนชื่อเฉยๆ
แต่ขนาดยังเท่าเดิม) นั่นคือ Cache ประกอบด้วยหลายๆ
Line (หรือใส่ได้หลายๆ block นั่นเอง)
(ใน 1 block หรือ line จะใส่ข้อมูลได้อีกหลาย
word )
2.2.
CPU
จะมองไม่เห็น RAM จะเห็นก็แต่ cache มันก็เลยจะทำงานเฉพาะกับ Cache เท่านั้น โดยมันจะ
ทึกทักเอาเองว่าข้อมูลทั้งจักรวาลอยู่ที่ Cache นี่แหละ
แต่ถ้ามันไม่มีจริงก็เป็นหน้าที่ Cache controller เองที่จะต้องไปหามาใส่ไว้ใน
Cache โดย CPU มันจะไม่สน
2.3.
ประเด็นที่ต้องสนใจในการออกแบบ
cache คือ
2.3.1.
Mapping
function เพื่อให้ Cache ขนาดเล็กสามารถเป็นตัวแทน
RAM ขนาดใหญ่ๆได้
2.3.2.
Line
replacement เพราะขนาดที่เล็กของ cache ก็เลยต้องมีการ
swap ข้อมูลเข้าๆออกๆบ่อยๆ ก็เลยต้องมีกติกาการ swap ด้วยว่าจะทำอย่างไร
2.3.3.
Write
policy : จำได้ไหม cache controller จะ copy
ข้อมูลจาก RAM มาเก็บใน cache มันก็เลยกลายเป็นว่าข้อมูลมี 2 ที่คือ ใน RAM,
cache ก็เลยต้องพูดเรื่องนี้เพื่อป้องกันข้อมูล 2 ที่มีค่าแตกต่างกัน ไม่งั้นเดี๋ยวมั่ว
2.3.4.
Block
Size : แล้วขนาด Block หรือ Line ควรใหญ่เล็กเท่าไหร่ดีล่ะ อืมมมน่าคิด
2.3.5.
Number
and type of cache อืมมมนี่ก็น่าคิดว่าเอาไงดี
3.
Mapping
Function
: มี 3 แบบใหญ่ๆ
3.1.
Direct
mapping : ใช้วิธีล็อกไปเลยว่า Block ที่เท่าไหร่ใน
RAM มีสิทธิ์ไปอยู่ใน Line ไหนใน cache
ได้ แล้วอาศัยการเปรียบเทียบ tag ว่าตรงกันหรือไม่ระหว่าง
address ที่ต้องการหา กับ tag ที่เก็บใน
cache แบบนี้ง่ายดีแต่ไม่ค่อยยืดหยุ่น
3.2.
Associative
mapping : แบบนี้พยายามจะให้ยิดหยุ่นมากขึ้น ก็เลยไม่กำหนดตายตัวว่า
Block ไหนลง line ไหนได้
แต่จะให้ลงได้อิสระเลย โดยใช้วิธีเทียบกับ tag เอากับทุก line
ใน cache พร้อมกัน (Parallel) ว่าตรงกับตัวไหน วิธีนี้เสียที่ว่าต้องเสียพื้นที่เก็บ tag ใหญ่มาก เมื่อเทียบกับพื้นที่ที่ใช้เก็บข้อมูลจริง
3.3.
Set
associative mapping : แบบนี้จะเป็นลูกผสมระหว่าง 2 แบบข้างบน โดยจะมองว่า มีหลาย line ประกอบกันเป็น set
(ถ้า 1 set มี 4 line จะเรียกว่า
4-way) และ หลายๆ set ประกอบเป็น cache
แล้วใช้วิธี Direct mapping กระทำกับ set
จากนั้นพอจะเลือก line ก็ใช้วิธี Associative
mapping โดย compare
tag ของทุก line ว่าตรงกับตัวไหน พอเจอ
line ที่ต้องการ ก็ค่อยใช้ word offset เลือกเอา word ที่ต้องการ
4.
ตัวอย่างการคำนวณ
: โจทก์ ว่า มี RAM ขนาด 1M byte (เพราะฉะนั้นก็จะรู้ว่า address มีขนาด 20 bit
) แล้ว cache มี 1K line แต่ละ line แต่ละ line เก็บข้อมูลได้
8 bytes (เพราะฉะนั้นก็จะรู้ว่า word offset ใช้ 3 bits นะ)
4.1.
Direct
mapping จาก address ขนาด 20 bits จะแบ่งได้เป็น
·
Word
id (หรือ word offset) = 3 bits
·
Line
id = 10 bit (เพราะ cache มี 1K line เพราะงั้นเลยต้องใช้ 10 bit มา code)
·
Tag
id = 7 bits (ที่เหลือคือ 20-3-10 = 7)
·
Ex
: address ABCDE = 1010 1011 1100 1101 1110
แบ่งใหม่ตามจำนวน
bit = 101 0101 11 1001 1011 110
นั่นคือ tage = 55
Cache line = 39B
word offset = 6
4.2
Associative
mapping จาก address ขนาด 20 bits จะแบ่งได้เป็น
·
Word
id (หรือ word offset) = 3 bits
·
Tag
id = 17 bits (ที่เหลือคือ 20-3 = 17)
·
Ex
: address ABCDE = 1010 1011 1100 1101 1110
แบ่งใหม่ตามจำนวน
bit
= 1 0101 0111 1001 1011 110
นั่นคือ tage = 1579D
word offset = 6
4.3
Set
associative mapping : แก้โจทก์เพิ่มอีกนิดว่า Cache มี 1K line เป็นแบบ 4-way
·
จำนวน
Set =
1024/4 = 256 set เพราะฉะนั้น set id = 8bit
·
word
id = 3 bit
·
tag
id = 20-8-3 = 9 bits
·
Ex
: address ABCDE = 1010 1011 1100 1101 1110
แบ่งใหม่ตามจำนวน
bit = 1 0101 0111 1001 1011 110
นั่นคือ tage = 157
set id = 9B
word offset = 6
5
Line
replacement
: มี 4 แบบ
5.1.
Least
recently used (LRU) ให้ copy ทับตัวที่ไม่ได้ถูกใช้งานนานที่สุด
5.2.
First
in First out : ใช้ queue มาช่วย
5.3.
Least
frequency used : ให้ copy ทับตัวที่ถูกใช้บ่อยน้อยที่สุด
วิธีนี้ต้องมี counter มาช่วยนับ
5.4.
Random
: แบบนี้ก็แล้วแต่ดวง สุ่ม copy ทับไปเลย
5.5.
วิธีที่นิยมใช้กันมากที่สุดคือ
LRU (แบบแรก)
6.
Write
policy
: เนื่องจาก cache ไป copy ข้อมูลมาจาก RAM มันจึงต้องมีวิธีทำให้ข้อมูลที่เก็บใน 2 ที่ (RAM
กะ Cache) ตรงกัน
6.1.
Write
through : พอข้อมูลใน cache เปลี่ยนปุ๊ปก็ Update
ตัวที่อยู่ใน RAM ทันทีเลย
6.1.1.
ข้อดีคือข้อมูล
Update
ทันที แต่ข้อเสียก็อยู่ที่เสียเวลา Update บ่อยมาก
6.2.
Write
back : วิธีนี้ถึงแม้ข้อมูลใน cache จะเปลี่ยนไปมันก็จะยังไม่
Update ใน RAM มันจะรอจนกว่าจะถูก swap
ออกจาก cache มันจึงจะไป update ใน RAM
·
วิธีนี้อาจต้องใช้
bit
information มาบอกว่า line ไหนที่เคยถูกเปลี่ยนค่าไปบ้าง
เพื่อว่า line ไหน ที่ไม่เคยถูกเปลี่ยนค่า จะได้ไม่ต้องไป update
ใน RAM เพื่อประหยัดเวลา เจ้า bit
information ที่ว่าก็คือ MESI cache coherency protocol นั่นเอง
7.
Block
/ line size
: สรุปว่าไม่มีกฏตายตัวว่าเท่าไหร่ดี ส่วนใหญ่ใช้กันประมาณ 4,8
word / block
8.
Number
of cache
:
8.1.
Single
vs 2-level : cache L1 จะอยู่ใน CPU เลย ส่วน L2 จะอยู่บน Main board
8.2.
Unified
vs spilt cache : แบบแรกจะมี 1 cache เก็บทั้ง
Instruction และ Data ปนกัน แบบหลังจะแบ่ง
cache แยกเก็บ instruction, data แยกจากกัน
ซึ่งจะเหมาะกับ CPU ที่ทำงานโดยใช้ pipeline
Integer
representation : ก็คือรูปแบบการเก็บตัวเลขจำนวนเต็มด้วย binary
bit หรือหมายถึงรูปแบบการนำ binary bit มาเรียงกันอย่างไรให้ทุกคนอ่านแล้วเข้าใจตรงกันว่ามันมีค่าเป็นเท่าไหร่
ซึ่งวิธีเรียงก็มีหลายแบบ
1.
Sign
magnitude format : วิธีนี้ให้ bit แรกทางซ้ายแสดงถึง
+/- ส่วนที่เหลือค่อยตีค่าเป็นตัวเลข
2.
Ones
complement format : วิธีนี้จะใช้ bit แรกทางซ้ายแสดงถึง
+/- เช่นกัน แต่ bit ที่เหลือทางซ้ายแปลกหน่อยตรงที่ว่าถ้าเป็นเลขบวกจะปรกติ
แต่ถ้าเป็นเลขลบจะอยู่ในรูป bit ที่ตรงข้ามกับเลขบวก
·
+42 =
0 00101010
·
-42 = 1 11010101 ให้สังเกตุว่าแต่ละ bit จะตรงข้ามกับเลขบวกของมัน
3.
Twos
complement format : วิธีนี้จะไม่ใช้ bit แรกมาบอก
sign +/- โดยเฉพาะ
แต่ถ้าเห็น bit แรกเป็น 1 ก็รู้ได้เลยว่าเป็นเลขลบ
(อย่าแปลกใจ มันทำได้แล้วกันน่า) ส่วนเลขบวกก็จะมี
bit แรกเป็น 0 แล้วที่เหลือก็ตีค่าธรรมดา
พอจะหาค่าลบของมันก็ Invert ทุก bit ให้เป็นตรงข้ามซะ
เสร็จแล้วก็บวกเพิ่มอีก 1 ก็จะได้ค่าลบออกมา ซึ่ง bit
แรกมันจะกลายเป็น 1 เอง (เห็นไหมว่าไม่ได้ใช้ bit แรกมาเป็น sign +/- โดยเแพาะ แต่เห็นแล้วก็เดาได้ว่าบวกหรือลบ) Rang ตั้งแต่
128<127
·
+42
= 00101010
·
-42
= จับ invert ให้หมดแล้วบวกอีก 1 =
11010101 +1 = 11010110
·
สรุปอีกทีว่า
two
complement format ก็คือรูปแบบการแสดงค่าเท่านั้น เช่น
·
0000 1111 มีค่าเท่ากับ 15
, ถ้าbit แรกเป็น 0
ก็อ่านค่าออกมาธรรมดา
·
1000 1111 มีค่าเท่ากับ 113
, ถ้า bit แรกเป็น 1
ถ้าอยากอ่านค่าต้องทำ two complement operation ซะก่อนแล้วค่อยอ่านค่า
แต่อย่าลืมใส่ค่าลบไปด้วยเพราะมันเป็นลบอยู่
·
two
complement operation คือวิธีการกลับค่าเครื่องหมาย เช่นเรามีเลข +42 อยู่แล้วต้องการเลข 42 ก็ทำ two complement
operation ซะ โดยการ Invert ทุก bit แล้วบวกเพิ่มอีก 1
Integer
addition of n-bit numbers (รายละเอียดดูใน Sheet อีกที แต่คงไม่ออกสอบมั้ง J )
1.
การบวก
: จะใช้ Ripple adder ต่อ cascade กัน โดยใช้ carry มาช่วยด้วย
2.
การลบ
: จะเพิ่มวงจรการทำ complement และ Mux เข้าไปในวงจรการบวก (Adder) ก็ทำการลบได้แล้ว
3.
การคูณ
: ทำได้ 3 วิธี
3.1.
Repeated
addition : เช่น 6x5 ก็เอา 6 บวกกัน 5 ครั้ง
3.2.
Shift
and add : วิธีนี้ทำเหมือนกับที่เราทดเลขในกระดาษที่คูณการทีละ bit
แล้วออกแบบวงจรให้มีตัว shifter และ Adder
ทำงานร่วมกัน
3.3.
Hardware
speed hardware multipliers : วิธีต้องออกแบบวงจรให้ซับซ้อนมากขึ้น
ใช้อุปกรณ์พิเศษมากกว่าแบบ shift and adder เพื่อให้ทำงานแบบขนานและเร็วกว่า
อย่างเช่นพวก chip math coprocessor
4.
การหาร
: ใช้วงจร Shift and adder คล้ายตัวคูณ
แต่ออกแบบให้ต่างออกไปหน่อย ก็จะได้วงจรหารแล้ว
Floating
point representation
Format = +/-M x R +/-E
Mantissas Exponents
Radix
·
Mantissa
เยอะ เลขจะละเอียดขึ้น
·
Exponent
เยอะ Rang จะกว้างขึ้น
จบแล้วครับ J
/ By IT8
ขอขอบคุณ คุณเล็ก...จันทร์เกษม
จากใจจริงที่ได้อนุเคราะห์ความรู้และเนื้อหาที่เป็นประโยชน์อย่างสูง