สารบัญ:

เกมจับคู่ไบนารีกับทศนิยม: 10 ขั้นตอน
เกมจับคู่ไบนารีกับทศนิยม: 10 ขั้นตอน

วีดีโอ: เกมจับคู่ไบนารีกับทศนิยม: 10 ขั้นตอน

วีดีโอ: เกมจับคู่ไบนารีกับทศนิยม: 10 ขั้นตอน
วีดีโอ: เกม หาเครื่องหมายคณิตศาสตร์ 10 ข้อ 2024, พฤศจิกายน
Anonim
Image
Image
การตั้งค่าตัวแบ่งนาฬิกา
การตั้งค่าตัวแบ่งนาฬิกา

คำแนะนำนี้จะแสดงกระบวนการและโมดูลที่จำเป็นในการสร้างเกมจับคู่ไบนารีเป็นทศนิยม ภายใน 60 วินาที ผู้ใช้จะแปลและป้อนตัวเลขทศนิยมที่สร้างแบบสุ่มบนจอแสดงผลทั้งเจ็ดส่วนเป็นเลขฐานสองโดยสลับสวิตช์และส่งด้วยปุ่มเดา เมื่อเสร็จแล้ว คะแนนสุดท้ายจะแสดงขึ้นและรีเซ็ตเพื่อเล่นอีกครั้ง

การทำความเข้าใจเลขฐานสองและปฏิกิริยาตอบสนองเร็วนั้นมีประโยชน์ในการทำให้ดี แต่มีปุ่มรีเซ็ตให้ในกรณีที่ต้องการลองอีกครั้งทันที

ขั้นตอนที่ 1: การตั้งค่าตัวแบ่งนาฬิกา

กระดูกสันหลังของโปรเจ็กต์ทั้งหมดนี้มาจากการซิงโครไนซ์ชิ้นส่วนทั้งหมดใน Gizmo นี้อย่างถูกต้อง Finite State Machine ของเราใช้นาฬิกาภายใน แต่การแสดงผลเจ็ดส่วนและตัวจับเวลาต้องใช้นาฬิการุ่นที่มีการเปลี่ยนแปลง

"นาฬิกาใหม่" นี้มาจากการแบ่งนาฬิกาภายในตามช่วงเวลาที่ต้องการเพื่อให้ได้ความถี่ที่จำเป็นสำหรับส่วนประกอบเฉพาะแต่ละอย่าง สิ่งนี้ได้ทำในห้องปฏิบัติการก่อนหน้านี้และจากประสบการณ์ เรารู้ว่าตัวจับเวลาตั้งค่าหลัก "หนึ่ง" เป็น 0.1 Hz และหลัก "สิบ" เป็น 1 Hz

อินพุต: ClkIn, ตัวหาร (32 บิต)

ผลลัพธ์: ClkOut

ขั้นตอนที่ 2: การสร้างเครื่องจำกัดสถานะ (FSM)

การสร้างเครื่องไฟไนต์สเตท (FSM)
การสร้างเครื่องไฟไนต์สเตท (FSM)
การสร้างเครื่องไฟไนต์สเตท (FSM)
การสร้างเครื่องไฟไนต์สเตท (FSM)
การสร้างเครื่องไฟไนต์สเตท (FSM)
การสร้างเครื่องไฟไนต์สเตท (FSM)

ใน Finite-State Machine เราตัดสินใจว่าห้าสถานะ (เริ่ม แสดง ตรวจสอบ คะแนน และสิ้นสุด) จำเป็นต้องมีห้าอินพุต (เริ่ม รีเซ็ต เดา เท่ากับ หมดเวลา) เอาต์พุตเดียวใน State Machine ของเราคือตัวเลข 3 บิตที่แสดงถึงสถานะที่ผู้ใช้อยู่ใน (000, 001, 011, 101, 100) ตามสถานะด้านล่าง

โปรดจำไว้ว่า Finite State Machine ไม่ได้สร้างฟังก์ชันไว้ล่วงหน้า แต่เพียงบอกว่าโปรแกรมอยู่ในสถานะใดและอะไร สิ่งที่เกิดขึ้นจริงถูกกำหนดโดยโมดูลระดับบนสุดที่อธิบายด้านล่าง

สถานะเริ่มต้น (000)

สถานะเริ่มต้นเป็นที่ที่ผู้ใช้จะเริ่มต้นจนกว่าอินพุตเริ่มต้นจะสูง ซึ่งเป็นสถานะที่จะไปถึงทุกครั้งที่กดปุ่มรีเซ็ต

สถานะเกม (001)

สถานะเกมคือจุดเริ่มต้นของเกม โดยจะมีการสร้างตัวเลขสุ่มและผู้ใช้สลับสวิตช์เพื่อสร้างอินพุต เมื่อกดปุ่มเดา เกมจะถูกย้ายไปยังสถานะการตรวจสอบ

ตรวจสอบสถานะ (011)

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

สถานะการตรวจสอบนี้เกิดขึ้นค่อนข้างเร็วเมื่อเทียบกับสถานะอื่นๆ เนื่องจากจะเกิดขึ้นตราบใดที่กดปุ่มตรวจสอบเท่านั้น

สถานะคะแนน (101)

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

สถานะสิ้นสุด (100)

เมื่อหมดเวลา 60 วินาที อินพุตไทม์เอาต์จะสูงและผู้ใช้ไปถึงสถานะสิ้นสุดซึ่งคะแนนสุดท้ายจะแสดงขึ้น อินพุตรีเซ็ตจะถูกกดและ FSM จะเริ่มต้นใหม่ที่สถานะเริ่มต้นอีกครั้ง

อินพุต: Clk, rst, เริ่ม, เดา, เท่ากัน, หมดเวลา

เอาต์พุต: สถานะ (3 บิต)

ขั้นตอนที่ 3: การทำแผนที่การแสดงเซเว่นเซ็กเมนต์

การทำแผนที่การแสดงเซเว่นเซกเมนต์
การทำแผนที่การแสดงเซเว่นเซกเมนต์
การทำแผนที่การแสดงเซเว่นเซกเมนต์
การทำแผนที่การแสดงเซเว่นเซกเมนต์
การทำแผนที่การแสดงเซเว่นเซกเมนต์
การทำแผนที่การแสดงเซเว่นเซกเมนต์

การแสดงผล Seven Segment เป็นส่วนสำคัญของโปรเจ็กต์ทั้งหมด เนื่องจากตัวเลขสองหลักแรกบนหน้าจอถูกใช้เป็นเอาต์พุตของตัวสร้างตัวเลขสุ่ม ในขณะที่ตัวเลขสองหลักสุดท้ายคือตัวจับเวลา แม้ว่าเราจะใช้ตัวอย่างนี้ในแล็บสุดท้ายในแง่ของการมีตัวเลขบนหน้าจอ แต่ก็แสดงเป็นเลขฐานสิบหก ในการแก้ไขปัญหานี้ เราใช้ตัวแปลงและตัวแบ่งนาฬิกาที่อธิบายเพิ่มเติมด้านล่าง

จอแสดงผลจะแสดง 0 ทั้งหมดจนกว่า FSM จะเข้าสู่สถานะเกม อย่างไรก็ตาม ในสถานะสุดท้าย หน้าจอควรแสดงคะแนนของผู้ใช้เท่านั้น

เนื่องจากเราใช้ตัวเลขทั้งสี่หลักของการแสดงผลเจ็ดส่วน เราจึงต้องวนผ่านแต่ละขั้วบวกอย่างรวดเร็วเพียงพอที่ 300 Hz เพื่อให้รับรู้ได้ว่ามีแสงสว่างอยู่เสมอ

ปัจจัยการผลิต: Clk, sevensegment

เอาต์พุต: แคโทด (7 บิต), แอโนด (4 บิต)

ขั้นตอนที่ 4: การสร้างตัวเปรียบเทียบ

การสร้างตัวเปรียบเทียบ
การสร้างตัวเปรียบเทียบ

โมดูลย่อยนี้ใช้ในสถานะการตรวจสอบในแง่ของการเปรียบเทียบการเดาแบบไบนารี 7 บิตที่ป้อนเข้ากับค่าทศนิยมจริง

เรามีคำสั่ง if ที่ประเมินทั้งอินพุตและเอาต์พุตสองรายการ ขึ้นอยู่กับว่าค่าที่เท่ากันนั้นสูงหรือต่ำ โมดูลนี้มีความสำคัญเท่าๆ กับ มันเป็นหนึ่งในโปรแกรมที่ง่ายกว่าในการออกแบบในโครงการนี้

อินพุต: สวิตช์ (8 บิต), จำนวน (8 บิต)

เอาท์พุต: EQ

ขั้นตอนที่ 5: การตั้งค่าตัวจับเวลา

การตั้งค่าตัวจับเวลา
การตั้งค่าตัวจับเวลา
การตั้งค่าตัวจับเวลา
การตั้งค่าตัวจับเวลา

ตัวจับเวลาของเรามีสองตัวนับที่แตกต่างกันซึ่งเพิ่มขึ้นในอัตราที่ต่างกัน ตัวนับหนึ่งตัวในค่า "หนึ่ง" (การแสดงเจ็ดส่วนแรก) และตัวนับหนึ่งตัวสำหรับค่า "สิบ" (หลักที่สองบนจอแสดงผลเจ็ดส่วน) ตัวเลขแต่ละตัวจะขึ้นอยู่กับขอบที่เพิ่มขึ้นของนาฬิกา และเมื่อตัวนับถึง 60 วินาที time_out จะสูงและเกมจะจบลงและกลับสู่สถานะเริ่มต้น

อินพุต: Clk, state(3 บิต), start

เอาต์พุต: ปัจจุบัน (8 บิต), หมดเวลา

ขั้นตอนที่ 6: การออกแบบตัวสร้างตัวเลขสุ่มหลอก

การออกแบบตัวสร้างตัวเลขสุ่มหลอก
การออกแบบตัวสร้างตัวเลขสุ่มหลอก

อีกวิธีหนึ่งสำหรับตัวสร้างตัวเลขโดยเฉพาะสำหรับกรณีนี้คือการมีตัวนับซ้ำตั้งแต่ 0-99 (เป็นเลขฐานสอง) ที่ส่งออกตัวเลขที่นับเมื่ออินพุตมีค่าสูง เนื่องจากจะทำให้ไม่จำเป็นต้องใช้ LFSR

ตัวเลขจะเปลี่ยนทุกขอบที่เพิ่มขึ้นของนาฬิกาภายใน (10 นาโนวินาที) และวนรอบตัวเลขทั้งหมด 100 ตัวในหนึ่งไมโครวินาที เมื่อใดก็ตามที่ผู้ใช้ต้องการหมายเลขใหม่จากตัวสร้างตัวเลข มันจะส่งออกหมายเลขที่มันเปิดอยู่

แม้ว่ากระบวนการนี้ไม่ได้สุ่มทั้งหมด แต่ความน่าจะเป็นในการค้นหาผลลัพธ์ที่เกี่ยวข้องจากกระบวนการนี้ต่ำพอที่จะสุ่มหลอกได้

อินพุต: Clk, changenum, เท่ากับ

เอาต์พุต: จำนวน (8 บิต)

ขั้นตอนที่ 7: การสร้างตัวแปลง

การสร้างตัวแปลง
การสร้างตัวแปลง

ส่วนประกอบที่จำเป็นคือ Converter ซึ่งเราใช้แสดงตัวเลขทศนิยมในการแสดงเจ็ดเซกเมนต์ แทนที่จะเป็นเลขฐานสิบหกดั้งเดิม แม้ว่าตัวเลขทั้งสองจะใช้เลขฐานสอง 7 บิต แต่เราได้สร้างโมดูลทั้งหมดที่กำหนดเพื่อแปลงเลขฐานสิบหกเป็นทศนิยม

ตัวอย่างเช่น หากผลลัพธ์สุดท้ายสำหรับคะแนนคือ 001001 (สิบเจ็ด) การแสดงเจ็ดส่วนจะแสดงค่าเลขฐานสิบหกของ 11 แทนที่จะเป็นเลขฐานสิบของ 17

อินพุต: ตัวเลข (8 บิต)

เอาต์พุต: ตัวเลข (8 บิต)

ขั้นตอนที่ 8: นำทุกอย่างมารวมกันในโมดูลเกม

รวมทุกอย่างไว้ในโมดูลเกม
รวมทุกอย่างไว้ในโมดูลเกม
รวมทุกอย่างไว้ในโมดูลเกม
รวมทุกอย่างไว้ในโมดูลเกม
รวมทุกอย่างไว้ในโมดูลเกม
รวมทุกอย่างไว้ในโมดูลเกม
รวมทุกอย่างไว้ในโมดูลเกม
รวมทุกอย่างไว้ในโมดูลเกม

สำหรับส่วนประกอบของเรา เราใช้สวิตช์ 0-6 ที่จำเป็นเพื่อให้ผู้ใช้สลับ โดยมีปุ่มสามปุ่มทำหน้าที่เป็นอินพุตของผู้ใช้สำหรับการเริ่ม รีเซ็ต และคาดเดา ส่วนประกอบการแสดงผลเจ็ดส่วนและนาฬิกายังเป็นส่วนประกอบที่เราได้ทำมาจากห้องทดลองก่อนหน้านี้ แต่ต้องปรับเปลี่ยนเพื่อให้เข้ากับโครงการนี้

เราแบ่งโปรเจ็กต์นี้ออกเป็น 6 โมดูลที่แสดงด้านบนเพื่อแยก Gizmo ทั้งหมดออกเป็นส่วนการทำงานหลายๆ ส่วน อย่างไรก็ตาม วิธีการเชื่อมต่อนั้นค่อนข้างซับซ้อนและแสดงจากรูปภาพกล่องดำที่แนบมา

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

อินพุต: สวิตช์ (8 บิต), Clk, รีเซ็ต, เริ่ม, เดา

เอาต์พุต: แคโทด (7 บิต), แอโนด (4 บิต), ไฟ LED (7 บิต)

ขั้นตอนที่ 9: พบปัญหาเพิ่มเติม

แม้ว่าจะมีการใช้สวิตช์เพียงเจ็ดตัวในเกมนี้ แต่รหัสนี้ตั้งเป็นตัวเลข 8 บิต เราทำสิ่งนี้เพื่อให้มีตัวเปรียบเทียบที่สะดวกกว่าที่จะเปรียบเทียบ 8 บิตเหล่านี้กับตัวเลข 8 บิตที่เราสร้างขึ้นจากตัวสร้างตัวเลขสุ่ม

คะแนนยังทำให้เรามีปัญหาเล็กน้อยในตอนแรกเพราะเรากำหนดให้เพิ่มจุดหนึ่งเมื่อ FSM อยู่ในสถานะคะแนน อย่างไรก็ตาม สิ่งที่เกิดขึ้นคือคะแนนยังคงเพิ่มขึ้นตราบเท่าที่สถานะยังดำเนินต่อไป ทำให้เราได้คะแนนสูงเกินสมควรที่เราไม่สามารถรับมือได้ เราแก้ไขปัญหานี้โดยเพิ่มสัญญาณพัลส์ที่ซิงโครไนซ์กับขอบที่เพิ่มขึ้นของนาฬิกา ดังที่เห็นในโค้ดในขั้นตอนที่ 8

สุดท้าย ตัวจับเวลาใช้เวลามากในการแก้ไขจุดบกพร่อง เนื่องจากจะทำให้การแสดงผลทั้งเจ็ดส่วนของเราบิดเบี้ยวเมื่อกำลังนับถอยหลัง ดังนั้นเราจึงต้องเปลี่ยนจากการนับถอยหลังจาก 60 เป็นการนับขึ้นจาก 0

ขั้นตอนที่ 10: ไฟล์ต้นฉบับและข้อจำกัด

หากคุณต้องการดึงจากไฟล์ต้นฉบับของเราแทนที่จะสร้างไฟล์ของคุณเอง ให้ดำเนินการดังนี้ รวมถึงไฟล์ข้อจำกัดด้วย

แนะนำ: