5 điểm bởi GN⁺ 2024-11-02 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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à 0 khi cả đầu vào ab đề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 ab với đầu ra, đồng thời cấu hình mạch để tạo ra hành vi đúng theo đặc tả
  • 1 biểu thị trạng thái có dòng điện chạy qua, 0 biểu thị trạng thái không có dòng điện
  • Đầu vào V truyền dòng điện hằng số luôn bằng 1

Đặc tả nand

  • Đầu ra của nand chỉ là 0 khi 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

 
GN⁺ 2024-11-02
Ý 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

    • Niklaus Wirth cũng từng làm việc tương tự, với cái cớ là ông không tìm được một hộp thương mại nào để giao tiếp với con chuột lưu niệm Xerox PARC mà ông yêu thích
      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
    • Bước tiếp theo có lẽ là Tiny Tapeout: https://www.tinytapeout.com/
  • 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

    • Sau khi đổ 30 giờ vào Turing Complete, tôi mới nhận ra chuyện gì đã xảy ra
      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
    • Turing Complete chắc chắn đáng để giới thiệu
      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

    • Không hiểu sao tôi đã bỏ lỡ các bài cũ, nhưng tôi đã đọc sách và cũng tự triển khai máy tính
      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

    • Tôi hiểu phản ứng đó, nhưng tôi nghĩ những gì bạn từng học đã giúp bạn liên tục đưa ra các quyết định đúng hướ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

    • Tôi đã thử nand2tetris, và dù hồi đại học tôi cũng học khá tốt các môn phần cứng, lớp học và cuốn sách này vẫn gần như kiểu “vẽ nốt phần còn lại của con cú
      Để 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
    • Có ít nhất một trình mô phỏng kéo-thả khác tương thích với Nand2Tetris
      Đó 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?

    • Năm ngoái tôi đã thử làm việc này với một người bạn
      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
    • Một số thí nghiệm mạng nơ-ron thời kỳ đầu cách đây hàng chục năm là để cho thấy chúng có thể mô hình hóa thành công các cổng logic
  • 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 cin là 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 a hoặc b vào nguồn và bật lên thì như vậy cũng đã có điện

    • Relay là một công tắc được điều khiển bằng điện
      Khi 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ại
      Công tắc mặc định bật sẽ truyền giá trị in ra đầu ra khi c = 0, nhưng nếu c = 1 thì cuộn dây được cấp điện và công tắc mở ra hoặc tắt
      Công tắc mặc định tắt thì hoạt động ngược lại
      c là cuộn dây, khi được cấp điện thì nó sẽ đảo trạng thái công tắc
      in là giá trị đi qua khi công tắc đóng, ở đây là 1 hoặc 0
      Nguồ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ò đó
    • C có lẽ là chữ C của coil hoặc control
      Relay 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ừ in ra đầu ra, hoặc ngược lại là ngắt dòng
      Hai 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