NandGame – Cách xây dựng máy tính từ con số 0
(nandgame.com)- NandGame là một trò chơi giải đố mang tính giáo dục, bắt đầu từ các linh kiện logic đơn giản và cuối cùng lắp ráp thành một máy tính có thể lập trình
- Mỗi màn là một bài toán tạo ra một thành phần hoạt động đúng theo đặc tả, và linh kiện hoàn thành sẽ trở thành khối xây dựng cho bước tiếp theo
- Không cần kiến thức trước về kiến trúc máy tính hay phần mềm, và toán học ở mức cộng và trừ là đủ, dù một số bài có thể mất thời gian để giải
- Bài đầu tiên là triển khai thành phần nand bằng dây dẫn và rơ-le sao cho đầu ra chỉ là
0khi cả đầu vàoavàbđều là1 - Kéo các linh kiện từ hộp công cụ vào vùng màu xanh, và dùng phím cách, phím mũi tên, Escape để thao tác kéo thả và hủy
Từ linh kiện cơ bản đến máy tính
- NandGame diễn ra theo cách kết hợp các thành phần cơ bản để tạo ra những linh kiện ngày càng mạnh hơn, và cuối cùng cấu thành một máy tính có thể lập trình
- Trò chơi được chia thành nhiều màn, và ở mỗi bước bạn phải tạo ra một thành phần hoạt động đúng theo đặc tả đã cho
- Thành phần đã hoàn thành sẽ trở thành linh kiện có thể dùng ở các màn sau
- Điểm khởi đầu là thành phần logic đơn giản nhất
Kiến thức cần có và độ khó
- Không cần kiến thức trước về kiến trúc máy tính hay phần mềm
- Toán học không yêu cầu vượt quá cộng và trừ
- Một số bài có thể mất thời gian để giải nên cần kiên nhẫn
Bài đầu tiên: tạo nand
- Bài đầu tiên là triển khai thành phần nand bằng dây dẫn và rơ-le
- Hãy nối đầu vào
avàbvới đầu ra, đồng thời cấu hình mạch để tạo ra hành vi đúng theo đặc tả 1biểu thị trạng thái có dòng điện chạy qua,0biểu thị trạng thái không có dòng điện- Đầu vào
Vtruyền dòng điện hằng số luôn bằng1
Đặc tả nand
- Đầu ra của
nandchỉ là0khi cả hai đầu vào đều là1 - Đặc tả đầu vào/đầu ra chính xác như sau
| a | b | đầu ra |
|---|---|---|
| 0 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
Cách thao tác
- Kéo các thành phần trong hộp công cụ vào vùng màu xanh để đặt chúng
- Nhấn phím cách để nhặt mục có thể kéo
- Trong khi kéo, dùng các phím mũi tên để di chuyển mục
- Nhấn phím cách lần nữa để đặt vào vị trí mới, và nhấn Escape để hủy
1 bình luận
Ý kiến trên Hacker News
Vì thích trò này nên tôi đã mua một bo mạch phát triển FPGA nhỏ và tự thử tạo tập lệnh cùng CPU mềm
Không thực dụng lắm, nhưng là một bài luyện tập thú vị; tôi chọn bo iCE40 vì hệ sinh thái mã nguồn mở khá ổn và giá thấp: https://www.digikey.com/en/products/detail/lattice-semicondu...
Giờ có thể đã có lựa chọn tốt hơn
Thông thường người ta có lẽ sẽ làm tạm một bộ chuyển đổi USB, nhưng Wirth muốn xử lý cho đúng nên đã lấy một bo FPGA, tạo một CPU mềm, rồi đưa lên đó OS, hệ thống cửa sổ, toolchain ngôn ngữ, v.v.
Nhờ vậy, ông có thể chạy ứng dụng thiết kế phần cứng và trình soạn thảo văn bản, đồng thời dùng con chuột yêu thích của mình để thử nghiệm thêm nhiều thiết kế CPU mềm
Tôi đã chơi một trò tương tự là Turing Complete và nó thật sự rất thú vị: https://store.steampowered.com/app/1444480/Turing_Complete/
Rất giống sách Nand2Tetris
Tôi đã nâng cấp cỗ máy lên lệnh 32-bit, rồi còn viết cả tài liệu ngôn ngữ assembly tương ứng
Dù vẫn đang ở giai đoạn early access, đây là một game xuất sắc
Trông đẹp, mức độ hoàn thiện cao và khá gây nghiện
Có trên GOG cũng là điểm hay: https://www.gog.com/game/turing_complete
Các bài liên quan:
NandGame – Build a Computer from Scratch - https://news.ycombinator.com/item?id=36862274 - tháng 7/2023
NandGame – Build a Computer from Scratch - https://news.ycombinator.com/item?id=31055307 - tháng 4/2022
NandGame – Build a Computer from Scratch - https://news.ycombinator.com/item?id=25282507 - tháng 12/2020
Show HN: Online challenge: Build a CPU from scratch - https://news.ycombinator.com/item?id=17508151 - tháng 7/2018
Thật sự là một bài luyện tập thú vị
Nhìn cái này khiến tôi chạnh lòng vì nhận ra mình đã quên nhiều đến mức nào
Hơn 20 năm trước tôi học kỹ thuật điện ở đại học và chuyên về kiến trúc máy tính, nhưng trong công việc thì hoàn toàn không dùng đến mà chuyển sang mảng phần mềm
Tôi chẳng nhớ chút nào cách làm những thứ ở đây, và sau nhiều lần thử sai mới vừa đủ tạo được bộ bán cộng
Nó giống như tự trách mình vì không nhớ ai đã thông qua Corn Laws, hay ai là người khởi đầu vận tải lạnh ở Mỹ
Khi bạn có hiểu biết nền về mạch truyện cốt lõi — chẳng hạn chiến tranh đòi hỏi kỹ thuật, cách mạng nông nghiệp dẫn đến cách mạng công nghiệp, và lịch sử là đấu tranh giai cấp — thì thông tin mới sẽ tự rơi vào đúng chỗ như các mảnh vụn trong từ trường
Vì vậy đừng tự trách mình quá, và hãy rộng lượng hơn với bản thân một chút
Chỉ sau khi làm cả trò này lẫn khóa Nand2Tetris, tôi mới nhận ra cả hai triển khai cùng một máy tính
Trò này là phiên bản đồ họa tương tác, còn Nand2Tetris gốc thì viết bằng HDL dạng văn bản thay vì nhấp và kéo để nối các cổng logic
Cả hai đều vui và có tính giáo dục, nhưng NandGame thú vị hơn
Tuy nhiên, biết mối liên hệ giữa hai bên là điều hữu ích. Sau khi hoàn thành NandGame, bạn có thể tiếp tục sang các bài tập kế tiếp của Nand2Tetris, tức làm phần mềm máy tính ở các tầng cao hơn; đồng thời cũng dễ chia sẻ trải nghiệm và nội dung với những người đã thử phiên bản còn lại
Để làm bài tập, tôi phải lục lại cả giáo trình đại học lẫn đề thi; và tôi đã bỏ cuộc vào khoảng lúc gần như phải hoàn thiện phần lõi của CPU
Thành thật mà nói, tôi thấy bài giảng và phần văn bản thiếu sót khá nhiều; không biết trong thời Internet thì như vậy có phổ biến không, nhưng tôi đã kỳ vọng lớp học và giáo trình phải có mức độ tự hoàn chỉnh nhất định
Đó là LogicSimX/Logic Simulator 2 trên desktop của Andrew Wilkes: https://logicsimx.com/about/ https://andrew-wilkes.itch.io/logic-simulator-2
Trông có vẻ ổn, nhưng tôi không biết đủ để đánh giá đúng mức
Một điều đáng suy nghĩ là, nếu bỏ qua phần thực sự tạo cổng NAND ở bước đầu tiên, thì khi hoàn tất quá trình này, thứ thu được cuối cùng có hình dạng rất giống mạng nơ-ron
Cần 2 nơ-ron để biểu diễn một cổng NAND, trông như một cấu trúc có n lớp chiều sâu, rất nhiều số 0 trong ma trận trọng số, và một chút không gian lưu trữ
Câu hỏi là thế này. Khi chỉ được cung cấp ngữ nghĩa đầu vào/đầu ra ở mức assembly, liệu có thể huấn luyện một mạng nơ-ron trống để nó trở thành cấu trúc như vậy không? Lan truyền ngược thì chắc chắn là không được, nhưng liệu có thể có một dạng tìm kiếm có định hướng nào đó không?
Chúng tôi đã thử cổng đa số 3 ngõ vào và nhiều cổng khác, nhưng khi vượt quá một lớp thì lan truyền ngược không hoạt động tốt, có lẽ là do thiếu độ chính xác bit
Bài toán “huấn luyện mà không dùng lan truyền ngược” thực ra khá khó, và cuối cùng chúng tôi đã bỏ cuộc
Có cách nào ổn để huấn luyện mạng nơ-ron mà không dùng lan truyền ngược không? Nút thắt thông tin dường như có ở một mức nào đó, nhưng rất khó đánh giá lượng thông tin tương hỗ nếu không dùng mạng nơ-ron
Tôi hoàn toàn không có kinh nghiệm trong mảng này, nên mong có ai giải thích từng thành phần làm gì
Tôi không biết relay làm gì, cũng không biết
cvàinlà gìTôi cũng bối rối vì sao đã có nguồn điện riêng rồi, mà chỉ cần nối
ahoặcbvào nguồn và bật lên thì như vậy cũng đã có điệnKhi cuộn dây (
c) được cấp điện, trạng thái công tắc sẽ chuyển từ trạng thái mặc định sang trạng thái ngược lạiCông tắc mặc định bật sẽ truyền giá trị
inra đầu ra khic = 0, nhưng nếuc = 1thì cuộn dây được cấp điện và công tắc mở ra hoặc tắtCông tắc mặc định tắt thì hoạt động ngược lại
clà cuộn dây, khi được cấp điện thì nó sẽ đảo trạng thái công tắcinlà giá trị đi qua khi công tắc đóng, ở đây là 1 hoặc 0Nguồn điện riêng cần thiết để có được giá trị 1 độc lập với hai giá trị đầu vào
Ví dụ, khi cả hai đầu vào đều là 0 mà bạn muốn luôn xuất ra 1, thì cần một giá trị mức cao để kéo lên, và nguồn điện đảm nhận vai trò đó
Ccó lẽ là chữ C của coil hoặc controlRelay là công tắc cơ học được điều khiển bởi nam châm điện tạo từ cuộn dây quấn quanh lõi sắt
Khi dòng điện chạy qua cuộn dây, nó kéo một lò xo kim loại, nhờ đó có thể cho dòng điện chạy từ
inra đầu ra, hoặc ngược lại là ngắt dòngHai loại linh kiện relay được cung cấp chính là biểu diễn hai hành vi này
Thật sự rất tuyệt. Tôi khuyên mọi người cũng nên xem qua hoặc chơi thử MHRD
https://store.steampowered.com/app/576030/MHRD/
Trông hay đấy. Tiếc là tôi chưa làm hết cuốn sách, và muốn thử cái này nhiều hơn