Thursday, November 2, 2017

Under testing and customizing



Picture from : https://pixabay.com    ..........................................................
Blogger Template : https://gooyaabitemplates.com/ ..................................

เนื้อหาใน Blog จะเน้นในทางปฏิบัติมากกว่าทฤษฏี ดังนั้น อาจจะไม่มีขั้นตอนการใช้งาน หรือทฤษฏีพื้นฐานแบบที่ใช้เรียน แต่จะแค่กล่าวเท่าที่จำเป็นในการออกแบบหรือใช้งานเท่านั้น

Wednesday, November 1, 2017

Combination circuit (วงจรรวมของเกจท์)-- Draft--

วงจรดิจิตอล สามารถที่จัดกลุ่มตามการทำงานได้เป็น 2 ชนิด คือ Combination circuit และ Sequential circuit
Combination circuit คือ วงจรรวมของเกจท์ชนิดต่างๆ ซึ่งนำมารวมกันเพื่อให้เกิดฟังก์ชั่นการทำงานที่ output เปลี่ยนแปลงตามค่า Input ที่ใส่เข้าไป   เช่น วงจรบวก , วงจรเข้ารหัส ,วงจรนับ เป็นต้น  ในวงจรบวก   ผลลัพท์ หรือ Output จะเปลี่ยนตามค่าที่ป้อนเข้ามา เช่น 2 +2 = 4  มันไม่สนใจว่าตอนที่เรากำลังป้อน Input อยู่ขณะนั้น Output มีค่าเป็นอะไร  ในขณะที่

Sequential circuit คือ วงจรที่จะมีการทำงานเป็นลำดับขั้นตอน  ถูกสร้างจากเกจท์ต่างๆ และวงจรความจำ ประเภท  Flip-Flop ชนิดต่างๆ เพื่อให้เกิดฟังก์ชั่นการทำงาน ที่ Output เปลี่ยนแปลงไปตามค่า ของ Input และ State หรือ สถานะของ output ณ.เวลานั้นๆ  เช่น วงจรควบคุมไฟจราจร   เมื่อกดปุ่มเปลี่ยนสัญญาณไฟ ครั้งหนึ่งๆ Output หรือไฟสีต่างๆ ที่จะติด จะต้องเปลี่ยนตามสถาณะของ Output หรือสีของไฟ ในขณะที่กดปุ่มเปลี่ยนสัญญาณไฟ คือ กดปุ่ม ตอนที่ไฟสีแดงขึ้น ไฟจะเปลี่ยนเป็นสีเขียว  แต่ถ้ากดตอนที่ไฟสีเขียวติดอยู่ มันจะเปลี่ยนเป็นสีเหลืองก่อน แล้วเปลี่ยนเป็นสีแดงตามลำดับ  ไม่สามารถจะข้ามขั้นตอนไฟเหลืองไปได้

Encoder (วงจรเข้ารหัส)

วงจรเข้ารหัส  คือ วงจรที่  Output ของมันได้จากการเปลี่ยนค่าของ Input ไปอยู่ในอีกรูปแบบหนึ่ง  เช่น

วงจรDEC to BCD encoder
สมมุติ เราจะสร้างวงจร เพื่อรับค่าจากแป้นพิมพ์ของเครื่องคิดเลข ให้แปลงค่า 0 – 9 ไปเป็นเลขฐานสอง ( Decimal to BCD )

รูปที่ 1 DEC to BCD Truth table
         A = 1  เมื่อกดคีย์  1, 3,5,7,9                 
B = 1  เมื่อกดคีย์  2,3,6,7
C = 1  เมื่อกดคีย์ 4,5,6,7
D = 1  เมื่อกดคีย์ 8,9

วงจร BCD to 7 SEG-Display decoder
รูปที่ 2  7-segment display and its truth table
จากรูปที่ 2 เป็นตัวแสดงผลด้วย LED แบบ 7 segments   ถ้าเราจะแสดงเลข 0 จะต้องให้ segment a,b,c,d,e, และ f ติด หรือมีแรงดันเป็น High 
เราสามารถใช้ K-Map ช่วยในการสร้างวงจรของ segment a,b,c,d,e,f และ g ได้โดยดูจากที่นี่ 
แต่ในบทความนี้ เราจะแสดงวิธีการแก้โดยไม่ใช้ K-map

ที่ segment a (a Column) มันจะไม่ติดเมื่อ ค่า BCD เป็น 1 หรือ4   D C B A = 0 0 0 1  หรือ 0 1 0 0
ที่ค่า BCD = 1 a = 0  ถ้าเราใช้ Or gate ในการสร้างวงจร เราจะได้ดังนี้  BCD1 = D+C+B+A´ = 0
ที่ค่า BCD = 4 a = 0  ถ้าเราใช้ Or gate ในการสร้างวงจร เราจะได้ดังนี้ BCD4 = D+C´+B+A = 0
ดังนั้น a = BCD1.BCD4  =  (D+C+B+A´) . (D+C´+B+A) = 0

หมายเหตุ
1.ที่ใช้ OR gate เพราะว่า มันจะให้ค่า 0 กรณีเดียวคือทุก input เป็น 0  
2. ค่าBCD = 1 หรือ BCD = 4   a จะต้องเท่ากับศูนย์ จึงต้องใช้ AND Gate เชื่อม 

เราจะใช้วิธีการเดียวกับที่ใช้กับ a-segment กับทุก segment  เพื่อความรวดเร็ว เราจะใช้วิธีสร้างวงจรที่ให้ ค่าเท่ากับ 0 ที่ BCD ค่าต่างๆ ดังนี้

BCD = 0      =  D+C+B+A = 0 
BCD = 1 =  D+C+B+A´  = 0
BCD = 2 =  D+C+B´+A = 0
BCD = 3 =  D+C+ B´+A´ = 0
BCD = 4 =  D+ C´+B+A = 0
BCD = 5 =  D+ C´+B+A´ = 0
BCD = 6 =  D+ C´+B´+A = 0
BCD = 7 =  D+ C´+B´+A´ = 0
BCD = 8 ไม่ต้องสร้าง เพราะจาก Truth table ข้างบนไม่มี ค่า 0 ที่  BCD = 8
BCD = 9 =  D´+ C+B+A´ = 0

ที่ segment d (d Column) มันจะไม่ติดเมื่อ ค่า BCD เป็น 1 หรือ4  หรือ7
ดังนั้น d = BCD1 . BCD4 . BCD 7 = (D+C+B+A´) . (D+C´+B+A) . (D+ C´+B´+A´)

ที่ segment f(f Column) มันจะไม่ติดเมื่อ ค่า BCD เป็น 1,2,3 หรือ7
ดังนั้น f = BCD1 . BCD2 .BCD3. BCD 7

เอามารวมกันและเขียนเป็นวงจรได้ตามรูปที่ 3 ข้างล่าง

รูปที่ 3 BCD to 7-Segment display decoder

--- กำลังปรับปรุง ----

Tuesday, October 24, 2017

Karnoguh Map ( K-Map)

K-map เป็นวิธีการเขียน Truth table ที่ง่ายต่อการสังเกตุการเปลี่ยนแปลงของค่าในตาราง ทำให้สามารถแก้คำตอบของพีชคณิตบลูเลียน (ฺBoolean algebra) ได้อย่างรวดเร็ว เหมาะสมกับการแก้ปัญหาที่มีตัวแปรไม่เกิน 4 ตัว หรือมากที่สุดไม่เกิน 5 ตัว ถ้าจะใช้มากกว่านั้นจะนิยมใช้ Quine-Mccluskey method หรือ software ในการแก้ปัญหา เนื่องจาก จำนวนช่องในตารางมันมากเกินไปและยากต่อการสังเกตุ
รูปที่ 1 Truth table normal form (left)  K-Map form (middle) 
ในรูปที่ 1 ตารางด้านซ้าย เป็น Truth table ซึ่งเขียนในรูปปกติ  ตรงกลางเป็นการเขียนในรูป K-map  ส่วนขวาสุด เป็น บลูเลียน พีชคณิตในช่องต่างๆ  เมื่อสังเกตุดูตารางด้านซ้าย เราจะเห็นว่า เป็น OR Truth table เขียนเป็นสมการบลูเลียน ได้ดังนี้
F = A + B ; + แทนการ OR
ส่วนตาราง K-Map เรามีจุดสังเกตุดังนี้  ถ้ามองกรณีที่ F =1
ใน Row ที่ A = 1 นั้น ไม่ว่า B จะเท่ากับ 0 หรือ 1  F = 1 เสมอ  แสดงว่า F ไม่ขึ้นกับค่า B แต่ขึ้นกับ Aเท่านั้น F = A
ใน Col.ที่ B = 1 นั้น ไม่ว่า A จะเท่ากับ 0 หรือ 1  F = 1 เสมอ  แสดงว่า F  ไม่ขึ้นกับค่า A แต่ขึ้นกับ Bเท่านั้น F = B
เมื่อนำมารวมกัน ได้ F  = A + B

ข้อสังเกตุ
ในตาราง K-Map  ข้างบน ถ้าเรามองกรณีที่ F = 0 , A = 0 และ  B = 0    ถ้าจะใช้ K-Map จะตีความดังนี้
F´ = A´.B´   ;  F = (A´.B´)´  =  A + B   ( ´ แทนการ NOT   . แทนการ AND) 

กฏการเขียน K-Map
1. เขียน Input ที่เป็นไปได้ในแนว Rowกับ Column  และผลลัพท์หรือ Output คือค่าในตาราง
2. การเปลี่ยนสถานะของ Input จะต้องเปลี่ยนแปลงทีละตัว ไม่ว่าในแนว Row หรือ Col.   เช่น

รูปที่ 2 ตาราง K-map แบบ 2,3 และ 4 ตัวแปร
จากรูปที่ 2 ในตาราง K-map แบบ 3 และ 4 ตัวแปร เราจะเห็นว่า BC จะเขียนค่าเรียงตามลำดับได้ดังนี้
BC = 00 , 01, 11, 10  ในตาราง 3 ตัวแปรAB  และ CD = 00 , 01, 11, 10  ในตาราง 4 ตัวแปร
m0 ถึง m16 คือค่าของ F (A,B,C,D) ที่ตำแหน่งนั้น นิยมเรียก minterm  เช่น m5 = F (1,0,1) ในกรณี 3 ตัวแปร และ    m5 = F (0,1,0,1) ในกรณี 4 ตัวแปร
ทำไมไม่เรียงแบบเลขฐานสอง BC = 00 , 01 , 10, 11   จริงๆ ก็เรียงได้ไม่ได้ทำให้ F เปลี่ยนไป แต่จะสังเกตุความสัมพันธ์ยาก หรือจับกลุ่มยาก เมื่อตารางใหญ่ขึ้น แบบนี้ การเปลี่ยนสถานะจาก  BC =01 ไปเป็น BC = 10 มีการเปลี่ยนแปลงตัวแปรพร้อมกัน 2 ตัว คือ B จาก 0 ไป 1 และ C จาก 1 ไป 0

รูปที่ 3 เปรียบเทียบ K-map กับ การ Map ที่เรียงค่าแบบเลขฐาน 2  
พิจารณา กรณีที่ F = 1
ใน Rowที่ A = 1 ใน รูป 3A และ 3B ได้ว่า การเปลี่ยนแปลงค่าของ B และ C ไม่มีผลต่อค่า F ดังนั้นได้ว่า F = A
ใน Rowที่ A = 0 ใน รูป 3A และ 3Bการเปลี่ยนค่าของ B จาก 0 ไป 1 ไม่มีผลต่อ F  แสดงว่า F ไม่ขึ้นกับ B  แต่จะให้ค่าตรงกันข้ามกับ input C ดังนั้น F = A´.C´ ( ´ แทนการ NOT   . แทนการ AND)
พิสูจน์โดยพีชคณิต บลูเลียน กรณี A = 0  และF = 1
F = A´.B´.C´ + A´.B.C´ =  A´.C´.(B´+B) =  A´.C´.1 = A´.C´
นำเอา F A=0  + F A=1  =  A´.C´+A
3. ให้จับกลุ่มตามค่าความจริงของ F  = 0 หรือ 1 อย่างใดอย่างหนึ่งเท่านั้น
4. การจับกลุ่มต้องจับในแนว ดิ่งหรือแนวนอน เท่านั้น ไม่สามารถจับกลุ่มตามแนวทแยงได้
5. ต้องจับกลุ่มให้อยู่ในรูป 2n  คือ 1 ,2,4,8.. ช่องเท่านั้น คือ จับกลุ่มทีละ 3,5,6,7... ไม่ได้
6. ต้องจับกลุ่มให้ใหญ่ที่สุด หรือครอบคุมตัวแปรให้มากที่สุด เพื่อให้จำนวนกลุ่มน้อยที่สุด
7.กลุ่มที่จับ สามารถทับซ้อนกัน
ตัวอย่างที่ 1 ให้ตาราง Truth table ของวงจรที่ต้องมีค่าตามรูปที่ 4

รูปที่ 4 Truth table ของวงจรที่ต้องการ  และ K-map
ทำตามกฏการเขียน K-Map
ข้อ 1 เขียน Input ในแนว Row กับ Col  ให้ผลลัพท์ที่ต้องการคือค่าในตาราง
ข้อ 2 การเปลี่ยนสถานะของ Input จะต้องเปลี่ยนแปลงทีละตัว ไม่ว่าในแนว Row หรือ Col.
จากข้อ 1 และ 2 เขียนตาราง K-Map ได้ตามรูปข้างบน
ข้อ 3-7 จับกลุ่มตามค่า F = 1  ในแนวนอน หรือแนวดิ่งให้มากที่สุด และสามารถทับซ้อนกันได้

รูปที่ 5 แสดงการจับกลุ่ม
รูป 5A จับไม่ถูกต้อง ตามกฏข้อ 5 คือ จับ ไม่อยู่ในรูป 2n  คือ 1 ,2,4,8  ช่อง
รูป 5Bจับไม่ถูกต้อง ตามกฏข้อ 6 คือ  ต้องจับกลุ่มให้ใหญ่ที่สุด แต่จำนวนช่องต้องอยู่ในรูป 1,2,4,8 เป็นต้น
ทั้ง 5A และ 5B เป็นการจับกลุ่มที่ไม่ดี แต่ก็ยังแก้ พีชคณิต บลูเลียนได้แต่ช้า
รูป 5C จับได้ถูกต้อง คือเป็นกลุ่มละ 4 ช่อง และมีพื้นที่ทับซ้อนกัน แต่ยอมได้ตามกฏข้อ 7

จากรูปที่ 5C  พิจารณาที่พื้นที่สีเขียว  A และ  B มีการเปลี่ยนแปลงค่า คือ 0 และ 1 แต่ไม่มีผลต่อการเปลี่ยนแปลงของค่า F หรือค่าความจริง ดังนั้นค่า F ไม่ขึ้นกับค่า A และ B แต่ขึ้นกับ C เท่านั้น คือ Cมีค่าเป็น 1 จะทำให้  F = 1
ดังนั้นบริเวณนี้ ได้ว่า  F  =  C
เพื่อความรวดเร็ว เราจะใช้วิธีดูว่า ค่าตัวแปรใด ในพื้นที่ที่เราจับกลุ่มไม่มีการเปลี่ยนแปลงค่า  แสดงว่า F ขึ้นกับตัวแปรนั้น  กรณีพื้นที่สีเขียว C ไม่มีการเปลี่ยนแปลงค่า F = C

จากรูปที่ 5C  พิจารณาที่พื้นที่สีเหลือง A และ  C  มีการเปลี่ยนแปลงค่า คือ 0 และ 1 ขณะที่ B ไม่เปลี่ยนแปลง และมีค่าเป็น 1 ดังนั้นบริเวณนี้ ได้ว่า  F  =  B
ดังนั้น F = B + C
ลองตรวจสอบคำตอบ กับ ตาราง K-map
ถ้า  B = 0 , C= 0  F = B+ C = 0  นั่นคือ ช่องที่ BC = 00 จะได้ F =0
ถ้า  B  และ  C ไม่เป็น 0 พร้อมกัน เช่น  ช่องที่ BC = 01,11 หรือ 10  จะได้ F =1

ตัวอย่างที่ 2 ให้ F( m5,m7,m13,m16) = 0 จงหาฟังก์ชั่น F
อย่างนี้บอกในรูป minterm  ตัวสูงสุด m16 แสดงว่า เป็นตาราง K-map แบบ 16 ช่อง ตามรูปที่ 2 ข้างบน  เขียนเป็นตาราง K-map ได้ดังนี้

รูปที่ 6 K-map F(m5,m7,m13,m16) = 0
ตามกฏข้อ 3- 7 จับกลุ่มตาม F = 1  และจับกลุ่มให้ใหญ่ที่สุดในรูป  1,2,4 ,8 หรือ 16

ตามกฏข้อ 6 จับกลุ่มให้ใหญ่ที่สุด และจำนวนกลุ่มน้อยที่สุด ทำได้ตามรูปคือ จับกลุ่มละ8  2กลุ่มตามรูป คือ กลุ่มสีเขียวและ กลุ่มสีแดง
ที่กลุ่มสีเขียว จะเห็นว่า A, C, D มีการเปลี่ยนค่า จาก 0 และ 1 แต่ B ไม่เปลี่ยนแปลงค่า  และมีค่าเป็น 0 ดังนั้นที่กลุ่มนี้ ได้ F = B´
ที่กลุ่มสีแดง จะเห็นว่า A, B, C มีการเปลี่ยนค่า จาก 0 และ 1 แต่ Dไม่เปลี่ยนแปลงค่า และมีค่าเป็น 0 ดังนั้นที่กลุ่มนี้ ได้ F = D´
ได้ว่า  F = B´ +  D´

ตัวอย่างการจับกลุ่มในรูปแบบต่างๆ

รูปที่ 7 แสดงตัวอย่างการจับกลุ่ม
รูปที่ 8 จับกลุ่มมากเกินไป
เปรียบเทียบ รูปที่ 7B กับ รูปที่ 8  ซึ่งกลุ่มสีเหลืองทับซ้อนกับ กลุ่มสีแดงและสีเขียวทั้งหมด  อย่างงี้ไม่จำเป็นต้องจับกลุ่มสีเหลือง เพราะ 1 ทุกตัวมีกลุ่มอยู่แล้ว และตาม กฏข้อที่ 6 ให้จับกลุ่มให้ได้น้อยที่สุด

พิสูจน์    รูป ที่ 7 B  F 1 = B´.D´ + A.B   เท่ากับ รูปที่ 8  F2  = B´.D´ + A.B +A.D´ 
  ถ้า  A = 0  F1 =   B´.D´    F2  = B´.D´
  ถ้า  A = 1  F 1 = B´.D´ + B    F2  = B´.D´ +D´ + B   =   D´.(B´+1) + B  =  B´.D´ + B

ตัวอย่างที่ 3 ให้ออกแบบวงจร  BCD to 7 Segment  Display decoder

รูปที่ 9  BCD to 7 Segment display decoder truth table
จากรูปที่ 9 เป็นตัวแสดงผลด้วย LED แบบ 7 segments 
ถ้าเราจะแสดงเลข 0 จะต้องให้ segment a,b,c,d,e, และ f ติด หรือมีแรงดันเป็น High
ถ้าเราจะแสดงเลข 1 จะต้องให้ segment b และ c ติด หรือมีแรงดันเป็น High

กรณีใช้  K-map แก้ปัญหา  จากตารางค่าความจริงรูปที่ 9 ค่า BCD ที่เป็นไปได้มีค่า 0- 9 ดังนั้นถ้าใช้ K-map แบบ 4 ตัวแปร เทอมที่ 10-15 จะไม่มีโอกาศเกิดขั้น จะใช้ don’t care condition (x)

ที่ segment a (a Column) มันจะไม่ติดเมื่อ ค่า BCD เป็น 1 หรือ4  หรือค่า DCBA = 0001 หรือ 0100

กรณีคิดจาก a = 1 หรือมันจะติด กลุ่มสีเขียว a = B กลุ่มสีแดง a = D กลุ่มสีเหลือง a = C´.A´ กลุ่มสีส้ม a = C.A เพราะฉะนั้น a = B + D + C´.A´ + C.A ( C´.A´ + C.A สามารถแทนได้ด้วย C XOR A)

ที่ segment b (b column) มันจะไม่ติดเมื่อ ค่า BCD เป็น 5 หรือ 6
กลุ่มสีเขียว a = C กลุ่มสีแดง a = D กลุ่มสีเหลือง a = B´.A´ กลุ่มสีส้ม a = B.A เพราะฉะนั้น b = C+ D + B´.A´ + B.A

ที่ segment c (c column) ที่ segment d (d column) ที่ segment e(e column)

c = D+C+A+B´ d = D+B.A´+C´.A´+ C´.B+C.B´.A e = B.A´+C´.A´ หมายเหตุ ที่ Segment e ไม่ต้องจับกลุ่ม x ที่ไม่มี 1 อยู่เนื่องจากมันไม่มีโอกาศเกิดขึ้น (เช่น แถวDC = 11) ที่ segment f (f column) ที่ segment g (g column)








f = D+C.B´+B´A´+C.A´ g = D+C.B´+B.A´+C´B

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 เป็นต้น  ยังจะไม่กล่าววิธีการเหล่านี้ในตอนนี้

Monday, October 16, 2017

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

วงจรลบ (subtraction circuit)

ในการลบเลขฐานสอง แบบ 1 บิท เช่น A = 0  B = 1  ให้  X = A – B
 เราจะได้ว่า  X =  0 - 1   ไม่สามารถลบได้ ต้องยืมค่าจากบิทต่อไป ซึ่งมีค่า 1 02  จะแสดงการยืมค่าด้วย Bo  ที่บิทสูงสุด
ดังนั้น   X =  1 02 – 012 = 1  และ Bo = 1 ซึ่งแสดงว่าค่าที่ได้เป็นค่าลบ
ถ้าเราจะสร้างวงจรดิจิตอล เพื่อหาคำตอบ ของ A – B แบบ 1 บิทนี้ มันจะต้องสอดคล้องกับค่า A และ B ที่มีโอกาศจะเป็นไปได้ ทั้งหมด ตาม Truth table ในรูปที่ 4  ซึ่งเราจะได้วงจรดังนี้
X =  A XOR B  และ  Bo =  A' and B     ;    '  แสงการ NOT หรือ Invert ค่า
ลองทดสอบ กรณี  A = 0   และ B = 1 
X = 0 XOR 1  = 1     Bo = 1 and 1 =  1    ได้ค่าตรงตามตรารางค่าความจริง

รูปที่ 4 วงจรลบแบบไม่มีการยืม Half subtractor
ก่อนที่เราจะว่ากันด้วยหลักการทางคณิตศาสตร์ เรามาดูวิธีการสร้างจริงในทางปฎิบัติ ซึ่งเราใช้โปรแกรมในการช่วยออกแบบ Logisim  โดยเราจะให้ Logisim สร้างวงจรตาม Truth table ที่เรากำหนด



ถ้าเราจะแก้สมการนี้ X = 4,321 x 23 + 121/2 -7  ในปัจจุบันนี้เราคงไม่มาแก้ด้วยการคิดเอง หรือเขียนบนกระดาษ
เราคงจะเปิด App ในมือถือ หรือไม่ก็ใช้เครื่องคิดเลขในการหาคำตอบ  เราจะแก้คำตอบโดยการคิดเอง ก็ต่อเมื่อเป็น การเรียนการสอนเท่านั้น เช่น เดียวกัน ที่เราใช้ Logisim  เพราะในทางปฏิบัติ  ถ้าวงจรซับซ้อนมาก  เราคงไม่มานั่งทำ K-Map  หรือ  Karnaugh map ซึ่งแม้นเป็นวิธีการสร้างวงจรตรรกะ ที่รวดเร็วและง่ายต่อการเข้าใจ  ซึ่งมันอาจจำเป็นในการเรียน การสอน แต่ในทางปฏิบัติ  มี Tool หรือ เครื่องมืออยู่แล้ว  เราไม่ควรไปเสียเวลาทำเอง เพราะโอกาสพลาดมีเยอะ และยังไงเราก็ต้องต่อวงจรทดลองอยู่ ดี  ทางที่ดี ก็ให้ Tool มันสร้าง แล้วมาดัดแปลงแก้ไข ให้ดีขึ้น
หมายเหตุ
    • วงจรที่ Logisim สร้างขึ้น มันเป็นวงจรทางทฤษฎี ไม่ใช่ทางปฏิบัติ กล่าวคือ มันจะถือว่า เกจท์ (gate) หรืออุปกรณ์ ไม่มี Delay ภายในวงจรเลย ซึ่งจริงๆ แล้วไม่มี เกจท์ หรืออุปกรณ์อีเลคโทรนิคส์ตัวใด ไม่มีการ Delay ภายในวงจร ในสมัยก่อน เกจท์ (gate) แบบต่างๆ เช่น AND,OR, NOT เป็นต้น มี Delay ภายในค่อนข้างมาก เทียบกับปัจจุบัน ดังนั้น จึงอาจมี Rule of thump หรือกฏเกณท์ง่ายๆ ว่า ห้ามต่อเกจท์ใดๆ อนุกรมกันเกิน 4 ตัว เนื่องจาก  สมมุตว่าเกจท์แต่ละตัวมี Propagation delay  เท่ากันแล้ว  ถ้าต่ออนุกรมแบบ 4 ตัว Delay ที่เกิดขึ้นจะเป็น 4 เท่า  อาจจะทำให้ Output ของมันเปลี่ยนแปลงช้าเกินไป ไม่ทันการทำงานของวงจรอื่น หรือ Clock ของวงจร กรณีวงจรที่มีการใช้ Clock  เช่น CPU
    • Propagation delay คือ เวลาที่ใช้ในการเปลี่ยนแปลงค่า output จน stableของอุปกรณ์นับตั้งแต่เริ่มป้อน input
    • และในทางปฎิบัติอีกเช่นกัน เราก็สามารถ สร้างวงจร Delay ใส่ไว้ให้กับ Logisim เพื่อให้มัน Simulate ได้แม่นยำขึ้น

และเช่นเดียวกัน เราได้วงจรลบแบบมีการยืม หรือ Full subtractor ตามรูปที่  5
รูปที่ 5 วงจรลบแบบที่มีการยืม Full subtractor
หากเราจะลบเลขฐานสอง หลายๆ บิท เช่น 4  bit เราสามารถใช้วงจร Full subtractor  แบบ 1 บิทมาต่อกันดังรูปที่ 6
รูปที่ 6 4 bit subtractor
จากรูปที่ 6: A = 01002 (410) - 10002 (810) ได้ X = 11002 (1210 ) และ Bo = 1
ถ้าเอา Bo กับ X มาเรียงกันเป็น 1 11002 แล้วตีความตรงๆ เช่น  -12  หรือ16 + 12 = 28 ยิ่งไปกันใหญ่
Bo = 1 แสดงว่า มีการยืมค่ามาจากบิทถัดไป และค่าที่ได้เป็นค่าลบ  แต่จะมีค่าลบเท่าไรต้องเทียบว่าค่าที่ได้
อยู่ห่างจากบิทสูงสุดเท่าไร กรณีนี้ มีการยืมค่ามาจากบิทที่5 (บิท4) ซึ่งก็คือ   1 00002  = 1610
มีอยู่แล้ว 4 ยืมมาอีก 16  A = 16 +4 ทำการลบแล้วเหลือเท่ากับ X = 12  แสดงว่ามันเกิดการติดลบหรือขาดอยู่เท่ากับ  1 00002   - 11002 = 01002  ได้คำตอบว่า A – B = - 01002
(วิธีที่ง่ายกว่า ก็คือ จับ X มาทำ 2’s complement แล้วใส่เครื่องหมายลบ ข้างหน้า)

ระบบ complement (complement system)  

แทนที่เราจะแสดงค่าลบ ด้วยเครื่องหมายลบ  เช่น - 01012   ในระบบนี้จะแสดงด้วย sign bit หรือ sign digit แทน  เช่น
- 01012     =  10112   ในระบบ 2’s complement system    1 เป็น sign bit บอกว่าเป็นลบ
       -5    =  95        ในระบบ 10’s complement system  9 เป็น sign bit บอกว่าเป็นลบ

เลขลบคือ อะไร ?  ในทางคณิตศาสตร์  เลขลบเกิดจากการคิดทิศทาง หรือบอกจำนวนที่ขาดอยู่  เช่น
-5  หมายถึง ขาดอยู่ 5 หรือ ในระบบแกน x,y มันหมายถึง ทิศทางที่ตรงกันข้ามกับค่าบวก ซึ่งจะอ้างอิงจากค่า 0
แต่ในระบบ  complement จะอ้างอิงจากจุด หรือหลักที่สูงกว่า เช่น

10112  ในระบบ 2’s complement system  จุดอ้างอิงมันอยู่ที่ 10002
  1012  ในระบบ 2’s complement system  จุดอ้างอิงมันอยู่ที่ 1002
    95   ในระบบ 10’s complement system  จุดอ้างอิงมันอยู่ที่ 10

ตัวอย่าง 10’s complement ของ 4,500  = 10,000-4,500 =5,500   (มันอยู่ห่างจาก 10,000 เท่ากับ -5,500)
ดังนั้น 10112  หมายความว่า มันอยู่ห่างจาก 10002  = 3 จะหาว่ามันห่างจาก 0 เท่าไร
ก็ต้องเอา   10002  มาลบด้วย 00112  อีกที จะได้ว่า = 5 (เมื่อคิดเครื่องหมาย = -5)










ในวงจรดิจิตอล จะนิยมใช้การลบด้วยการบวกเลขที่มีค่าเป็นลบ  เช่น A = 01002  B = 10002
A – B =   01002 + (-10002 )  ตัวเลขที่เป็นลบนี้ นิยมใช้  2’s complement ในการแสดงค่า
A – B =  A + 2’s complement  of B
2’s complement ของ 10002  = 10002 - 000 =  10002  (บังเอิญเท่ากันพอดี)
A – B =  01002 + 10002   = 11002   อยู่ในรูป 2’s complement  จะทำให้จุดอ้างอิงอยู่ที่ 0
A – B =  -(10002 – 1002)  = -4

การหาค่า 2’s complement ในวงจรดิจิตอล จะทำโดยอาศัยหลักการที่ว่า
2’s complement  =   1’s complement  + 1
เมื่อ 1’s complement  คือการ invert ค่าจาก 0 เป็น 1 และ 1 เป็น 0 เช่น 10102   = 01012

ดังนั้นในวงจรดิจิตอล ถ้าเราจะหาคำตอบ ของ A-B ในรูป
A – B =  A + 1’s complement of B + 1 
เราสามารถใช้ วงจร Full adder ในการหาคำตอบ ด้วยการใส่ invertor หรือ not gate เข้าที่หน้า input ของ B  และให้  Carry in มีค่าเท่ากับ 1 หรือแรงดันระดับ High  ทำได้โดยต่อ Carry in ของ Full adder เข้ากับไฟเลี้ยงของวงจร  ส่วน Carry out จะต้องใส่ not gate เพิ่มเช่นกัน ตามรูปที่ 7 แต่จะได้วงจรลบแบบ Half  subtractor
รูปที่ 7 การลบแบบ 1 บิท โดยการใช้ Full adder
ดูจาก Truth table ในรูปที่ 7  แล้วมันมั่วหรือเปล่า  ไม่เห็นจะเหมือนกับในรูปที่ 2 หรือ รูปที่ 5 เลย  มันเหมือนรูปที่ 2 แน่นอน แต่ไม่เหมือนรูปที่ 5 เพราะมันเป็นแค่ Half subtractor   จะดูให้เหมือนเราต้องตัด กรณี Cin = 0 ออกให้หมด เพราะ Cin หรือ C จะถูกต่อเข้าที่ 1  หรือแรงดัน High ตลอดเวลา ไม่มีทางที่ Cin จะเท่ากับศูนย์  กรณีนี้ Co จะถือว่าเป็น  Bo  ถ้า Co = 1 แสดงว่าเกิดการยืม ค่าที่ได้เป็นค่าลบ (เลยต้องใส่ Not ให้เกิดทิศทางตรงกันข้าม)

รูปที่ 8 วงจรลบแบบ 4 บิท ที่สร้างมาจาก Full adder
อย่าไปสับสนกับวงจรในรูปที่ 6  อันนั้้นสร้างจาก Full subtractor รูปที่ 8 นี้สร้างจาก Full adder



Sunday, October 15, 2017

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

ในทางดิจิตอลอีเลคโทรนิคส์ ระดับแรงดัน (Voltage) จะมีเพียงสองค่า คือระดับแรงดัน Low กับ High  มันคือการเปลี่ยนสถานะหรือระดับแรงดันของวงจร ไม่มีความเกี่ยวข้องกับตัวเลขแต่อย่างไร แต่เราสามารถประยุกต์ให้มันทำงานในลักษณะเลขฐานสอง หรือแก้ปัญหาในระบบเลขฐานสองได้ โดยเปรียบเทียบเป็นตัวเลขก็คือ  0 และ 1และทางตรรกะ(logic) ก็คือ False และ True หรือ

วงจรบวก (Addition circuit)

ในระบบเลขฐานสอง ถ้าเรานำตัวเลข 1 + 1 จะมีค่า =  102   (ฐาน2)  แต่ถ้าเรานำ output ของวงจรดิจิตอล 2 วงที่มีระดับแรงดัน 1มารวมกันหรือต่อกันตรงๆ 1 + 1 อาจจะเท่ากับพัง  เพราะมันไม่ใช่ตัวเลข แต่ เราสามารถใช้  logic gate มาต่อกันเพื่อให้มันแสดงคำตอบของการบวกเลขฐานสอง เช่น ใช้ วงจร Half adder
รูปที่ 1 วงจรบวกแบบไม่มีตัวทด Half adder
หากเรานำ logic gate มาต่อเป็นวงจร Half adder ตามรูปที่ 1 ค่าที่เป็นไปได้ของมันจะเป็นไปตาม Truth table ซึ่งจะสอดคล้องกับนำเลขฐานสองมาบวก     คือถ้าป้อนแรงดันเป็น 1ที่ input A และ B output ของ XOR Gate จะเป็น 1 หรือ แรงดันเป็น High ที่ AND Gate  จะเป็น 0 หรือระดับ Low

โดยที่  X = A XOR B   Co = A AND B   และผลลัพท์ของการบวกได้จากการนำ Co และ X มาเรียงกัน เช่น
ถ้า A = 1, B =1  แล้ว  X = 0 และ Co = 1 คำต้อบ คือ Co X  หรือ 1 02   =  210  (ในระบบฐาน10)

ย้อนกลับมา การบวกเลขฐานสอง แบบ 1บิท
 A , B = ค่าที่จะนำมาบวก   X =  A + B =  ผลลัพท์ที่ได้จากการบวก
ถ้า  A = 1, B = 1  แล้ว A + B = 1 02   เกิดตัวเลขขนาด 2 บิท  โดยที่ 1 เป็นตัวทดไปยังบิทต่อไป
ค่าที่เป็นไปได้ทั้งหมด ของ X ตามการเปลี่ยนค่า ของ A และ B เป็นไปตาม Truth table ในรูปที่ 1  โดยให้ Co (Carry out) แทนตัวทดไปยังบิทต่อไป  เมื่อเทียบกับ Truth Table ของเกจท์ ต่างๆ ในตอนที่แล้ว….คลิ๊กที่นี่
เราจะเห็นว่า เราสามารถใช้ XOR เกจท์ แทน X  ที่เปลี่ยนไปตามค่าของ A และ Bได้ และ ใช้ AND เกจท์ แทน Co ที่เปลี่ยนไปตามค่าของ A และ Bได้

ที่นี้หากเราต้องการบวกเลขฐานสอง 1 บิทแบบมีตัวทดมาจากบิทก่อนหน้า หรือมี Carry in เราจะเขียนเป็นสมการดังนี้
X = A+B+Ci      โดยที่
Ci = Carry in  หรือตัวทดจากบิทก่อนหน้า และCo = Carry out หรือตัวทดไปยังบิทถัดไป

สมมุติเรากำลังบวกเลขในบิทที่ 2 และมีตัวทดมาจากบิทที่1  โดยที่
A  = 1 B = 0 และตัวทด  Ci= 1  เราจะได้ผลลัพท์
X = 0 ในบิทที่ 2 และมีตัวทด Co = 1ไปยังบิทที่ 3

ถ้าเขียน ค่าที่เป็นไปได้ทั้งหมดของการบวก จะได้ Truth table ตามรูปที่ 2 และสามารถใช้วงจร Full adder ในการแก้คำตอบ
โดยที่   output X = A XOR B XOR Ci   และ  Co =  (A XOR B) .Ci + (A .B)
+ ในที่นี้แทนการ OR และ . แทนการ AND
ผลลัพท์เมื่อเทียบกับการบวกทางคณิตได้จากการนำ Co และ X มาเรียงกัน

หมายเหตุ:
ระวังการใช้เครื่องหมาย “+ “ ในสมการทางคณิตสาตร์ มันคือการบวก  ในทางตรรกะมันคือการ OR
 X = A + B + Ci    ← สมการคนิตศาสตร์ หรือ ตรรกะ บอกไม่ได้ ขึ้นอยู่กับสถานะการณ์ที่ใช้
แต่ในวงจรดิจิตอล มันจะมีแต่สมการทางตรรกะ

รูปที่ 2 วงจรบวกแบบมีตัวทด Full adder
ย้อนกลับมาอีกครั้ง สำหรับการบวกเลขฐานสอง แบบ 1บิท  แบบมีตัวทด
 A , B = ค่าที่จะนำมาบวก  และ Ci = ตัวทดจากบิทก่อนหน้า 
 X =  A + B + Ci =  ผลลัพท์ที่ได้จากการบวก  
เราสามารถแก้สมการนี้ได้ด้วยตัวเอง คื อ เอา A บวกB ก่อน แล้ว เอามาผลลัพท์มาบวก Ci อีกครั้ง
ให้ Y =  A+ B และ X = Y + Ci
Y =   A + B  กลายเป็นการบวกแบบไม่มีตัวทดแล้ว  ส่วน
X =  Y + Ci  ก็กลายเป็นการบวกแบบไม่มีตัวทดแล้ว  

ตรงนี้แสดง ว่า เราสามารถใช้  Half adder 2 ตัว มาแก้ปัญหา  Y = A+ B และ X = Y + Ci ได้
ถ้าต้องการผลลัพท์  X = A + B + Ci  ก็คือการเอาHalf adder ทั้งสองตัวมาต่ออนุกรมกัน
แต่มีความเป็นไปได้ที่
Y = A + B  แล้วเกิดตัวทด  หรือ Carry out ได้ เช่นเดียวกัน 
X =  Y + Ci  แล้วเกิดตัวทด  หรือ Carry out 

เช่น A = 1 , B =1  มีตัวทดจากบิทก่อนหน้าเป็น Ci = 1
Y = A + B   = 1 +1 =  0  และมีตัวทด  = 1
X = Y + Ci  = 0 +1 =  1  และมีตัวทด  = 0  คือไม่มีตัวทด
เราจะต้องนำตัวทดทั้ง 2 มา OR กัน คือ Half Adder ตัวใดๆ ตัวนึงเกิดตัวทด มันจะส่งผลให้เกิดตัวทดในระบบ จะได้สมการตรรกะดังนี้

X =  Y XOR Ci , Co = Y AND Ci
X =  A XOR B XOR Ci   และ  Co =  (A XOR B) .Ci + (A .B) ← Carry out ของวงจรแรก

การบวกเลขหลายบิท โดยทั่วๆ ไป (มีหลายวิธีในทางคณิตศาสตร์) ก็คือการบวกเลขทีละบิทโดยเริ่มจากบิทต่ำสุดไปยังบิทสูงสุด (Least significant bit  to most  significant bit)  เช่น เราจะบวกเลขฐานสอง 2จำนวน  เช่น A = 10102  กับ B =  01112


บิทต่ำสุด คือบิท 0 และสูงสุดคือ บิท 3 กรณี ตัวเลข 4 บิท
  ให้ A[0] = ค่าของ A ในบิท 0  A[n] = ค่าของ A ในบิท n
   ดังนัน   X = A +B +Ci  เขียนเป็นบิทได้ดังนี้
  X[n] =  A[n] + B[n] + Ci[n]  หรือ
   X[n] =  A[n] + B[n] + Co[n-1]   ( Ci[n] = Co[n-1])



ตัวอย่างบวกเลขในบิท2   X[2] = A [2]+ B[2] + Co[1]  =  0 + 1 +1  = 0 และมี Co[2]  หรือ Ci[3] = 1 
 X = 0001 = 110   และมีตัวทดไปยังบิท4  Co = 1  หากนำบิท 0 ถึง 4 มารวมกันจะเท่ากับ 10001  = 1710

เราสามารถแก้ปัญหาการบวกเลขหลายๆ บิทได้โดยการใช้วงจร Full adder แบบ 1 bit มาต่อรวมกันตามรูปที 3 โดยตัวทดในบิทแรก (บิท 0) ไม่มี ให้ป้อนด้วยระดับแรงดัน Low หรือ 0  สะดวกที่สุดก็คือการต่อลง ground ในวงจร


รูปที่ 3 วงจรบวกแบบ 4 bit สร้างจาก 1 bit Full adder
ถ้าพิจราณาดู จะเห็นว่าวงจรดิจิตอล จะทำงานแบบขนาน คือมันจะบวกทุกบิทไปพร้อมๆ กัน ต่างกับการบวกด้วยคนซึ่งโดยมากต้องบวกทีละบิท 


ต่อไปเราจะทดลองวงจร Half adder และ Full Adder ด้วย Logisim

  

Friday, October 13, 2017

KiCad ตอนที่ 3 สร้าง KiCad schematic symbol library ด้วย Kipart

การสร้าง  Symbol library  ใหม่ สำหรับ Eeschema
วิธีที่ 1  สร้างด้วย schematic library editor

วิธีนี้เหมาะสำหรับการเอา  symbol library ที่มีอยู่แล้วมาแก้ไข แล้ว Save ในชื่อ library ใหม่ เช่น  สมมุติเราจะสร้าง IC ตัวใหม่ที่มีจำนวน ขาเท่ากับ IC555 ก็ให้เปิด  symbol library ของ IC555 มาแก้ไขเปลี่ยนแปลงชื่อ Pin เอา  การแก้ไขดังกล่าวไม่เกี่ยวกับ footprint แต่อย่างไร เนื่องจากมันอาศัย CvPCB ในการเชื่อมโยง footprint เข้ากับ symbol
วิธีนี้ทำโดยการคลิ๊กที่   schematic library editor Icon ใน Kicad Manager หรือ Tools--> library editor ใน Eeschema  จะไม่ขอกล่าวในที่นี้ เนื่องจากทำได้ง่าย แต่เสียเวลา เหมาะกับการแก้ไขอุปกรณ์ที่มีจำนวน Pin น้อยๆ และสามารถหาดูวิธีการทำได้ในคู่มือ หรือบนอินเตอร์เน็ต

รูปที่ 1 วิธีเรียกใช้ Library editor
ข้อดี : -
    • แก้ไขได้รวดเร็ว และสามารถเห็นหน้าตา หรือ Symbol ขณะที่แก้ไขได้ 
    • ปรับขนาด กว้าง , ยาว ของ symbol และระยะห่างของ Pin ได้ตามใจ
    • สร้าง symbol ที่มีรูปร่างต่างๆ ได้หลากหลาย เช่น ทรานซิสเตอร์, เสาอากาศ, op-amp เป็นต้น

ข้อเสีย :-
    • การแก้ไขอุปกรณ์ ที่มีหลายขา เช่น IC ใน Package DIL,QFP,PGA, LCC เป็นต้น เสียเวลามาก และต้องเลือกเอาต้นแบบที่คล้ายกันมากๆ มาแก้ไข ซึ่งต้องเสียเวลาหาต้นแบบใน library นาน
    • ถ้าจะสร้างใหม่ตั้งแต่ต้น ก็เสียวลานานในการวางตำแหน่ง PIN  วาด Symbol
    • บางครั้งจะมีปัญหา Hidden pin จาก symbol ที่เราเอามาแก้ไข
    • ทุกครั้งที่จะแก้ไข จะมีหน้าต่าง popup ขึ้นมาให้ใส่ค่า ทุกครั้งไป ทำให้ช้าขึ้นไปอีก

วิธีที่ 2 สร้างด้วย Kicad Quicklibary เว็บไซท์

รูปที่ 2 หน้าตาของ KiCad quicklib

โดยให้เข้าไปที่ http://kicad.rohrbacher.net/quicklib.php จะมีหน้าตาดังรูปที่ 2   เมื่อคลิ๊กที่ Assign Pin  จะโหลดหน้าต่างใหม่ ให้ตั้งชื่อ Pin, Type, Name และ Format

ข้อดี : -
    • แก้ไขได้รวดเร็ว 
    • ปรับขนาด กว้าง , ยาว ของ symbol และระยะห่างของ Pin ได้ตามใจ
    • ไม่จำเป็นต้องติดตั้งโปรแกรมเพิ่มเติม
    • เห็นรายละเอียดต่างๆ ของ Pin ที่สร้าง

ข้อเสีย :-
    • สร้างได้แต่อุปกรณ์ที่มี Package ตามที่แสดงในเวบ คือมี Package สี่เหลี่ยมเท่านั้น
    • ถ้า IC มีจำนวนขาเยอะๆ เช่น 40 ขาขึ้นไป ก็ยังใช้เวลานานในการใส่ข้อมูล
    • ต้องออนไลน์

วิธีที่ 3 สร้างด้วย Kipart

Kipart เป็น Python script  ที่ใช้ในการสร้าง Kicad symbol library จาก  CSV file  มันมีความสามารถที่จะอ่าน CSV files หลาย ไฟล์ แล้วแปลงเป็น  Kicad symbol library  ได้ในครั้งเดียว 
วิธีนี้ใช้สร้าง symbol library ที่มี package ที่แน่นอนเช่น เดียวกับการสร้างด้วย Kicad quicklib ในวิธีที่ 2 แต่รวดเร็วกว่ามาก โดยเฉพาะ IC ที่มีขาเยอะๆ แต่ต้องมี datasheet หรือ pin description หรือ pin functions  ของ IC นั้นๆ

ข้อดี : -
    • สร้างอุปกรณ์ที่มีจำนวน Pin เยอะๆ ได้รวดเร็วมาก
    • สามารถสร้าง symbol library  ได้หลายๆ ตัวในเวลาเดียวกัน เช่น ใน 74xx  library ถ้าเปิดเข้าไปดู จะเห็นได้ว่ามี IC ตระกูล 74xx ไม่น้อยกว่า 100 ตัว  
    • ตรวจสอบความถูกต้องได้ และแก้ไขใหม่ได้ง่าย  (สร้างโดยวิธีที่ 1 มักจะมีปัญหา Hidden Pin) 
    • ไม่ต้องออนไลน์เมื่อใช้ Kipart

ข้อเสีย :-
    • ต้องติดตั้งโปรแกรมเพิ่มเติม
    • ปรับขนาด กว้าง , ยาว ของ symbol และระยะห่างของ Pin  ยาก ถึงไม่ได้เลย
    • ต้องเรียนรู้คำสั่งของ Kipart  ถ้าจะให้มันทำงานแบบเต็มความสามารถที่มี
    •  สร้างได้แต่ symbol ที่มีลักษณะสี่เหลี่ยม

โดยสิ่งที่จำเป็นต้องมี มีดังนี้
    1. datasheet หรือ pinout ของอุปกรณ์ที่จะสร้าง symbol library
    2. โปรแกรมที่สร้าง CSV file ได้ เช่น Spread sheet ทั้งหลาย
    3. Python compiler  
       
การติดตั้ง Kipart

1.  ถ้าเครื่องเราไม่มี Python อยู่ ก่อน เช่น Windows OS ต้องไปโหลด Python มาติดตั้งจากที่นี่ https://www.python.org/downloads/  เลือกเอาว่าจะใช้แบบไหน Pyton 3X, Python 2X, ทำงานบนWindos 64bit หรือ Windows 32 bit ก็ได้แล้วแต่สะดวก ไม่มีผลต่อการใช้งาน  เพราะมันจะ compile  Kipart ให้เป็น Executable file (*.exe) 

ตรวจสอบให้แน่ใจว่า Python ของเราถูก Add path ไว้แล้วโดยใช้คำสั่งต่อไปนี้ ใน Command shell

c:\python -v  กรณีติดตั้ง python 2x
c:\python –version กรณีติดตั้ง python 3x

ข้อควรระวัง
    • ในการติดตั้ง Python ต้องเลือก  ติดตั้งสำหรับ All users และ Add Python path
    • กรณีติดตั้ง Python 2X ต้องเลือก Customize installation

รูปที่ 3 ตัวเลือกการติดตั้งของ Python 2x

2.ถ้าเครื่องเรามี Python อยู่ก่อนแล้ว เช่น Linux OS  ทั้งหลาย และเชื่อมต่ออินเตอร์เน็ตอยู่ ก็ติดตั้งได้เลยโดย  ใช้คำสั่งต่อไปนี้  (ไม่จำเป็นต้องไป download source มา compile เอง)

> pip install kipart  หรือ
> easy_install kipart

มันจะไปหา Kipart เวอร์ชั่นล่าสุดจากอินเตอร์เน็ต มาให้โดยและติดตั้งโดยอัตโนมัติ

หมายเหตุ :
ทั้ง โปรแกรม pip และ easy_install  มีอยู่แล้วใน  c:\kicad\bin  แต่ไม่แน่ใจว่ามันจะสามารถไปดึง Kipart จาก Github มาติดตั้งได้เลยหรือไม่ เนื่องจากเครื่องที่ใช้มี Python อยู่ก่อนแล้ว เมื่อเรียกใช้ Pip หรือ  Easy_install มันจะถูกเรียกจาก  Pip หรือ  Easy_install  ใน python directory 

ขั้นตอนการสร้าง symbol library ด้วย Kipart ให้ทำตาม Video นี้




หมายเหตุ
ถ้าต้องการแสดงสัญญลักษณ์ Active Low  เช่น  ENABLE  บน symbol (มีขีดข้างล่าง บอก Active Low)ให้ใส่คำหรือเครื่องหมาย  inverted, inv, ~,  หรือ #  นำหน้า

ขั้นตอนในการใช้ Kipart command มีดังนี้
    1. เข้าไปที่ directory ที่เก็บไฟล์ CSV  ตัวอย่างใน Video  คือ C:\kicad\mylib
    2. เปิด command shell  แล้วใช้คำสั่งดังนี้  > kipart esp-12e.csv -s num -f -o esp8266-12e.lib -w

รูปที่ 4 การเรียกใช้ Kipart

Kipart esp-12e.csv    =  ให้ Kipart อ่านไฟล์ esp-12e.csv    (ถ้าเป็น Zip file ใช้  esp-12e.zip)
-s num             =  sort by number
-f           = ให้ใช้  fuzzy match  มันจะถือว่า r ,rht, ri  (กรณีพิพม์ไม่ถูกต้อง) เป็น right
-o esp8266-12e.lib      =  output file ให้ชื่อว่า esp8266-12e.lib
-w =  เขียนทับไฟล์ที่มีอยู่แล้ว

ถ้าหากไม่คิดจะสร้างอะไรพิศดารหรือนอกเหนือไปจากนี้ การใช้คำสั่ง
Kipart ชื่อ CSV file.csv -s num -f -o  ชื่อ lib file .lib -w “  ก็เพียงพอ

สามารถใส่ Path directory ได้ เช่น  c:\kicad\share\kicad\library\ ชื่อ lib file .lib   แต่ระวังพลาดไปเขียนทับ library ที่มีอยู่  (-w parameter จะทำให้มันเขียนทับไฟล์ โดยไม่มีการถาม) 

 
biz.