สารบัญ:
- ขั้นตอนที่ 1: รายละเอียดและวัสดุโดยย่อ
- ขั้นตอนที่ 2: เชื่อมต่อฮาร์ดแวร์
- ขั้นตอนที่ 3: คำอธิบายทางเทคนิค: หน้าจอ
- ขั้นตอนที่ 4: คำอธิบายทางเทคนิค: การเปลี่ยนแปลงข้อมูลที่แสดง
- ขั้นตอนที่ 5: รหัส
วีดีโอ: VHDL Basy3: เชื่อมต่อ 4 เกม: 5 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:05
บทนำ:
นี่คือเกม Connect 4 Digital Logic ที่ออกแบบใน VHDL โดยใช้ซอฟต์แวร์ Vivado และตั้งโปรแกรมไว้ที่บอร์ด Basy3 การก่อสร้างและการออกแบบของโครงการนี้เป็นระดับกลาง แต่ผู้มาใหม่สามารถคัดลอกขั้นตอนและสร้างเกมดิจิทัลได้
เกมดังกล่าวทำงานเหมือนกับเกม Connect 4 ผู้เล่นสามารถเลื่อนเคอร์เซอร์ผ่านหน้าจอได้โดยใช้ปุ่มซ้ายและขวาบนกระดาน การกดปุ่มตรงกลางบนกระดานจะทำให้ผู้เล่นวางเครื่องหมายบนคอลัมน์นั้นและจะกลายเป็นเทิร์นของผู้เล่นคนต่อไป เมื่อผู้เล่นชนะ เกมสามารถรีเซ็ตได้โดยกดปุ่มขึ้นบนกระดาน
ขั้นตอนที่ 1: รายละเอียดและวัสดุโดยย่อ
รายละเอียดทางเทคนิคโดยย่อ:
-
ใช้การเชื่อมต่อ PMOD สามชุดบนกระดาน (JA, JB, JC)
- 8 พิน (ไม่รวมพิน Vcc & GND) ที่ใช้สำหรับตัวเชื่อมต่อ PMOD แต่ละตัว
- JA - การควบคุมแถว
- JB - การควบคุมคอลัมน์สีเขียว
- JC - การควบคุมคอลัมน์สีแดง
-
นาฬิกาหน้าจอทำงานที่ 960Hz
เปิดไฟ LED เพียง 8 ดวงในเวลาที่กำหนด หน้าจอจะรีเฟรชด้วยความเร็วสัญญาณนาฬิกาที่เร็วพอที่จะทำให้ภาพลวงมี LED มากกว่า 8 ดวงเปิดอยู่ในช่วงเวลาที่กำหนด
- นาฬิกาปุ่มทำงานที่ 5Hz; สามารถเลือกปรับแต่งได้โดยการแก้ไขโค้ด VHDL
- ความต้านทานภายในของ Darlington Arrays ก็เพียงพอแล้วที่จะป้องกันไม่ให้ LED หมดไฟ
เกมดังกล่าวสร้างขึ้นโดยใช้ส่วนประกอบและเครื่องมือต่อไปนี้:
- (1) คณะกรรมการ Basy3
- (2) LED Matrix Bi-color 8x5:
- (2) ULN2803 - อาร์เรย์ทรานซิสเตอร์ดาร์ลิงตัน - เอกสารข้อมูล
- ม้วนลวด
- สายจัมเปอร์
- เครื่องปอกสายไฟ
- เขียงหั่นขนม (สี่เหลี่ยมขนาดใหญ่น่าจะเพียงพอ)
- มัลติมิเตอร์และพาวเวอร์ซัพพลาย (การแก้ไขปัญหา)
ขั้นตอนที่ 2: เชื่อมต่อฮาร์ดแวร์
แนวทางปฏิบัติ:
การเดินสายของโครงการอาจซับซ้อนมาก โปรดใช้เวลาของคุณและตรวจสอบว่าการเชื่อมต่อทั้งหมดถูกต้องทีละชุด
โปรเจ็กต์นี้เกี่ยวข้องกับการใช้หน้าจอ LED สองจอ แต่รวมกันเป็นหน้าจอขนาดใหญ่หนึ่งจอ สามารถทำได้โดยเชื่อมต่อแถวทั้งหมดเข้ากับจุดเดียวกัน เนื่องจากแต่ละหน้าจอเป็นแบบสองสี แถวสีแดงและสีเขียวของหน้าจอหนึ่งจะต้องเชื่อมโยงกับแถวสีแดงและสีเขียวของอีกหน้าจอหนึ่งด้วย การทำเช่นนี้เราสามารถควบคุมแถวทั้งหมดได้เพียง 8 พินเท่านั้น อีก 16 พินใช้เพื่อควบคุมคอลัมน์ของจอแสดงผล 8 พินสำหรับสามารถเชื่อมต่อโดยตรงผ่านสายจัมเปอร์ไปยังขั้วต่อ pmod การเชื่อมต่อ Pmod ไปที่อินพุตของ ULN2083A ก่อน และเอาต์พุตของ ULN2083A จะเชื่อมต่อโดยตรงกับคอลัมน์บนหน้าจอ เนื่องจากการออกแบบเป็นขนาด 8x8 บางคอลัมน์จึงไม่เชื่อมต่อกัน
- JA: การเชื่อมต่อแถว: แถวที่ 1 ถึง JA:1 ถึงแถวที่ 8 สำหรับ JA:10
- JA: การเชื่อมต่อคอลัมน์สีแดง:
- JC: การเชื่อมต่อคอลัมน์สีเขียว
โปรดดูรูปภาพที่โพสต์เพื่อให้ทราบว่าหมุดใดตรงกับแถว/คอลัมน์ใด
หมายเหตุ: ทรานซิสเตอร์มีความต้านทานในตัว ดังนั้น LED จึงไม่ต้องการความต้านทานเพิ่มเติมเพื่อเชื่อมต่อกับพวกมันแบบอนุกรม
ขั้นตอนที่ 3: คำอธิบายทางเทคนิค: หน้าจอ
หน้าจอทำงานด้วยความคงอยู่ของการมองเห็น หน้าจอรีเฟรชเร็วมากจนสายตามนุษย์มองไม่เห็นอย่างเห็นได้ชัดว่าไฟ LED บางดวงถูกปิดและเปิดอย่างรวดเร็ว อันที่จริง การทำให้นาฬิกาแสดงผลช้าลง เราสามารถสังเกตเห็นการกะพริบได้
การแสดงผลจะเปิดทั้งแปดแถวตามข้อมูลที่เก็บไว้สำหรับแถวเหล่านั้น และการแสดงผลจะเปิดขึ้นในคอลัมน์เดียว จากนั้นจะเปลี่ยนเป็นการป้อนข้อมูลถัดไปอย่างรวดเร็วสำหรับแปดแถวและเปิดคอลัมน์ถัดไป ในขณะที่ปิดคอลัมน์อื่นๆ ทั้งหมด กระบวนการนี้ดำเนินต่อไปด้วยความเร็วสัญญาณนาฬิกาที่เร็วพอจนมองไม่เห็นการกะพริบของ LED
การจัดเก็บข้อมูลสำหรับการแสดงผลจะเริ่มต้นทันทีหลังจากสถาปัตยกรรมในไฟล์ VHDL ในลักษณะต่อไปนี้:
สัญญาณ RedA, RedB, RedC, RedD, RedE, RedF, RedG, RedH: std_logic_vector (7 เหลือ 0):= "00000000";
สัญญาณ GreenA, GreenB, GreenC, GreenD, GreenE, GreenF, GreenG, GreenH: std_logic_vector (7 เหลือ 0):= "00000000"; -- ข้อมูลแถวขึ้นอยู่กับคอลัมน์: GREEN
ต่อไปนี้เป็นตัวอย่างเล็ก ๆ ของกระบวนการที่ควบคุมเมทริกซ์การแสดงผล LED
-- Process that Controls LED display matrixdisplay: process (ColCLK) -- 0 - 16 เพื่อรีเฟรชทั้งตัวแปรเมทริกซ์ 8X8 RED และ 8x8 GREEn RowCount: ช่วงจำนวนเต็ม 0 ถึง 16:= 0; เริ่มต้น if (rising_edge(ColCLK)) แล้ว if (RowCount = 0) แล้ว DORow <= RedA; -- ข้อมูลแถวสำหรับคอลัมน์ DOCol <= "1000000000000000"; -- ทริกเกอร์คอลัมน์ -- ทำซ้ำโค้ดนี้จนถึง "00000000000001" -- เปลี่ยนเป็น RedB, RedC…GreenA, GreenB…GreenH
ในตอนท้ายของ GreenH ก่อนที่กระบวนการจะยุติข้อมูลโค้ดนี้จะถูกรวมไว้เพื่อรีเซ็ต RowCount กลับเป็นศูนย์
ถ้า (RowCount = 15) แล้ว -- เริ่มต้นการรีเฟรชจากคอลัมน์ A RowCount:= 0; RowCount:= RowCount + 1; -- เลื่อนผ่านคอลัมน์สิ้นสุดถ้า;
ตอนนี้ เพื่ออธิบายนาฬิกาที่อยู่ในรายการความไวของกระบวนการแสดงผล บอร์ด Basy3 มีนาฬิกาภายในที่ทำงานที่ 100MHz สำหรับจุดประสงค์ของเรา นาฬิกานี้เร็วเกินไป เราจึงต้องแบ่งนาฬิกานี้เป็นนาฬิกา 960Hz โดยใช้กระบวนการต่อไปนี้
-- กระบวนการนาฬิกาทำงานที่ 960HzCLKDivider: กระบวนการ (CLK) ตัวแปร clkcount: ช่วงจำนวนเต็ม 0 ถึง 52083:= 0; เริ่มต้นถ้า (rising_edge(CLK)) แล้ว clkcount:= clkcount + 1; if (clkcount = 52083) แล้ว ColCLK <= not(ColCLK); clkcount:= 0; สิ้นสุดถ้า; สิ้นสุดถ้า; สิ้นสุดกระบวนการ
ขั้นตอนที่ 4: คำอธิบายทางเทคนิค: การเปลี่ยนแปลงข้อมูลที่แสดง
ในโค้ด VHDL ข้อมูลหรือข้อมูลที่จะแสดงบนหน้าจอจะถูกควบคุมโดยกระบวนการเคอร์เซอร์ ซึ่งมีนาฬิกาที่แตกต่างกันในรายการความไว รหัสนี้เรียกว่า BtnCLK นาฬิกาที่ออกแบบมาเพื่อลดการชำรุดของปุ่มเมื่อกด ซึ่งรวมอยู่ด้วยเพื่อที่ว่าหากกดปุ่ม เคอร์เซอร์ที่แถวบนสุดจะไม่เคลื่อนที่ข้ามคอลัมน์อย่างรวดเร็ว
-- กระบวนการนาฬิกาทำงานที่ 5 Hz. ButtonCLK: กระบวนการ (CLK) ตัวแปร btnclkcount: ช่วงจำนวนเต็ม 0 ถึง 10000001:= 0; เริ่มต้น if (rising_edge(CLK)) แล้ว if (btnclkcount = 10000000) แล้ว btnclkcount:= 0; BtnCLK <= ไม่ใช่ (BtnCLK); อื่น btnclkcount:= btnclkcount + 1; สิ้นสุดถ้า; สิ้นสุดถ้า; สิ้นสุดกระบวนการ
ด้วยเอาต์พุตสัญญาณ BtnCLK ของกระบวนการนี้ เราสามารถอธิบายกระบวนการเคอร์เซอร์ได้แล้ว กระบวนการเคอร์เซอร์มีเพียง BtnCLK ในรายการความไว แต่ในบล็อกโค้ด สถานะของปุ่มจะถูกตรวจสอบและจะทำให้ข้อมูลสำหรับ RedA, RedB…GreenH เปลี่ยนไป นี่คือตัวอย่างโค้ดเคอร์เซอร์ ซึ่งรวมถึงบล็อกการรีเซ็ตและบล็อกสำหรับคอลัมน์แรก
เคอร์เซอร์: กระบวนการ (BtnCLK) ตัวแปร OCursorCol: STD_LOGIC_VECTOR (2 ลงไป 0):= "000"; -- OCursorCol ติดตามตัวแปรคอลัมน์ก่อนหน้า NCursorCol: STD_LOGIC_VECTOR (2 ลงไป 0):= "000"; -- NCursorCol ตั้งค่าเริ่มต้นคอลัมน์เคอร์เซอร์ใหม่ --RESET condition (ปุ่มขึ้น) --Board ถูกล้างเพื่อให้เกมเริ่มต้นใหม่หาก (rising_edge(BtnCLK)) แล้วถ้า (RST = '1') แล้ว RedA <= "00000000"; RedB <= "00000000"; แดงซี <= "00000000"; แดง <= "00000000"; แดง <= "00000000"; RedF <= "00000000"; RedG <= "00000000"; แดงH <= "00000000"; กรีนA <= "00000000"; GreenB <= "00000000"; GreenC <= "00000000"; GreenD <= "00000000"; กรีนอี <= "00000000"; GreenF <= "00000000"; กรีนจี <= "00000000"; GreenH if (Lbtn = '1') แล้ว NCursorCol:= "111"; -- คอลัมน์ H elsif (Rbtn = '1') จากนั้น NCursorCol:= "001"; -- คอลัมน์ B elsif (Cbtn = '1') จากนั้น NCursorCol:= OCursorCol; -- คอลัมน์ยังคงเป็น NTurnState เดิม <= not(TurnState); -- ทริกเกอร์เทิร์นของผู้เล่นคนต่อไป -- ตรวจสอบคอลัมน์ปัจจุบันจากล่างขึ้นบนและเปิดไฟ LED ดวงแรกที่ไม่ติด สีขึ้นอยู่กับสีเคอร์เซอร์ของผู้เล่นปัจจุบัน สำหรับ ck ใน 7 ลงไป 1 ลูป ถ้า (RedA(0) = '1') และ (RedA(ck) = '0') และ (GreenA(ck) = '0') แล้ว RedA(Ck) <= '1'; สีแดงA(0) <= '0'; ออก; สิ้นสุดถ้า;
ถ้า (GreenA(0) = '1') และ (RedA(ck) = '0') และ (GreenA(ck) = '0') แล้ว
กรีนเอ(Ck) <= '1'; GreenA(0) -- ผู้เล่นสีแดง GreenA(0) <= '0'; if (NCursorCol = OCursorCol) แล้ว -- ถ้าไม่มีอะไรถูกกด RedA(0) <= '1'; elsif (NCursorCol = "111") แล้ว -- ถ้า Lbtn ถูกกด RedH(0) <= '1'; สีแดงA(0) <= '0'; elsif (NCursorCol = "001") แล้ว -- ถ้ากด Rbtn RedB(0) <= '1'; RedA(0) -- ผู้เล่นสีเขียว RedA(0) <= '0'; ถ้า (NCursorCol = OCursorCol) แล้ว GreenA(0) <= '1'; elsif (NCursorCol = "111") จากนั้น GreenH(0) <= '1'; สีเขียวA(0) <= '0'; elsif (NCursorCol = "001") จากนั้น GreenB(0) <= '1'; สีเขียวA(0) <= '0'; สิ้นสุดถ้า; กรณีสิ้นสุด;
หมายเหตุ คำสั่งกรณีแรกที่เรียกว่า: OCursorCol (ซึ่งย่อมาจาก Old Cursor Column) เป็นจุดเริ่มต้นของเครื่องสถานะจำกัด แต่ละคอลัมน์ของจอแสดงผลจะถือเป็นสถานะของตนเองใน FSM มี 8 คอลัมน์ ดังนั้นจึงใช้ชุดเลขฐานสอง 3 บิตเพื่อระบุแต่ละคอลัมน์เป็นสถานะ วิธีที่ FSM เคลื่อนที่ระหว่างสถานะขึ้นอยู่กับปุ่มที่กด ในตัวอย่างด้านบน หากกดปุ่มซ้าย FSM จะย้ายไปที่ "111" ซึ่งจะเป็นคอลัมน์สุดท้ายของจอแสดงผล หากกดปุ่มขวา FSM จะย้ายไปที่ "001" ซึ่งจะเป็นคอลัมน์ที่สองของจอแสดงผล
หากกดปุ่มตรงกลาง FSM จะไม่ย้ายไปยังสถานะใหม่ แต่จะทริกเกอร์การเปลี่ยนแปลงในสัญญาณ TurnState แทน ซึ่งเป็นสัญญาณหนึ่งบิตเพื่อสังเกตว่าถึงตาของผู้เล่นคนใด นอกจากนี้ ปุ่มกลางจะเรียกใช้บล็อกโค้ดที่ตรวจสอบว่ามีแถวว่างที่ด้านล่างสุดจนถึงด้านบนสุดหรือไม่ จะพยายามวางเครื่องหมายในแถวที่ต่ำที่สุดที่ยังไม่ได้เติม จำไว้ว่านี่คือเกมเชื่อมต่อสี่
ในคำสั่งกรณีที่ซ้อนกันที่เรียกว่า: TurnState เราปรับเปลี่ยนสีของเคอร์เซอร์และคอลัมน์ใดในแถวแรกที่เราต้องการเปลี่ยนข้อมูลเพื่อให้กระบวนการแสดงผลสามารถสะท้อนถึงการเปลี่ยนแปลงได้
เราทำซ้ำรหัสพื้นฐานนี้สำหรับเจ็ดกรณีที่เหลือ ไดอะแกรม FSM สามารถช่วยให้เข้าใจว่าสถานะต่างๆ เปลี่ยนแปลงไปอย่างไร
ขั้นตอนที่ 5: รหัส
นี่คือรหัสการทำงานสำหรับ Connect 4 ที่สามารถคอมไพล์ใน VHDL โดยใช้ซอฟต์แวร์ Vivado
นอกจากนี้ยังมีข้อจำกัดเพื่อให้คุณเริ่มเกมได้
เราได้จัดทำบล็อกไดอะแกรมซึ่งอธิบายว่าอินพุตและเอาต์พุตของแต่ละกระบวนการเชื่อมต่อถึงกันอย่างไร
แนะนำ:
เชื่อมต่อ Magicbit ของคุณกับ Thingsboard: 3 ขั้นตอน
เชื่อมต่อ Magicbit ของคุณกับ Thingsboard: ในโครงการนี้ เราจะส่งข้อมูลจากเซ็นเซอร์ที่เชื่อมต่อกับ magicbit ซึ่งเราสามารถแสดงเป็นภาพบนกระดาน
DIY VR Treadmill- Basy3 FPGA-Digilent Contest: 3 ขั้นตอน
DIY VR Treadmill- Basys3 FPGA-Digilent Contest: คุณต้องการสร้าง VR Treadmill ซึ่งคุณสามารถเรียกใช้แอปพลิเคชันเดสก์ท็อปและเกมของคุณหรือไม่? ถ้าอย่างนั้นคุณมาถูกที่แล้ว! ในเกมทั่วไป คุณใช้เมาส์และคีย์บอร์ดเพื่อโต้ตอบกับสิ่งแวดล้อม จึงต้องส่ง
นาฬิกาจับเวลาพื้นฐานที่ใช้บอร์ด VHDL และ Basy3: 9 ขั้นตอน
นาฬิกาจับเวลาพื้นฐานโดยใช้บอร์ด VHDL และ Basy3: ยินดีต้อนรับสู่คำแนะนำเกี่ยวกับวิธีการสร้างนาฬิกาจับเวลาโดยใช้บอร์ด VHDL และ Basy 3 แบบพื้นฐาน เรารู้สึกตื่นเต้นที่จะแบ่งปันโครงการของเรากับคุณ! นี่เป็นโครงการสุดท้ายสำหรับหลักสูตร CPE 133 (Digital Design) ที่ Cal Poly, SLO ในฤดูใบไม้ร่วงปี 2016 โครงการที่เราสร้าง
เกม Mastermind ใน VHDL: 3 ขั้นตอน
เกม Mastermind ใน VHDL: สำหรับโครงการของเรา เราได้สร้าง “Mastermind” เกมใน VHDL ที่จะเล่นบนกระดาน Basy3 Mastermind เป็นเกมถอดรหัสที่เล่นโดยใช้หมุดและกระดานเกม ผู้เล่นคนหนึ่งวางหมุดคละสีในแถวละ 4
Basy3 FPGA Digital Audio Synthesizer: 5 ขั้นตอน
Basys3 FPGA Digital Audio Synthesizer: ซินธิไซเซอร์คีย์บอร์ดคลื่นไซน์ดิจิตอลนี้จะนำอินพุตของผู้ใช้ผ่านชุดสวิตช์ชั่วขณะที่วางเหมือนแป้นพิมพ์และส่งสัญญาณเสียงผ่านลำโพง ตามอินพุตของผู้ใช้ อุปกรณ์จะสร้างคลื่นไซน์ของความถี่ต่างๆ