สารบัญ:

ผู้เล่น 2 คนแข่งขันกับเกมจับเวลา: 4 ขั้นตอน
ผู้เล่น 2 คนแข่งขันกับเกมจับเวลา: 4 ขั้นตอน

วีดีโอ: ผู้เล่น 2 คนแข่งขันกับเกมจับเวลา: 4 ขั้นตอน

วีดีโอ: ผู้เล่น 2 คนแข่งขันกับเกมจับเวลา: 4 ขั้นตอน
วีดีโอ: Scratch 3 0 การควบคุมเกมแบบผู้เล่น 2 คน 2024, พฤศจิกายน
Anonim
ผู้เล่น 2 คนแข่งขันกับเกมจับเวลา
ผู้เล่น 2 คนแข่งขันกับเกมจับเวลา

คุณจะต้องการ:

1. Digilent Basys 3, FPGA Board (หรือ FPGA อื่น ๆ)

2. Vivado เวอร์ชันล่าสุดหรือสภาพแวดล้อม VHDL อื่น ๆ

3. คอมพิวเตอร์ที่สามารถเรียกใช้โปรแกรมดังกล่าวได้

ขั้นตอนที่ 1: ตัวเกมเอง

ตัวเกมเอง
ตัวเกมเอง

FSM โต้ตอบกับโมดูลอย่างไร

วิธีการเล่น

ในการเริ่มต้น ให้กดปุ่มตรงกลาง สิ่งนี้จะทำให้ “99” ซึ่งแสดงถึงสุขภาพของผู้เล่นสองคน เพื่อแสดงบนจอแสดงผลเจ็ดส่วน จากนั้น ไฟ LED จะสว่างขึ้นตามลำดับจากขวาไปซ้าย รูปแบบนี้เป็นแถบพลังงาน เมื่อแถบพลังงานเต็ม แถบพลังงานจะรีเซ็ต เป้าหมายของผู้เล่นคนหนึ่งคือการพลิกสวิตช์เมื่อแถบอยู่สูงที่สุด ยิ่งไฟ LED ติดสว่างมากเท่าไร ผู้เล่นคนใดคนหนึ่งก็ยิ่งสร้างความเสียหายมากขึ้นเท่านั้น หลังจากที่ผู้เล่นคนหนึ่งพลิกสวิตช์ ความเสียหายที่ทำได้จะถูกหักออกจากสุขภาพของผู้เล่นสองคน จากนั้นจะเปลี่ยนเป็นเทิร์นของผู้เล่นสองคน ตอนนี้ ตัวเลขที่แสดงแสดงถึงสุขภาพของผู้เล่น และแถบพลังจะเต็มจากซ้ายไปขวา เมื่อผู้เล่นสองคนเคลื่อนไหว ความเสียหายจะถูกหัก และจะกลับมาเป็นเทิร์นของผู้เล่นอีกครั้ง สิ่งนี้จะเกิดขึ้นซ้ำๆ จนกว่าผู้เล่นหนึ่งคนจะมีพลังชีวิตถึง 0 แนบวิดีโอการทำงานนี้

ขั้นตอนที่ 2: FSM

FSM
FSM
FSM
FSM
FSM
FSM
FSM
FSM

เกมนี้เป็นเกมที่มีสถานะจำกัดขนาดใหญ่ ซึ่งตรรกะที่ซับซ้อนบางอย่างเกิดขึ้นตามสถานะที่ FSM อยู่

สถานะ 1: เมนูสถานะแรกคือหน้าจอเมนู ซึ่งเป็นหนึ่งในสถานะที่ง่ายกว่า ประกอบด้วยส่วนแสดงผลเจ็ดส่วนที่แสดงคำว่า "PLAY" และปุ่มที่ทำให้เกมเริ่ม ปุ่ม BTN นำเราไปสู่สถานะถัดไป ซึ่งเป็นเทิร์นของผู้เล่น

สถานะ 2: เทิร์นของผู้เล่นคนหนึ่ง

เทิร์นของผู้เล่นคนหนึ่งจะเปิดใช้งานสัญญาณที่ทำให้ส่วนแสดงเจ็ดส่วนแสดงสุขภาพของผู้เล่นที่สอง สัญญาณอื่นเปิดขึ้นเพื่อเปิดใช้งาน shift register ที่นำเข้าจากโมดูลอื่นที่เราสร้างขึ้น (Pone.vhd) การลงทะเบียนกะนี้ทำให้ไฟ LED สว่างขึ้นเช่นเดียวกับเกจพลังงานที่เพิ่มขึ้นในเกมอื่น ๆ จากนั้นจะรีเซ็ตเป็น 0 เมื่อถึงจำนวนสูงสุดของ LED ที่สามารถติดสว่างได้ มันอัปเดตขอบที่เพิ่มขึ้นของนาฬิกาที่ได้รับจาก barclock.vhd ซึ่งแก้ไขจากไฟล์แล็บที่ยืมมา เรามีแถบของผู้เล่นเริ่มจากด้านขวา และเติมทางด้านซ้าย เนื่องจากสวิตช์ของผู้เล่นจะอยู่ทางด้านซ้ายเช่นกัน (เพื่อประสบการณ์การใช้งานที่เข้าใจง่าย) เมื่อพลิกสวิตช์แล้ว สถานะจะย้ายไปที่ผู้เล่นคนหนึ่งหัก และจำนวนไฟ LED ที่ทำงานอยู่จะถูกบันทึกไว้ในสัญญาณ

สถานะ 3: ผู้เล่นคนหนึ่งหัก สัญญาณที่มีจำนวน LED ที่ใช้งานอยู่จะเป็นตัวกำหนดจำนวนสุขภาพที่จะถูกหัก สิ่งนี้ทำได้โดยมีรีจิสเตอร์การเปลี่ยนแปลงอื่น (deductor1.vhd) ที่แทนที่จะเพิ่ม LED ให้ลดค่าลง การลดลงนี้บนขอบที่เพิ่มขึ้นของหนึ่งในโมดูลนาฬิกา div ที่เรายืมและแก้ไข (downcounterclock.vhd) เมื่อปิด LED หนึ่งดวง พลังชีวิตหนึ่งจุดจะถูกหักออกจากพลังชีวิตทั้งหมดของผู้เล่นที่สอง หากในระหว่างกระบวนการนี้ ผู้เล่นสองคนมีพลังชีวิตถึง 0 เราจะหยุดและย้ายไปที่สถานะ "จบเกม" ทันที มิฉะนั้น เมื่อเวกเตอร์ LED ถึง “000000000000000000” เราจะไปยังเทิร์นของผู้เล่นสองคน

สถานะ 4: เทิร์นของผู้เล่นสองคน เทิร์นของผู้เล่นสองคนนั้นเหมือนกับเทิร์นของผู้เล่นทุกคน ยกเว้นการลงทะเบียนกะสำหรับมัน (Ptwo.bhd) จะเปลี่ยนจากซ้ายไปขวา และสวิตช์อยู่ทางด้านขวาของกระดาน สัญญาณเปิดใช้งานเพื่อให้แสดงสุขภาพของผู้เล่น 1 เมื่อสวิตช์ 2 เปิดใช้งาน การดำเนินการนี้จะเข้าสู่เทิร์นหักของผู้เล่นสองคน

ขั้นตอนที่ 5: ผู้เล่นสองคนหัก เช่นเดียวกับเทิร์นของผู้เล่นที่สอง ผู้เล่นสองคนหักทำหน้าที่เหมือนผู้เล่นคนหนึ่งหัก ข้อแตกต่างที่สำคัญคือ shift register ซึ่งควบคุมการปิดไฟ LED ไปในทิศทางตรงกันข้าม ซึ่งเป็นการปรับเปลี่ยนได้ง่ายเมื่อคุณมีผู้เล่นคนหนึ่งหักเงินทำงานอย่างถูกต้อง

ด่าน 6: จบเกม หากผู้เล่นคนใดคนหนึ่งมีพลังชีวิตเป็นศูนย์ เกมจะเปลี่ยนเป็นสถานะนี้ ไม่มีการแสดงแฟนซี หากกด BTN หนึ่ง พลังชีวิตจะถูกรีเซ็ตเป็น 99 และสถานะจะกลับไปที่เมนู เป็นการเริ่มเกมอย่างมีประสิทธิภาพ

ขั้นตอนที่ 3: โมดูล

โมดูล
โมดูล

ไดอะแกรมกล่องดำสำหรับเกม

Downcounterclock (ตามโมดูล clk_div.vhd โดย Bryan Mealy):

นี่คือนาฬิกาที่จัดการจังหวะเวลาของผู้หักเงิน ค่าคงที่ชื่อ max_count มากกว่าค่าคงที่ max_count ของ barclock 3 เท่า สิ่งนี้จะทำให้ตัวหักเงินช้ากว่าความเร็วของแถบ 3 เท่า

Barclock - (ตามโมดูล clk_div.vhd โดย Bryan Mealy):

นาฬิกานี้จัดการจังหวะเวลาของมาตรวัดพลังงาน ซึ่งเราเพิ่มอย่างรวดเร็วเพื่อเพิ่มความยากให้กับเกม เวลานี้สามารถปรับได้ตามใจชอบ เพิ่มความเร็วโดยทำให้ค่าคงที่ max_count เป็นจำนวนที่มากขึ้น หรือลดจำนวนลงโดยทำให้ max_count เป็นจำนวนที่น้อยลง Sseg_dec - (เขียนโดย Bryan Mealy): โมดูลนี้ใช้ตัวเลข 8 บิตเป็นอินพุต ซึ่งจะถอดรหัส แปลงตัวเลขให้เท่ากับทศนิยม แล้วส่งออกไปยังส่วนแสดงผลเจ็ดส่วน เพื่อให้ไฟล์นี้ใช้งานได้ คุณต้องตรวจสอบให้แน่ใจว่าข้อจำกัดของคุณตรงกับของเรา

โพเน่:

นี่คือ shift register ที่จะเลื่อนบิตไปทางซ้าย โดยเพิ่ม hot bit หนึ่งบิตเพื่อให้ดูเหมือนมาตรวัดกำลังเพิ่มขึ้น เมื่อบิตทั้งหมดร้อน บิตทั้งหมดจะรีเซ็ตเป็น '0' และรอบเริ่มต้นใหม่

พทู:

นี่เป็นโมดูล P1 แบบพลิกกลับ

ผู้หักเงิน1:

นี่คือการรวมกันของ shift register และ subtractor การลงทะเบียนกะไปในทิศทางตรงกันข้ามกับการลงทะเบียนกะของ P1 ซึ่งแสดงถึงการหัก นอกจากนี้ยังลบ 1 ออกจากสุขภาพของผู้เล่น 2 สำหรับทุกรอบสัญญาณนาฬิกา ดังนั้นด้วยการรวมกันของสองฟังก์ชันนี้จะดูเหมือนว่าสุขภาพของฝ่ายตรงข้ามจะลดลง 1 สำหรับทุกแถบสุขภาพที่ลดลง

Deductor2: นี่เป็นเวอร์ชันพลิกของโมดูล Deductor1

PlayDecoder (ยืมและแก้ไขจาก ekchen35649 133 คำสั่ง): ใช้ในสถานะเมนูเพื่อแสดงคำว่า "PLAY" บนตัวถอดรหัสเจ็ดส่วน

ขั้นตอนที่ 4: ทดสอบ

เกมนี้ได้รับแรงบันดาลใจจากหนึ่งในมินิเกมจากเคอร์บี้ เป็นเกมเล่นสองคนง่ายๆ ที่สามารถเล่นได้บนกระดาน Basys 3 หรือ FPGA ใดๆ

ขั้นตอนที่ 1: วัสดุที่จำเป็น

คุณจะต้องการ: Digilent Basys 3, FPGA Board (หรืออื่น ๆ) Vivado เวอร์ชันล่าสุดหรือสภาพแวดล้อม vhdl อื่น ๆ คอมพิวเตอร์ที่สามารถเรียกใช้โปรแกรมดังกล่าวได้ สมอง

ขั้นตอนที่ 2: ตัวเกมเอง

วิธีการเล่น

ในการเริ่มต้น ให้กดปุ่มตรงกลาง สิ่งนี้จะทำให้ “99” ซึ่งแสดงถึงสุขภาพของผู้เล่นสองคน เพื่อแสดงบนจอแสดงผลเจ็ดส่วน จากนั้นไฟ LED จะสว่างขึ้นตามลำดับจากขวาไปซ้าย รูปแบบนี้เป็นแถบพลังงาน เมื่อแถบพลังงานเต็ม แถบพลังงานจะรีเซ็ต เป้าหมายของผู้เล่นคนหนึ่งคือการพลิกสวิตช์เมื่อแถบอยู่สูงที่สุด ยิ่งไฟ LED ติดสว่างมากเท่าไร ผู้เล่นคนใดคนหนึ่งก็ยิ่งสร้างความเสียหายมากขึ้นเท่านั้น หลังจากที่ผู้เล่นคนหนึ่งพลิกสวิตช์ ความเสียหายที่ทำได้จะถูกหักออกจากสุขภาพของผู้เล่นสองคน จากนั้นจะเปลี่ยนเป็นเทิร์นของผู้เล่นสองคน ตอนนี้ ตัวเลขที่แสดงแสดงถึงสุขภาพของผู้เล่น และแถบพลังจะเต็มจากซ้ายไปขวา เมื่อผู้เล่นสองคนเคลื่อนไหว ความเสียหายจะถูกหัก และจะกลับมาเป็นเทิร์นของผู้เล่นอีกครั้ง สิ่งนี้จะเกิดขึ้นซ้ำๆ จนกว่าผู้เล่นหนึ่งคนจะมีพลังชีวิตถึง 0 แนบวิดีโอการทำงานนี้

ในการเล่นเกม ให้โหลดมันลงบนกระดานเบสแล้วกดปุ่มตรงกลาง พยายามพลิกสวิตช์โดยให้ไฟ LED ทำงานมากที่สุดเท่าที่จะเป็นไปได้ จากนั้นรอดูว่ากระดานจะหักคะแนนเหล่านั้นออกจากสุขภาพของคู่ต่อสู้ จากนั้นส่งต่อให้เพื่อนของคุณและ

ขั้นตอนที่ 3: FSM

เกมนี้เป็นเกมที่มีสถานะจำกัดขนาดใหญ่ ซึ่งตรรกะที่ซับซ้อนบางอย่างเกิดขึ้นตามสถานะที่ FSM อยู่

(แผนภาพสถานะ)

รัฐ 1: เมนู

สถานะแรกคือหน้าจอเมนู ซึ่งเป็นหนึ่งในสถานะที่ง่ายกว่า ประกอบด้วยส่วนแสดงผลเจ็ดส่วนที่แสดงคำว่า "PLAY" และปุ่มที่ทำให้เกมเริ่ม ปุ่ม BTN นำเราไปสู่สถานะถัดไป ซึ่งเป็นเทิร์นของผู้เล่น

สถานะ 2: เทิร์นของผู้เล่นคนหนึ่ง

เทิร์นของผู้เล่นคนหนึ่งจะเปิดใช้งานสัญญาณที่ทำให้ส่วนแสดงเจ็ดส่วนแสดงสุขภาพของผู้เล่นที่สอง สัญญาณอื่นเปิดขึ้นเพื่อเปิดใช้งาน shift register ที่นำเข้าจากโมดูลอื่นที่เราสร้างขึ้น (Pone.vhd) การลงทะเบียนกะนี้ทำให้ไฟ LED สว่างขึ้นเช่นเดียวกับเกจพลังงานที่เพิ่มขึ้นในเกมอื่น ๆ จากนั้นจะรีเซ็ตเป็น 0 เมื่อถึงจำนวนสูงสุดของ LED ที่สามารถติดสว่างได้ มันอัปเดตขอบที่เพิ่มขึ้นของนาฬิกาที่ได้รับจาก barclock.vhd ซึ่งแก้ไขจากไฟล์แล็บที่ยืมมา เรามีแถบของผู้เล่นเริ่มจากด้านขวา และเติมทางด้านซ้าย เนื่องจากสวิตช์ของผู้เล่นจะอยู่ทางด้านซ้ายเช่นกัน (เพื่อประสบการณ์การใช้งานที่เป็นธรรมชาติ) เมื่อพลิกสวิตช์แล้ว สถานะจะย้ายไปที่ผู้เล่นคนหนึ่งหัก และจำนวนไฟ LED ที่ทำงานอยู่จะถูกบันทึกไว้ในสัญญาณ

สถานะ 3: ผู้เล่นหนึ่งหัก

สัญญาณที่มีปริมาณไฟ LED ที่ทำงานอยู่จะเป็นตัวกำหนดปริมาณสุขภาพที่จะถูกหัก สิ่งนี้ทำได้โดยมีรีจิสเตอร์การเปลี่ยนแปลงอื่น (deductor1.vhd) ที่แทนที่จะเพิ่ม LED ให้ลดค่าลง การลดลงนี้บนขอบที่เพิ่มขึ้นของหนึ่งในโมดูลนาฬิกา div ที่เรายืมและแก้ไข (downcounterclock.vhd) เมื่อปิด LED หนึ่งดวง พลังชีวิตหนึ่งจุดจะถูกหักออกจากพลังชีวิตทั้งหมดของผู้เล่นที่สอง หากในระหว่างกระบวนการนี้ ผู้เล่นสองคนมีพลังชีวิตถึง 0 เราจะหยุดและย้ายไปที่สถานะ "จบเกม" ทันที มิฉะนั้น เมื่อเวกเตอร์ LED ถึง “000000000000000000” เราจะไปยังเทิร์นของผู้เล่นสองคน

สถานะ 4: เทิร์นของผู้เล่นสองคน

เทิร์นของผู้เล่นสองคนนั้นเหมือนกับเทิร์นของผู้เล่นทุกคน ยกเว้นกะรีจิสเตอร์สำหรับมัน (Ptwo.bhd) จะเปลี่ยนจากซ้ายไปขวา และสวิตช์จะอยู่ทางด้านขวาของกระดาน สัญญาณเปิดใช้งานเพื่อให้แสดงสุขภาพของผู้เล่น 1 เมื่อสวิตช์ 2 เปิดใช้งาน การดำเนินการนี้จะเข้าสู่เทิร์นหักของผู้เล่นสองคน

ด่าน 5: ผู้เล่นสองคนหัก

เช่นเดียวกับเทิร์นของผู้เล่นที่สอง ผู้เล่นสองคนที่หักจะทำหน้าที่เหมือนการหักของผู้เล่นคนหนึ่ง ข้อแตกต่างที่สำคัญคือ shift register ซึ่งควบคุมการปิดไฟ LED ไปในทิศทางตรงกันข้าม ซึ่งเป็นการปรับเปลี่ยนได้ง่ายเมื่อคุณมีผู้เล่นคนหนึ่งหักเงินทำงานอย่างถูกต้อง

ด่าน 6: จบเกม หากผู้เล่นคนใดคนหนึ่งมีพลังชีวิตเป็นศูนย์ เกมจะเปลี่ยนเป็นสถานะนี้ ไม่มีการแสดงแฟนซี หากกด BTN หนึ่ง พลังชีวิตจะถูกรีเซ็ตเป็น 99 และสถานะจะกลับไปที่เมนู เป็นการเริ่มเกมอย่างมีประสิทธิภาพ

กล่องดำ

ขั้นตอนที่ 4: โมดูล

Downcounterclock (ตามโมดูล clk_div.vhd โดย Bryan Mealy):

นี่คือนาฬิกาที่จัดการจังหวะเวลาของผู้หักเงิน ค่าคงที่ชื่อ max_count มากกว่าค่าคงที่ max_count ของ barclock ถึง 3 เท่า สิ่งนี้จะทำให้ตัวหักเงินช้ากว่าความเร็วของแถบ 3 เท่า

Barclock - (อิงตามโมดูล clk_div.vhd โดย Bryan Mealy): นาฬิกานี้จัดการจังหวะเวลาของมาตรวัดพลังงาน ซึ่งเราได้เพิ่มอย่างรวดเร็วเพื่อเพิ่มความยากให้กับเกม เวลานี้สามารถปรับได้ตามใจชอบ เพิ่มความเร็วโดยทำให้ค่าคงที่ max_count เป็นจำนวนที่มากขึ้น หรือลดจำนวนลงโดยทำให้ max_count เป็นจำนวนที่น้อยลง Sseg_dec - (เขียนโดย Bryan Mealy): โมดูลนี้ใช้ตัวเลข 8 บิตเป็นอินพุต ซึ่งจะถอดรหัส แปลงตัวเลขให้เท่ากับทศนิยม แล้วส่งออกไปยังส่วนแสดงผลเจ็ดส่วน เพื่อให้ไฟล์นี้ใช้งานได้ คุณต้องตรวจสอบให้แน่ใจว่าข้อจำกัดของคุณตรงกับของเรา

Pone: นี่คือ shift register ที่จะเลื่อนบิตไปทางซ้าย โดยเพิ่ม hot bit เข้าไปเพื่อให้ดูเหมือน power gauge เพิ่มขึ้น เมื่อบิตทั้งหมดร้อน บิตทั้งหมดจะรีเซ็ตเป็น '0' และรอบเริ่มต้นใหม่

Ptwo: นี่เป็นโมดูล P1 เวอร์ชันพลิกกลับ

Deductor1: นี่คือการรวมกันของ shift register และ subtractor การลงทะเบียนกะไปในทิศทางตรงกันข้ามกับการลงทะเบียนกะของ P1 ซึ่งแสดงถึงการหัก นอกจากนี้ยังลบ 1 ออกจากสุขภาพของผู้เล่น 2 สำหรับทุกรอบสัญญาณนาฬิกา ดังนั้นด้วยการรวมกันของสองฟังก์ชันนี้จะดูเหมือนว่าสุขภาพของฝ่ายตรงข้ามจะลดลง 1 สำหรับทุกแถบสุขภาพที่ลดลง

Deductor2: นี่เป็นเวอร์ชันพลิกของโมดูล Deductor1

PlayDecoder (ยืมและดัดแปลงเล็กน้อยจาก ekchen35649 ของเขา 133 คำสั่ง):

ใช้ในสถานะเมนูเพื่อแสดงคำว่า "เล่น" บนตัวถอดรหัสเซเว่นเซ็กเมนต์

สิ่งที่ต้องทำ: รูปภาพ, วิดีโอ

แนะนำ: