NandGame – วิธีสร้างคอมพิวเตอร์ตั้งแต่ศูนย์
(nandgame.com)- NandGame เป็นเกมพัซเซิลเพื่อการเรียนรู้ที่เริ่มจากชิ้นส่วนลอจิกอย่างง่าย และสุดท้ายประกอบเป็น คอมพิวเตอร์ที่ตั้งโปรแกรมได้
- แต่ละเลเวลคือโจทย์ให้สร้างคอมโพเนนต์ที่ทำงานตามสเปก และชิ้นส่วนที่สร้างเสร็จจะกลายเป็น บล็อกพื้นฐาน สำหรับขั้นถัดไป
- ไม่จำเป็นต้องมีความรู้ล่วงหน้าเกี่ยวกับสถาปัตยกรรมคอมพิวเตอร์หรือซอฟต์แวร์ และใช้คณิตศาสตร์เพียงระดับ การบวกและการลบ แต่บางโจทย์อาจใช้เวลาพอสมควร
- โจทย์แรกคือการใช้สายไฟและรีเลย์สร้างคอมโพเนนต์ nand ที่ให้เอาต์พุตเป็น
0เฉพาะเมื่ออินพุตaและbเป็น1ทั้งคู่ - ลากชิ้นส่วนจากกล่องเครื่องมือมาวางใน พื้นที่สีน้ำเงิน และใช้ Spacebar, ปุ่มลูกศร และ Escape เพื่อควบคุมการลากและการยกเลิก
จากชิ้นส่วนพื้นฐานสู่คอมพิวเตอร์
- NandGame ดำเนินไปด้วยการนำคอมโพเนนต์พื้นฐานมาประกอบเป็นชิ้นส่วนที่ทรงพลังขึ้นเรื่อย ๆ และในท้ายที่สุดสร้างเป็นคอมพิวเตอร์ที่ตั้งโปรแกรมได้
- แบ่งออกเป็นหลาย เลเวล โดยในแต่ละขั้นต้องสร้างคอมโพเนนต์ที่ทำงานตรงตามสเปกที่กำหนด
- คอมโพเนนต์ที่สร้างเสร็จแล้วจะกลายเป็นชิ้นส่วนที่ใช้ได้ในเลเวลถัดไป
- จุดเริ่มต้นคือคอมโพเนนต์ลอจิกที่ง่ายที่สุด
ความรู้พื้นฐานที่ต้องมีและระดับความยาก
- ไม่จำเป็นต้องมีความรู้ล่วงหน้าเกี่ยวกับสถาปัตยกรรมคอมพิวเตอร์หรือซอฟต์แวร์
- คณิตศาสตร์ที่ต้องใช้ไม่เกิน การบวกและการลบ
- บางโจทย์อาจใช้เวลาในการหาคำตอบ จึงต้องอาศัยความอดทน
โจทย์แรก: สร้าง nand
- โจทย์แรกคือการใช้สายไฟและรีเลย์เพื่อสร้างคอมโพเนนต์ nand
- ต้องเชื่อมอินพุต
aและbเข้ากับเอาต์พุต โดยจัดวงจรให้ทำงานตรงตามสเปก 1หมายถึงสถานะที่มีกระแสไฟไหล และ0หมายถึงสถานะที่ไม่มีกระแสไฟไหล- อินพุต
Vส่ง กระแสคงที่ ที่มีค่าเป็น1ตลอดเวลา
สเปกของ nand
- เอาต์พุตของ
nandจะเป็น0เฉพาะเมื่ออินพุตทั้งสองเป็น1พร้อมกัน - สเปกอินพุตและเอาต์พุตโดยละเอียดมีดังนี้
| a | b | เอาต์พุต |
|---|---|---|
| 0 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
วิธีควบคุม
- ลากคอมโพเนนต์จากกล่องเครื่องมือไปวางใน พื้นที่สีน้ำเงิน
- กด Spacebar เพื่อหยิบรายการที่ลากได้
- ระหว่างลาก ใช้ปุ่มลูกศรเพื่อย้ายรายการ
- กด Spacebar อีกครั้งเพื่อวางในตำแหน่งใหม่ และกด Escape เพื่อยกเลิก
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
เพราะชอบเกมนี้ เลยซื้อ บอร์ดพัฒนา FPGA ขนาดเล็กมาลองสร้างชุดคำสั่งกับซอฟต์ CPU เอง
ไม่ได้ใช้งานได้จริงนัก แต่เป็นแบบฝึกหัดที่สนุก และผมเลือกบอร์ด iCE40 เพราะระบบนิเวศโอเพนซอร์สดีและราคาถูก: https://www.digikey.com/en/products/detail/lattice-semicondu...
ตอนนี้อาจมีตัวเลือกที่ดีกว่านี้แล้วก็ได้
ปกติคนทั่วไปคงทำตัวแปลง USB แบบลวก ๆ ไปแล้ว แต่ Wirth อยากจัดการให้ถูกต้อง จึงเอาบอร์ด FPGA มาสร้างซอฟต์ CPU แล้ววาง OS, ระบบหน้าต่าง, ทูลเชนภาษา ฯลฯ ไว้บนนั้น
ผลก็คือเขาสามารถรันแอปออกแบบฮาร์ดแวร์กับตัวแก้ไขข้อความ และใช้เมาส์ตัวโปรดทดลองออกแบบซอฟต์ CPU ได้มากขึ้น
เคยเล่นเกมคล้าย ๆ กันชื่อ Turing Complete แล้วสนุกมาก: https://store.steampowered.com/app/1444480/Turing_Complete/
คล้ายกับหนังสือ Nand2Tetris มาก
ผมอัปเกรดเครื่องเป็น คำสั่ง 32 บิต และถึงขั้นเขียนเอกสารภาษาแอสเซมบลีให้เข้ากับมันด้วย
แม้จะยังเป็น Early Access แต่ก็เป็นเกมที่ยอดเยี่ยม
หน้าตาดี งานทำออกมาสมบูรณ์ และค่อนข้างติดหนึบ
ดีที่มีบน GOG ด้วย: https://www.gog.com/game/turing_complete
บทความที่เกี่ยวข้อง:
NandGame – Build a Computer from Scratch - https://news.ycombinator.com/item?id=36862274 - กรกฎาคม 2023
NandGame – Build a Computer from Scratch - https://news.ycombinator.com/item?id=31055307 - เมษายน 2022
NandGame – Build a Computer from Scratch - https://news.ycombinator.com/item?id=25282507 - ธันวาคม 2020
Show HN: Online challenge: Build a CPU from scratch - https://news.ycombinator.com/item?id=17508151 - กรกฎาคม 2018
เป็นแบบฝึกหัดที่สนุกจริง ๆ
เห็นสิ่งนี้แล้วนึกขึ้นได้ว่าผมลืมไปมากแค่ไหน รู้สึกขมขื่นอยู่เหมือนกัน
กว่า 20 ปีก่อน ผมเรียน วิศวกรรมไฟฟ้า ที่มหาวิทยาลัยและเชี่ยวชาญด้านสถาปัตยกรรมคอมพิวเตอร์ แต่ในสายงานจริงไม่ได้ใช้เลย แล้วก็ไปทางซอฟต์แวร์แทน
ผมจำไม่ได้เลยว่าต้องทำสิ่งต่าง ๆ ตรงนี้อย่างไร และกว่าจะสร้าง half-adder ได้ก็ต้องลองผิดลองถูกอยู่พักใหญ่
มันคล้ายกับการโทษตัวเองที่จำไม่ได้ว่าใครเป็นคนผ่านกฎหมาย Corn Laws หรือใครเป็นผู้เริ่มการขนส่งแบบแช่เย็นในสหรัฐฯ
ถ้ามีความเข้าใจฉากหลังของเรื่องเล่าหลัก ๆ เช่น สงครามต้องการวิศวกรรม ตามมาด้วยการปฏิวัติเกษตรกรรมและการปฏิวัติอุตสาหกรรม และประวัติศาสตร์คือการต่อสู้ทางชนชั้น ข้อมูลใหม่ ๆ ก็จะเข้าที่เข้าทางเหมือนชิ้นส่วนในสนามแม่เหล็ก
ดังนั้นอย่าโทษตัวเองมากเกินไป และผ่อนปรนกับตัวเองมากขึ้นก็ได้
หลังจากลองทั้งเกมนี้และคอร์ส Nand2Tetris แล้ว ถึงเพิ่งรู้ว่าทั้งสองอย่างอิมพลีเมนต์คอมพิวเตอร์เครื่องเดียวกัน
เกมนี้เป็นเวอร์ชันกราฟิกแบบอินเทอร์แอ็กทีฟ ส่วน Nand2Tetris ดั้งเดิมใช้วิธีเขียนเป็น HDL แบบข้อความ แทนที่จะคลิกแล้วลากการเชื่อมต่อระหว่างลอจิกเกต
ทั้งคู่สนุกและให้ความรู้ แต่ NandGame สนุกกว่า
อย่างไรก็ตาม ควรรู้ความเชื่อมโยงของทั้งสองไว้ เพราะหลังจบ NandGame แล้วสามารถต่อไปยังงานถัดไปของ Nand2Tetris คือการทำซอฟต์แวร์คอมพิวเตอร์ในชั้นที่สูงขึ้นได้ และยังช่วยให้แชร์ประสบการณ์กับเนื้อหากับคนที่เคยทำอีกเวอร์ชันได้ง่ายขึ้นด้วย
เพื่อทำการบ้าน ต้องกลับไปค้นตำรามหาวิทยาลัยกับข้อสอบเก่า ๆ และผมก็ยอมแพ้แถว ๆ จุดที่ต้องทำส่วนสำคัญของ CPU ให้เกือบเสร็จ
พูดตามตรง ผมรู้สึกว่าบทบรรยายกับตัวบทขาดไปมาก และไม่รู้ว่านี่เป็นเรื่องปกติในยุคอินเทอร์เน็ตหรือเปล่า แต่ผมคาดหวังว่าคอร์สกับตำราจะมีความครบถ้วนในตัวเองระดับหนึ่ง
คือ LogicSimX/Logic Simulator 2 แบบเดสก์ท็อปของ Andrew Wilkes: https://logicsimx.com/about/ https://andrew-wilkes.itch.io/logic-simulator-2
ดูใช้ได้ แต่ผมไม่รู้จักดีพอที่จะประเมินอย่างจริงจัง
ประเด็นชวนคิดคือ หากตัดส่วนที่ต้องสร้าง NAND gate จริง ๆ ในขั้นแรกออกไป เมื่อทำกระบวนการนี้จนจบ สุดท้ายจะได้รูปแบบที่คล้ายกับ โครงข่ายประสาทเทียม มาก
การแทน NAND gate หนึ่งตัวต้องใช้ neuron 2 ตัว และดูเหมือนโครงสร้างที่มีชั้นลึก n ชั้น มีค่า 0 จำนวนมากในเมทริกซ์น้ำหนัก และมีพื้นที่จัดเก็บเล็กน้อย
คำถามคือ เมื่อให้มาเฉพาะความหมายของอินพุต/เอาต์พุตในระดับ assembly จะฝึกโครงข่ายประสาทเทียมเปล่า ๆ ให้กลายเป็นโครงสร้างแบบนี้ได้ไหม? แน่นอนว่า backpropagation คงใช้ไม่ได้ แต่การค้นหาแบบมีทิศทางบางรูปแบบอาจเป็นไปได้หรือเปล่า?
ลองใช้ 3-majority gate และ gate อื่น ๆ หลายแบบ แต่พอเกินหนึ่งชั้นแล้ว backpropagation ทำงานได้ไม่ดี น่าจะเพราะความละเอียดระดับบิตไม่พอ
ปัญหา “การฝึกโดยไม่ใช้ backpropagation” จริง ๆ แล้วค่อนข้างยาก และสุดท้ายก็ยอมแพ้
มีวิธีดี ๆ ในการฝึกโครงข่ายประสาทเทียมโดยไม่ใช้ backpropagation ไหม? ดูเหมือนว่าจะมีคอขวดของข้อมูลอยู่บ้าง แต่การประเมิน mutual information โดยไม่ใช้โครงข่ายประสาทเทียมนั้นทำได้ยาก
ผมไม่มีประสบการณ์ด้านนี้เลย เลยอยากให้ช่วยอธิบายว่าแต่ละส่วนประกอบทำอะไร
ไม่รู้ว่า relay ทำอะไร และไม่รู้ว่า
cกับinคืออะไรยังสับสนด้วยว่าทำไมถึงมีแหล่งจ่ายไฟแยกอยู่แล้ว แต่ถ้าเชื่อม
aหรือbเข้ากับแหล่งจ่ายไฟแล้วเปิด แค่นั้นก็เหมือนมีไฟเข้าได้อย่างไรเมื่อจ่ายไฟให้คอยล์ (
c) สถานะของสวิตช์จะเปลี่ยนจากสถานะปกติไปเป็นสถานะตรงข้ามสวิตช์แบบปกติเปิดให้ผ่านจะส่งค่า
inไปยังเอาต์พุตเมื่อc = 0แต่ถ้าc = 1คอยล์จะได้รับไฟ ทำให้สวิตช์เปิดวงจรหรือดับสวิตช์แบบปกติปิดให้ผ่านจะทำงานตรงกันข้าม
cคือคอยล์ และเมื่อมีไฟเข้าก็จะสลับสถานะสวิตช์inคือค่าที่ผ่านไปเมื่อสวิตช์ปิดวงจรอยู่ ในที่นี้คือ 1 หรือ 0แหล่งจ่ายไฟแยกจำเป็นเพื่อให้ได้ค่า 1 โดยไม่ขึ้นกับอินพุตทั้งสองค่า
ตัวอย่างเช่น หากต้องการให้เอาต์พุตเป็น 1 เสมอเมื่ออินพุตทั้งสองเป็น 0 ก็ต้องมีค่าสูงให้ดึงขึ้นมา ซึ่งแหล่งจ่ายไฟทำหน้าที่นั้น
Cน่าจะเป็น C ของ coil หรือ controlrelay คือสวิตช์เชิงกลที่ควบคุมด้วยแม่เหล็กไฟฟ้าซึ่งทำจากคอยล์พันรอบแกนเหล็ก
เมื่อมีกระแสไหลผ่านคอยล์ มันจะดึงสปริงโลหะ และผลที่ได้คือทำให้กระแสไหลจาก
inไปยังเอาต์พุตได้ หรือในทางกลับกันก็ตัดกระแสนั้นได้ชิ้นส่วน relay สองชนิดที่ให้มานั้นแสดงการทำงานสองแบบนี้พอดี
เจ๋งมาก แนะนำให้ทุกคนลองไปดูหรือเล่น MHRD ด้วย
https://store.steampowered.com/app/576030/MHRD/
ดูเท่ดี เสียดายที่ทำตามหนังสือจนจบไม่ได้ และอยากลองทำสิ่งนี้ให้มากขึ้น