Thursday, October 19, 2017

การออกแบบ วงจรคูณเลขฐานสอง

วงจรคูณ (Multiplication circuit)

การคูณเลขฐานสอง ก็เหมือนกับการคูณเลขฐานสิบทั่วไป คือ มีลักษณะดังข้างล่าง
 ให้  A = 10102  B =   1012   และ X = AxB  จงหาค่า X

มีจุดที่ต้องสนใจ ตรงที่ 
1.ถ้าเรา เอาเลขฐานสอง  สองจำนวนมาคูณกัน จำนวนบิทสูงสุดที่อาจจะเกิดขึ้น เท่ากับผลรวมของจำนวนบิตจากตัวตั้งและตัวคูณ  เช่น  A มีขนาด 4 บิท B มีขนาด 3 บิท  AxB มีโอกาศทำให้เกิดผลลัพท์ขนาด 7 บิท  (4+3)
ให้  A = 11102  B =   1112   และ X = AxB =  110 00102   (มีขนาด 7 บิท)
ดังนั้น ถ้าเราจะทำวงจร คูณเลขฐานสองขนาด8 บิท เราจะต้องมีที่เก็บข้อมูลแบบ 16 บิท
2. วงจรดิจิตอล มันไม่รู้จักค่าลบ ถ้าเอาจำนวนที่เป็นลบมาคูณ เช่นจำนวนที่อยู่ในรูป 2’s complement ผลลัพท์ที่ได้จะอยู่ในรูป 2’s complement   และบิทสูงสุดของตัวตั้งและตัวคูณจะถือเป็น Sign bit
เช่น 11102  ถ้าเป็น ตัวเลขที่ไม่คิดเครื่องหมาย( unsigned number) มันมีค่าเท่ากับ 14 และ ถ้าเป็นตัวเลขที่มีเครื่องหมาย (Sign number) มันคือ -2

การคูณเลขฐานสองขนาด1 บิท   
รูปที่ 9 วงจรคูณเลขฐานสองขนาด 1 บิท
จากตรารางค่าความจริง ของการคูณเลขฐานสองแบบ 1 บิท เราสามารถใช้ AND Gate 1 ตัวในการแก้คำตอบได้ ตามรูปที่ 9

การคูณเลขฐานสองขนาด2 บิท 
ให้ A0 และ A1 แทนค่าของ A ในบิท0 และบิท 1  ,  B0  และB1  แทนค่าของ  B ในบิท0 และบิท 1

รูปที่ 10 การคูณเลขฐานสอง แบบ 2 บิท

ตัวอย่าง A = 1 12 และ B = 1 12  จงหาค่า  AxB
A1 = 1  , A0 = 1 และ B1 = 1 , B0 =1
X0 =  A0xB0 = 1
X1 = A1xB0+A0xB1 = 1x1+1x1  = 0 และมีตัวทดไปยังบิท2 = 1
X2 = A1xB1 = 1 + ตัวทดจากบิท 1 = 1 +1 = 0 และทดไปบิท3 = 1
X3 = ตัวทดจากบิท 2 = 1
ได้ X = 1 0 0 1 2 

จากวิธีการนี้ทำให้เราสามารถ ใช้วงจรคูณ 1 บิท ซึ่งก็คือ AND gate และวงจรบวก Half Adder หรือ Full Adder ในการแก้คำตอบของการคูณเลขฐานสองขนาด 2 บิทได้ตามรูปข้างล่าง
รูปที่ 11 วงจรคูณเลขฐานสอง แบบ 2 บิท
การคูณเลขฐานสองขนาด 4 บิท


รูปที่ 12 การคูณเลขฐานสอง แบบ 4 บิท
เพื่อที่จะเขียนสูตรการคูณเลขแบบ n bit เราจะมาดูการคูณแบบ 4 บิทก่อน จำนวนบิทสูงสุดที่มีโอกาศเกิดขั้น เท่ากับ 8 บิท คือ บิท 0 ถึง บิท 7
จากรูปที่ 12  ให้ Z0 ถึง Z7 แทนผลบวกของค่าที่เกิดจากการคูณในแต่ละบิท  เช่น
Z0 = A0B0
Z1 = A0B1 + A1B0

Z3 =  A0B(3-0) + A1B(3-1) + A2(B3-2) + A3(B3-3) + Co of Z2
Z3 = A0B3 + A1B2 + A2B1 + A3B0      ลองเปรียบเทียบกับตารางข้างบน
Z6 = A0B6 + A1B5 + A2B4 + A3B3 + A4B2 + A5B1 + A6B0     B4 ถึง  B6 และ A4 ถึง A6 เท่ากับ 0
      = A3B3 + Co of Z5
Z7  = 0 + Co of Z6

มีจุดที่ต้องสนใจ ตรงที่   
ถ้า A มีขนาด m bit และ B มีขนาด n bit แล้ว
1. จำนวน bit สูงสุดที่มีโอกาศขึ้น เท่ากับ m + n
2.จำนวนวงจรคูณแบบ 1 บิท ที่ต้องใช้ทั้งหมดเท่ากับ m x n 
3. จำนวนวงจรบวกที่ต้องใช้ เท่ากับ (m-1)x(n-1) + 1  เช่น กรณี  A และ B มีขนาด 4 bit ต้องใช้วงบวกอย่างน้อยเท่ากับ 10 วงจร กรณีใช้วงจรบวกแบบ 1 บิท 
4. ไม่มีการคูณเลขเกินกว่า 1 บิท
5. การคูณเลขฐานสอง  สามารถทำได้ด้วยการบวกแบบขนาน 


เอารูปที่ 12 มาวิเคราะห์อีกครั้ง  บริเวณพี้นที่สีเหลือง มันสามารถแทนได้ด้วยวงจรบวก 4 บิท ตามรูปที่ 13 ข้างล่าง เพราะมันมีจำนวนบิทเท่ากับ 4 บิทคือเริ่มจากบิท 1 ถึง บิท 4
รูปที่ 13 ใช้วงจร 4 bit full adder ในการบวกพื้นที่บางส่วนของผลคูณ
พื้นที่เส้นประสีแดง และพื้นที่สีเขียวก็เป็นการบวกแบบ 4 บิทเช่นกัน  แต่มีการทับซ้อนกับพื้นที่เหนือมัน  บริเวณทับซ้อนนี้ก็คือการเอาผลลัพท์ที่บวกไว้ก่อนหน้ามารวมกับพื้นที่ๆ ไม่ทับซ้อน

ดูในบิท2 บริเวณพื้นที่สีเหลือง   คือผลบวกของ A2B0 + A1B1   และอยู่ในพื้นที่เส้นประสีแดงเท่ากับ  A0B2 ซึ่งเป็นบริเวณไม่ทับซ้อน
ดังนั้นผลรวมในบิท 2 มีค่าเท่ากับ  A2B0 + A1B1 + A0B2  เท่ากับผลลัพท์ที่ต้องการในบิท2 (X2 ล่างสุด ในรูปที่ 14)

 เปรียบเทียบกับวงจรคูณเลขแบบ 4 บิท รูปที่ 14ข้างล่าง ที่ Full Adder 4 บิท  ตัวบนคือการบวกพื้นที่สีเหลือง ตัวที่สองคือการบวกพื้นที่สีแดง และตัวที่สามคือการบวกพื้นที่สีเขียว มันจะเหลื่อมกัน 1 บิทแบบตารางข้างบน

รูปที่ 14  4 bit multiplier โดยการใช้ 4  bit full adder และ 1 bit multiplier
หมายเหตุ
    1. วงจรในรูปสร้างโดยใช้ โปรแกรม Logisim
    2.  4 bit full adder ในรูปเป็นการใช้ subcircuit  ในวงจร Logisim เพื่อจะได้ไม่ต้องแสดงรายละเอียดข้างในของ 4 bit  full adder ตามรูปที่ 13
    3.  Ci หรือ Carry in ไม่จำเป็นต้องใช้ เพราะเราใช้ ขา A3 ของ  4 bit  full adder ทำงานแทน ดังนั้น ควรจะต่อ Ci ทั้งหมดลง Ground


                            ดูวิดีโอการสร้างและทดลอง ได้ที่นี่

ก่อนปี 1970  ALU (Arithmetic and Logic Unit) หรือหน่วยประมวลผลขนาดเล็ก , Central Processing Unit เช่น Z80 หรือแม้กระทั่ง Mini-computer จะไม่มีวงจรคูณ เนื่องจากหน่วยความจำภายในทำได้ยากและมีราคาสูง และมักจะเป็นตัวถ่วงในการทำงาน เพราะมันเปลี่ยนแปลงได้ช้า ดังนั้น การคูณจึงอาจจะทำโดยการเขียนโปรแกรม เช่น การวนลูป

สมมุติ   เราเขียนโปรแกรมด้วย ภาษาชั้นสูง เช่น C, C++, Python  และอื่นๆ ที่รองรับคำสั่งการ loop  เราอาจเขียนโปรแกรมประมาณนี้
Read  A;         #อ่านค่า A   ตัวตั้ง
Read B ; #อ่านค่า  B  ตัวคูณ
X = 0; #ให้ X  มีค่าเท่ากับ 0 ในตอนเริ่มต้น  , X เป็นผลลัพท์ของ AxB
For I = 1 to B         # ทำวน loop
 { I = I +1; # เพิ่มค่า I ทีละหนึ่ง
    X = X +A; # เพิ่มค่า X ด้วย A
  }
END


แล้ว Compiler ของภาษาที่ใช้เขียนโปรแกรมจะแปลเป็นรหัสที่ CPU เข้าใจได้
เมื่อลงลึกไปถึงวงจรภายใน การวนลูปในลักษณะนี้ ต้องอาศัย การ Shift register , การเปรียบเทียบบิท และการบวก ซึ่งจะไม่มีการใช้วงจรคูณแต่จะอาศัยวงจร  Shift register หรือวิธีการ Shift register , การเปรียบเทียบ บิท , Register เป็นต้น  ยังจะไม่กล่าววิธีการเหล่านี้ในตอนนี้

008

Author & Editor

กรุณา อย่าเขียนความคิดเห็นที่ไม่เกี่ยวกับบทความ หรือข้อความที่พาดพิงผู้อื่นในลักษณะที่ทำให้เกิดความเสียหายต่อผู้อื่น

0 comments:

Post a Comment

 
biz.