Mục lục:
- Bước 1: Chi tiết và Vật liệu nhanh
- Bước 2: Kết nối phần cứng
- Bước 3: Giải thích kỹ thuật: Màn hình
- Bước 4: Giải thích kỹ thuật: Thay đổi thông tin được hiển thị
- Bước 5: Mã
Video: VHDL Basys3: Kết nối 4 trò chơi: 5 bước
2024 Tác giả: John Day | [email protected]. Sửa đổi lần cuối: 2024-01-30 13:33
Giới thiệu:
Đây là Trò chơi Logic Kỹ thuật số Connect 4 được thiết kế trong VHDL sử dụng Phần mềm Vivado và được lập trình cho Bảng Basys3. Việc xây dựng và thiết kế dự án này là trung gian, nhưng những người mới đến có thể sao chép các bước và xây dựng trò chơi kỹ thuật số.
Trò chơi hoạt động giống như trò chơi Connect 4. Người chơi có thể di chuyển con trỏ của họ trên màn hình bằng cách sử dụng các nút trái và phải được tìm thấy trên bảng. Nhấn nút giữa trên bàn cờ sẽ khiến người chơi đặt điểm đánh dấu của họ vào cột đó và sau đó nó sẽ trở thành lượt của người chơi tiếp theo. Sau khi người chơi thắng, trò chơi có thể được thiết lập lại bằng cách nhấn nút lên trên bảng.
Bước 1: Chi tiết và Vật liệu nhanh
Chi tiết kỹ thuật nhanh:
-
Sử dụng ba bộ kết nối PMOD trên bảng (JA, JB, JC)
- 8 Ghim (Không bao gồm Ghim Vcc & GND) được sử dụng cho mỗi đầu nối PMOD
- JA - Kiểm soát hàng
- JB - Kiểm soát các cột màu xanh lá cây
- JC - Kiểm soát các cột màu đỏ
-
Đồng hồ màn hình hoạt động ở tần số 960Hz
Chỉ có 8 đèn LED được bật tại một thời điểm nhất định. Màn hình làm mới ở tốc độ đồng hồ đủ nhanh để tạo ra ảo giác rằng hơn 8 đèn LED đang bật tại một thời điểm nhất định
- Đồng hồ nút hoạt động ở tần số 5Hz; Tùy chọn có thể bị phạt bằng cách chỉnh sửa mã VHDL.
- Điện trở bên trong của Mảng Darlington đủ để ngăn chặn cháy LED
Trò chơi được xây dựng bằng các thành phần và công cụ sau:
- (1) Ban Basys3
- (2) Ma trận LED Bi-color 8x5:
- (2) ULN2803 - Mảng bóng bán dẫn Darlington - Biểu dữ liệu
- Spools of Wire
- Dây nhảy
- Tua dây
- Breadboards (Hình vuông lớn phải là đủ)
- Đồng hồ vạn năng và Nguồn cung cấp (Khắc phục sự cố)
Bước 2: Kết nối phần cứng
Nguyên tắc:
Hệ thống dây điện của dự án có thể rất phức tạp, vui lòng dành thời gian của bạn và xác minh rằng tất cả các kết nối đều đúng từng bộ một.
Dự án sử dụng hai màn hình LED nhưng được kết hợp để tạo thành một màn hình lớn. Điều này có thể được thực hiện bằng cách kết nối tất cả các hàng với cùng một điểm. Bởi vì mỗi màn hình là hai màu, các hàng màu đỏ và xanh lá cây của một màn hình cũng phải được gắn với các hàng màu đỏ và xanh lục của màn hình kia. Bằng cách này, chúng ta có thể kiểm soát tất cả các hàng chỉ với 8 chân. 16 chân còn lại được sử dụng để điều khiển các cột của màn hình. 8 chân cho có thể được kết nối trực tiếp thông qua cáp jumper với các đầu nối pmod. Các kết nối Pmod đầu tiên đi đến đầu vào của ULN2083A và đầu ra của ULN2083A được kết nối trực tiếp với cột trên màn hình. Bởi vì thiết kế là 8x8, một số cột sẽ không được kết nối về mặt vật lý.
- JA: Kết nối hàng: Hàng 1 đến JA: 1 đến Hàng 8 cho JA: 10.
- JA: Kết nối cột màu đỏ:
- JC: Kết nối Cột xanh
Vui lòng tham khảo các hình ảnh đã đăng để biết các chân tương ứng với hàng / cột nào.
Lưu ý: Các bóng bán dẫn đã được tích hợp điện trở, vì vậy các đèn LED không yêu cầu điện trở bổ sung để mắc nối tiếp với chúng.
Bước 3: Giải thích kỹ thuật: Màn hình
Màn hình hoạt động dựa trên sự bền bỉ của thị lực. Màn hình làm mới nhanh đến mức mắt người không thể nhận thấy rõ ràng rằng một số đèn LED đang nhanh chóng được tắt và bật. Trên thực tế, bằng cách làm chậm đồng hồ hiển thị, người ta có thể nhận thấy sự nhấp nháy.
Màn hình bật tất cả tám hàng theo dữ liệu được lưu trữ cho các hàng đó và màn hình bật trên một cột. Sau đó, nó nhanh chóng chuyển sang mục nhập dữ liệu tiếp theo cho tám hàng và bật cột tiếp theo - trong khi tắt tất cả các cột khác. Quá trình này tiếp tục diễn ra với tốc độ đồng hồ đủ nhanh mà sự nhấp nháy của đèn LED trở nên khó nhận biết.
Lưu trữ dữ liệu cho màn hình được khởi tạo ngay sau khi cấu trúc trong tệp VHDL theo cách sau:
tín hiệu RedA, RedB, RedC, RedD, RedE, RedF, RedG, RedH: std_logic_vector (7 downto 0): = "00000000";
tín hiệu GreenA, GreenB, GreenC, GreenD, GreenE, GreenF, GreenG, GreenH: std_logic_vector (7 downto 0): = "00000000"; - Dữ liệu hàng tùy thuộc vào cột: XANH
Sau đây là một đoạn nhỏ của quy trình điều khiển ma trận màn hình LED.
- Process that Controls LED display matrixdisplay: process (ColCLK) - 0 - 16 để làm mới cả biến ma trận 8X8 RED và 8x8 GREEn RowCount: dãy số nguyên 0 đến 16: = 0; bắt đầu if (tăng_edge (ColCLK)) sau đó if (RowCount = 0) then DORow <= RedA; - Dữ liệu hàng cho cột DOCol tương ứng <= "1000000000000000"; - Trình kích hoạt cột - Lặp lại mã này cho đến hết "0000000000000001" - Thay đổi thành RedB, RedC… GreenA, GreenB… GreenH
Vào cuối GreenH, ngay trước khi quá trình kết thúc, đoạn mã này được đưa vào để đặt lại RowCount về 0.
if (RowCount = 15) then - Khởi động lại làm mới từ cột A RowCount: = 0; else RowCount: = RowCount + 1; - Chuyển qua các cột kết thúc if;
Bây giờ, để giải thích đồng hồ nằm trong danh sách độ nhạy của quá trình hiển thị. Bo mạch Basys3 có xung nhịp bên trong hoạt động ở tần số 100MHz. Đối với mục đích của chúng tôi, đây là một đồng hồ quá nhanh, vì vậy chúng tôi sẽ cần chia đồng hồ này cho đồng hồ 960Hz bằng cách sử dụng quy trình sau.
- Clock process hoạt động ở tần số 960HzCLKDivider: process (CLK) biến clkcount: dãy số nguyên 0 đến 52083: = 0; begin if (ising_edge (CLK)) then clkcount: = clkcount + 1; if (clkcount = 52083) then ColCLK <= not (ColCLK); clkcount: = 0; kết thúc nếu; kết thúc nếu; kết thúc quá trình;
Bước 4: Giải thích kỹ thuật: Thay đổi thông tin được hiển thị
Trong mã VHDL, thông tin hoặc dữ liệu sẽ được hiển thị trên màn hình được điều khiển bởi quy trình con trỏ, có đồng hồ khác trong danh sách độ nhạy của nó. Mã này được gọi là BtnCLK, một đồng hồ được thiết kế để giảm thiểu việc làm hỏng các nút khi chúng được nhấn. Điều này được bao gồm để nếu một nút được nhấn, con trỏ trên hàng trên cùng không di chuyển nhanh qua các cột.
- Clock process hoạt động ở tần số 5 Hz. ButtonCLK: process (CLK) biến btnclkcount: dãy số nguyên 0 đến 10000001: = 0; bắt đầu if (tăng_edge (CLK)) then if (btnclkcount = 10000000) then btnclkcount: = 0; BtnCLK <= not (BtnCLK); else btnclkcount: = btnclkcount + 1; kết thúc nếu; kết thúc nếu; kết thúc quá trình;
Với đầu ra tín hiệu BtnCLK của quá trình này, bây giờ chúng ta có thể giải thích quá trình con trỏ. Quá trình con trỏ chỉ có BtnCLK trong danh sách độ nhạy của nó nhưng trong khối mã, trạng thái của các nút được kiểm tra và điều này sẽ khiến dữ liệu cho RedA, RedB… GreenH thay đổi. Đây là một đoạn mã con trỏ, bao gồm khối đặt lại và khối cho cột đầu tiên.
con trỏ: process (BtnCLK) biến OCursorCol: STD_LOGIC_VECTOR (2 downto 0): = "000"; - OCursorCol theo dõi biến cột trước đó NCursorCol: STD_LOGIC_VECTOR (2 downto 0): = "000"; - NCursorCol đặt cột con trỏ mới bắt đầu - Điều kiện RESET (Nút UP) --Board được xóa để trò chơi khởi động lại if (ising_edge (BtnCLK)) then if (RST = '1') then RedA <= "00000000"; RedB <= "00000000"; RedC <= "00000000"; RedD <= "00000000"; RedE <= "00000000"; RedF <= "00000000"; RedG <= "00000000"; RedH <= "00000000"; Màu xanh lá câyA <= "00000000"; GreenB <= "00000000"; GreenC <= "00000000"; GreenD <= "00000000"; GreenE <= "00000000"; GreenF <= "00000000"; GreenG <= "00000000"; GreenH if (Lbtn = '1') then NCursorCol: = "111"; - Cột H elsif (Rbtn = '1') then NCursorCol: = "001"; - Cột B elsif (Cbtn = '1') then NCursorCol: = OCursorCol; - Cột giữ nguyên NTurnState <= not (TurnState); - Kích hoạt lượt người chơi tiếp theo - Kiểm tra cột hiện tại từ dưới lên trên và bật đèn LED đầu tiên chưa bật. Màu sắc phụ thuộc vào màu con trỏ của người chơi hiện tại. for ck trong 7 vòng lặp downto 1 if (RedA (0) = '1') and (RedA (ck) = '0') and (GreenA (ck) = '0') then RedA (Ck) <= '1'; ĐỏA (0) <= '0'; LỐI RA; kết thúc nếu;
if (GreenA (0) = '1') and (RedA (ck) = '0') and (GreenA (ck) = '0') then
GreenA (Ck) <= '1'; GreenA (0) - Red Player GreenA (0) <= '0'; if (NCursorCol = OCursorCol) then - Nếu không có gì được nhấn RedA (0) <= '1'; elsif (NCursorCol = "111") thì - Nếu nhấn Lbtn RedH (0) <= '1'; ĐỏA (0) <= '0'; elsif (NCursorCol = "001") thì - Iff Rbtn được nhấn RedB (0) <= '1'; RedA (0) - Green Player RedA (0) <= '0'; if (NCursorCol = OCursorCol) then GreenA (0) <= '1'; elsif (NCursorCol = "111") then GreenH (0) <= '1'; Màu xanh lá câyA (0) <= '0'; elsif (NCursorCol = "001") then GreenB (0) <= '1'; Màu xanh lá câyA (0) <= '0'; kết thúc nếu; trường hợp kết thúc;
Lưu ý, câu lệnh trường hợp đầu tiên được gọi là: OCursorCol (viết tắt của Old Cursor Column) là phần khởi đầu của máy trạng thái hữu hạn. Mỗi cột của màn hình được coi là trạng thái riêng của nó trong FSM. Có 8 cột vì vậy tập hợp số nhị phân 3 bit được sử dụng để xác định mỗi cột dưới dạng trạng thái. Cách FSM di chuyển giữa các trạng thái phụ thuộc vào nút được nhấn. Trong đoạn mã trên, nếu nút bên trái được nhấn, FSM sẽ chuyển đến "111", đây sẽ là cột cuối cùng của màn hình. Nếu nút bên phải được nhấn, FSM sẽ chuyển đến "001", đây sẽ là cột thứ hai của màn hình.
Nếu nút giữa được nhấn, FSM sẽ KHÔNG chuyển sang trạng thái mới mà thay vào đó sẽ kích hoạt sự thay đổi trong tín hiệu TurnState, đây là tín hiệu một bit để lưu ý lượt của người chơi. Ngoài ra, nút giữa sẽ chạy một khối mã để kiểm tra xem có hàng trống ở dưới cùng cho đến đầu hay không. Nó sẽ cố gắng đặt một điểm đánh dấu ở hàng thấp nhất, không được lấp đầy. Hãy nhớ rằng, đây là một trò chơi kết nối bốn.
Trong câu lệnh trường hợp lồng nhau được gọi là: TurnState, chúng tôi thay đổi màu con trỏ là gì và cột nào trên hàng đầu tiên mà chúng tôi muốn thay đổi dữ liệu để quá trình hiển thị có thể phản ánh sự thay đổi.
Chúng tôi lặp lại mã cơ bản này cho bảy trường hợp còn lại. Biểu đồ FSM có thể hữu ích để hiểu các trạng thái đang thay đổi như thế nào.
Bước 5: Mã
Đây là mã chức năng cho Connect 4 có thể được biên dịch trong VHDL bằng Phần mềm Vivado.
Một hạn chế cũng được cung cấp để cho phép bạn bắt đầu và chạy trò chơi.
Chúng tôi đã cung cấp một sơ đồ khối giải thích cách các đầu vào và đầu ra của mỗi quy trình được kết nối với nhau.
Đề xuất:
Kết nối và trang bị thêm các giải pháp được kết nối của bạn với Hologram Nova và Ubidots: 9 bước
Kết nối và trang bị thêm các giải pháp được kết nối của bạn với Hologram Nova và Ubidots: Sử dụng Hologram Nova của bạn để trang bị thêm cơ sở hạ tầng. Thiết lập Hologram Nova bằng Raspberry Pi để gửi dữ liệu (nhiệt độ) đến Ubidots. Trong hướng dẫn sau, Ubidots sẽ trình bày cách thiết lập Hologram Nova bằng Raspberry Pi và hiển thị
Trò chơi Aruduino LED Nhấp nhanh Trò chơi hai người chơi: 8 bước
Aruduino LED Game Fast Click Two Player Game: Dự án này được lấy cảm hứng từ @HassonAlkeim. Nếu bạn sẵn sàng tìm hiểu sâu, đây là một liên kết bạn có thể kiểm tra https://www.instructables.com/id/Arduino-Two-Player-Fast-Button-Clicking-Game/. Trò chơi này là một phiên bản cải tiến của Alkeim's. Nó là một
Hướng dẫn kết nối PLSD: Kết nối với Apple TV Qua AirPlay [Không chính thức]: 10 bước
Hướng dẫn kết nối PLSD: Kết nối với Apple TV Qua AirPlay [Không chính thức]: Hướng dẫn sau đây được cung cấp để minh họa quá trình kết nối với Apple TV trong phòng hội nghị qua AirPlay. Nguồn thông tin không chính thức này được cung cấp như một sự ưu đãi dành cho ban quản trị, nhân viên và những vị khách được ủy quyền của Học khu Địa phương Perkins
Bộ điều khiển trò chơi tự làm dựa trên Arduino - Bộ điều khiển trò chơi Arduino PS2 - Chơi Tekken với tự làm trò chơi Arduino: 7 bước
Bộ điều khiển trò chơi tự làm dựa trên Arduino | Bộ điều khiển trò chơi Arduino PS2 | Chơi Tekken với Bàn điều khiển Arduino tự làm: Xin chào các bạn, chơi game luôn thú vị nhưng chơi với Bộ điều khiển trò chơi tùy chỉnh tự làm của riêng bạn sẽ thú vị hơn
Trình mô phỏng trò chơi điện thoại thông minh- Chơi trò chơi Windows bằng IMU điều khiển bằng cử chỉ, Gia tốc kế, Con quay hồi chuyển, Từ kế: 5 bước
SmartPhone Game Simulator- Chơi Windows Games Sử dụng IMU Điều khiển bằng cử chỉ, Gia tốc kế, Con quay hồi chuyển, Từ kế: Hỗ trợ dự án này: https://www.paypal.me/vslcreations bằng cách quyên góp cho mã nguồn mở & hỗ trợ để phát triển hơn nữa