สารบัญ:
- ขั้นตอนที่ 1: การทำงานของผู้ใช้ Digital Sequencer
- ขั้นตอนที่ 2: รายละเอียดทางเทคนิค
- ขั้นตอนที่ 3: รายละเอียดทางเทคนิค
- ขั้นตอนที่ 4: ตัวแบ่งนาฬิกา 7 ส่วน
- ขั้นตอนที่ 5: ตัวแบ่งนาฬิกาเต้นต่อนาที
- ขั้นตอนที่ 6: ตัวแบ่งนาฬิกา Pitches
- ขั้นตอนที่ 7: เล่น/หยุดชั่วคราว/เลือกสถานะเครื่อง
- ขั้นตอนที่ 8: เล่น/หยุดชั่วคราว/เลือกสถานะเครื่อง
- ขั้นตอนที่ 9: ส่งออก FSM
- ขั้นตอนที่ 10: ส่งออก FSM
- ขั้นตอนที่ 11: กำหนดหมายเหตุ
- ขั้นตอนที่ 12: เลือกเอาท์พุต
- ขั้นตอนที่ 13: Square Wave Gen
- ขั้นตอนที่ 14: การแสดงผล 7 ส่วน
- ขั้นตอนที่ 15: Final Select
- ขั้นตอนที่ 16: อุปกรณ์ภายนอก: DAC
- ขั้นตอนที่ 17: อุปกรณ์ภายนอก: ลำโพง
- ขั้นตอนที่ 18: การสาธิตวิดีโอ
- ขั้นตอนที่ 19: รหัส VHDL
วีดีโอ: 4 ขั้นตอน Digital Sequencer: 19 ขั้นตอน (พร้อมรูปภาพ)
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:07
CPE 133, แคล โพลี ซาน หลุยส์ โอบิสโป
ผู้สร้างโครงการ: Jayson Johnston และ Bjorn Nelson
ในวงการเพลงในปัจจุบัน หนึ่งใน “เครื่องดนตรี” ที่ใช้กันมากที่สุดคือเครื่องสังเคราะห์เสียงดิจิตอล ดนตรีทุกประเภทตั้งแต่ฮิปฮอปไปจนถึงป๊อปและแม้แต่เพลงคันทรี่ ใช้เครื่องสังเคราะห์เสียงดิจิตอลในสตูดิโอเพื่อสร้างจังหวะและเสียงที่พวกเขาต้องการเพื่อให้ดนตรีของพวกเขามีชีวิต ในบทช่วยสอนนี้ เราจะสร้างซินธิไซเซอร์ที่เรียบง่ายด้วยบอร์ด Basy 3 FPGA
ซินธิไซเซอร์จะสามารถเล่นโน้ตสี่ตัวที่เลือกได้ที่จำนวนครั้งต่อนาทีคงที่ ผู้ใช้จะใช้สวิตช์เพื่อกำหนดโน้ตแต่ละไตรมาสให้กับระดับเสียงดนตรี สำหรับโครงการนี้ เราใช้ตัวแปลงสัญญาณดิจิทัลเป็นอนาล็อก (DAC) 4 บิตเพื่อนำเอาท์พุตจากบอร์ดและแปลงเป็นสัญญาณแอนะล็อก เอาต์พุตจาก DAC จะถูกป้อนไปยังลำโพงคอมพิวเตอร์มาตรฐาน เพื่อสร้างเพลงของเรา สามารถแยกสนามได้สิบหกสนาม เราจะจำกัดซินธิไซเซอร์ให้เหลือเพียงเสียงคู่ 12 โน้ต ซึ่งอยู่ระหว่าง C กลาง (261.6 Hz) และ B4 (493.9 Hz) ผู้ใช้จะมีตัวเลือกในการกำหนดโน้ตหลายรายการพร้อมกัน เช่นเดียวกับการกำหนดส่วนที่เหลือด้วยการกดปุ่ม assign โดยที่ไม่มีการเลื่อนสวิตช์ระดับเสียงขึ้นด้านบน เมื่อเลือกและเล่นโน้ตแต่ละตัว โน้ตตัวอักษรจะแสดงบนจอแสดงผล 7 ส่วน เราจะใช้ปุ่มสามปุ่มบนกระดาน ปุ่มหนึ่งสำหรับเล่นและหยุดเพลง ปุ่มหนึ่งสำหรับรีเซ็ตซินธิไซเซอร์และใส่ลงในโหมด "การเลือก" และปุ่มที่สามสำหรับกำหนดระดับเสียงของโน้ตแต่ละตัวขณะอยู่ในโหมดการเลือก
เมื่อผู้ใช้พอใจกับการเลือกโน้ตแล้ว และหลังจากกดปุ่มเล่นแล้ว ซินธิไซเซอร์จะเล่นโน้ตแต่ละตัวต่อเนื่องกันซ้ำๆ จนกว่าผู้ใช้จะกดหยุดชั่วคราวหรือเลือก
นี่คือรายการอุปกรณ์ที่จำเป็น:
- Vivado (หรือพื้นที่ทำงาน VHDL ใด ๆ)
- Basys 3 หรือบอร์ด FPGA ที่คล้ายกัน
- ตัวแปลงดิจิตอลเป็นแอนะล็อก (ต่ำสุด 4 บิต)
- ลำโพงพร้อมช่องเสียบหูฟัง
- สายไฟ
ขั้นตอนที่ 1: การทำงานของผู้ใช้ Digital Sequencer
ขั้นตอนต่อไปนี้คือการใช้งานซีเควนเซอร์ดิจิตอล ซีเควนเซอร์ดิจิตอลรองรับการเล่น 12 ระดับเสียงที่แตกต่างกัน (C, Db, D, Eb, E, F, Gb, G, Ab, A, Bb, B) ซึ่งมีตั้งแต่ 261.6 Hz ถึง 493.9 Hz
1. กดปุ่มซ้ายเพื่อให้บอร์ดเข้าสู่โหมดการเลือก เมื่ออยู่ในโหมดนี้ สวิตช์ 4 ตัวทางซ้ายสุด (สวิตช์ 13 ถึง 16) แต่ละตัวจะถูกใช้เพื่อเก็บค่าพิทช์ที่แตกต่างกัน
2. ในการเลือก ให้เปิดสวิตช์ด้านซ้ายตัวใดตัวหนึ่ง จากนั้นใช้สวิตช์ด้านขวาสุด 4 ตัว (สวิตช์ 1 ถึง 4) เพื่อเลือกระดับเสียงที่ต้องการ ระดับเสียงที่สัมพันธ์กับสวิตช์ด้านขวาร่วมกันโดยเฉพาะจะแสดงบนจอแสดงผลเจ็ดส่วน และจอแสดงผลจะอัปเดตเป็นระยะห่างที่เกี่ยวข้องใหม่ทุกครั้งที่เปลี่ยนสวิตช์ด้านขวาเป็นชุดค่าผสมใหม่ ส่วนที่เหลือสามารถกำหนดได้โดยไม่เคยกำหนดระดับเสียงให้กับสวิตช์ด้านซ้ายตัวใดตัวหนึ่งหรือโดยการกำหนดระดับเสียงที่แสดงเป็น 0 บนจอแสดงผลให้กับโน้ต เมื่อพบระดับเสียงที่ต้องการและแสดงบนจอแสดงผลแล้ว ให้กดปุ่มกำหนดด้านล่างเพื่อกำหนดระดับเสียงเฉพาะนั้นให้กับโน้ต
3. ทำซ้ำขั้นตอนที่ 2 สำหรับโน้ตที่เหลืออีกสามตัว โดยพลิกสวิตช์ด้านซ้ายที่เหลือทีละตัว เลือกระดับเสียงที่เกี่ยวข้องด้วยสวิตช์ด้านขวา และกดปุ่มด้านล่างเพื่อกำหนดระดับเสียงให้กับโน้ต โน้ตหลายตัวสามารถกำหนดระดับเสียงเดียวกันได้โดยเลื่อนสวิตช์ด้านซ้ายมากกว่าหนึ่งตัวขึ้นไปพร้อมกัน
4. เมื่อกำหนดระดับเสียงโน้ตทั้งหมดแล้ว ซีเควนเซอร์ดิจิทัลก็พร้อมเล่นแล้ว หากต้องการเล่นโน้ตบนลำโพง เพียงกดปุ่มเล่น/หยุดชั่วคราวทางขวาเพื่อเริ่มเล่นเพลง ลำดับของลำดับการเล่นจะสะท้อนระดับเสียงที่เกี่ยวข้องกับสวิตช์ด้านซ้าย จากซ้ายไปขวา โน้ตจะเล่นตามจำนวนจังหวะต่อนาทีที่กำหนดไว้ในลำดับ 1, 2, 3, 4, 1, 2…. หน้าจอจะแสดงโน้ตที่กำลังเล่นอยู่ในขณะที่ลำโพงกำลังเล่นเพลง หากต้องการหยุดเล่นเพลงชั่วคราว เพียงกดปุ่มขวา จากนั้นเพลงจะหยุดเล่นและสัญลักษณ์หยุดชั่วคราวจะแสดงบนหน้าจอ การกดปุ่มขวาอีกครั้งจะเป็นการเล่นต่อ
ขั้นตอนที่ 2: รายละเอียดทางเทคนิค
ซินธิไซเซอร์ของเราใช้ประโยชน์จากส่วนประกอบดิจิทัลต่างๆ มากมาย รวมเป็นเครื่องจำกัดสถานะ รีจิสเตอร์ มัลติเพล็กเซอร์ ตัวแบ่งนาฬิกา และอื่นๆ ในการสร้างซินธิไซเซอร์ เราใช้ไฟล์โมดูลาร์ที่ไม่ซ้ำกัน 10 ไฟล์ แทนที่จะทำให้แต่ละโมดูลเป็นส่วนประกอบ เราแยกไฟล์แบบแยกส่วนตามฟังก์ชัน เป็นผลให้โมดูลส่วนใหญ่มีมากกว่าหนึ่งองค์ประกอบ โปรดทราบว่ารูปภาพด้านบนแสดงทุกบล็อกที่เชื่อมโยงกันในการออกแบบยอดนิยมของเรา
เราจะหารือเกี่ยวกับแต่ละโมดูลโดยอธิบายอินพุตและเอาต์พุต แยกส่วนประกอบ และอธิบายจุดประสงค์ในการออกแบบโดยรวม ไฟล์ ZIP จะรวมอยู่ที่ด้านล่างของคำสั่ง ซึ่งมีไฟล์โค้ด VHDL ทุกไฟล์ที่ใช้ในโปรเจ็กต์
อินพุต
- Clk (สัญญาณนาฬิกาพื้นเมือง)
- PP (เล่น/หยุดชั่วคราว)
- Sel (ใส่ซินธิไซเซอร์ในโหมดการเลือก)
- มอบหมาย (กำหนดขั้นตอนให้กับสำนวนการขาย)
- ขั้นตอน (บันทึกตำแหน่ง)
- ความถี่ (สวิตช์สร้างระดับเสียงที่ต้องการ)
ผลลัพธ์
- แอโนด (แอโนด 7 ส่วน)
- แคโทด (แคโทด 7 ส่วน)
- DAC (4 บิตขับเคลื่อน DAC)
ขั้นตอนที่ 3: รายละเอียดทางเทคนิค
ขั้นตอนที่ 4: ตัวแบ่งนาฬิกา 7 ส่วน
ซินธิไซเซอร์ของเราใช้ตัวแบ่งนาฬิกาสามตัว ซึ่งทั้งหมดสร้างสัญญาณที่มีจุดประสงค์ที่แตกต่างกันในโครงการของเรา ตัวแบ่งนาฬิกาใช้สัญญาณนาฬิกาดั้งเดิมและสร้างสัญญาณที่เปลี่ยนแปลงซึ่งมีความถี่ที่น้อยกว่าสัญญาณนาฬิกาดั้งเดิม นาฬิกาพื้นฐานของ Basys 3 คือ 100 MHz นี่คือความถี่ที่ตัวแบ่งนาฬิกาของเราใช้ หากคุณกำลังใช้บอร์ด FPGA อื่นที่มีความถี่สัญญาณนาฬิกาดั้งเดิมต่างกัน คุณอาจต้องแก้ไขโค้ด
ตัวแบ่งนาฬิกา 7 ส่วนสร้างสัญญาณที่ขับไฟล์ seg_display เราจะอธิบายว่าไฟล์นี้ทำงานอย่างไรในรายละเอียดมากขึ้นเมื่อเราไปที่ส่วน โดยพื้นฐานแล้ว ตัวแบ่งนาฬิกานี้สร้างสัญญาณ 240 Hz ที่จะใช้เพื่อสลับระหว่างแอโนดและแคโทดบนจอแสดงผล สัญญาณคือ 240 Hz เนื่องจากความถี่ที่ตามนุษย์ไม่สามารถรับรู้ถึงการไม่มีแสงคือ 60 Hz เราใช้ตัวเลขสองหลัก ดังนั้นการเพิ่มความถี่นี้เป็นสองเท่า แต่ละหลักจะสั่นที่ 60 Hz จากนั้นเราเพิ่มเป็นสองเท่าเพื่อให้ได้ 240 Hz เพราะระบบจะเปลี่ยนเมื่อสัญญาณสูงขึ้นเท่านั้นไม่ใช่เมื่อต่ำ
เพื่อให้บรรลุสิ่งนี้ ตัวแบ่งใช้สัญญาณเนทีฟ 100 MHz และนับในทุกขอบที่เพิ่มขึ้น เมื่อตัวนับถึง 416667 เอาต์พุตจะเปลี่ยนจากต่ำไปสูงหรือกลับกัน
อินพุต
Clk (สัญญาณนาฬิกาพื้นเมือง)
ผลลัพธ์
Clk_7seg (เพื่อ seg_display)
ส่วนประกอบ
- D ลงทะเบียน
- MUX
- อินเวอร์เตอร์
- แอดเดอร์
ขั้นตอนที่ 5: ตัวแบ่งนาฬิกาเต้นต่อนาที
ตัวแบ่งนาฬิกา BPM ทำงานในลักษณะเดียวกัน ตัวแบ่งนี้สร้างความถี่สัญญาณนาฬิกาซึ่งขับเคลื่อนการสลับระหว่างสี่ขั้นตอนเมื่อส่งสัญญาณเสียงในสถานะการเล่น เราตัดสินใจสลับไปมาระหว่างโน้ตที่ 100 BPM ที่ 100 BPM แต่ละโน้ตจะเล่น 3/5 วินาที สัญญาณที่ได้จะมีความถี่ 1.67 Hz
เพื่อสร้างสัญญาณความถี่นี้ เราใช้ระบบการนับอีกครั้ง แต่ครั้งนี้นับได้ 60 ล้าน ทุกครั้งที่ตัวนับแตะ 60 ล้าน สัญญาณเอาต์พุตจะสลับสูงหรือต่ำ
อินพุต
Clk (ความถี่สัญญาณนาฬิกาพื้นเมือง)
ผลลัพธ์
Clk_BPM (ถึง output_FSM)
ส่วนประกอบ
- D ลงทะเบียน
- MUX
- อินเวอร์เตอร์
- แอดเดอร์
ขั้นตอนที่ 6: ตัวแบ่งนาฬิกา Pitches
ตัวแบ่งนาฬิกา Pitches เป็นตัวแบ่งนาฬิกาที่ใหญ่ที่สุดของเรา ตัวแบ่งนี้จะส่งสัญญาณที่แตกต่างกัน 12 แบบซึ่งสอดคล้องกับโน้ต 12 ตัวที่เครื่องสังเคราะห์เสียงของเราสามารถเล่นได้ โดยใช้ความรู้พื้นฐานเกี่ยวกับทฤษฎีดนตรี เราอนุมานได้ว่าบิตหรือบัสสามารถแกว่งได้ในอัตราที่สอดคล้องกับความถี่ของโน้ตดนตรี หากต้องการดูความถี่ที่เราใช้ ดูที่นี่ เราใช้เสียงอ็อกเทฟที่สี่
ที่นี่ใช้ระบบการนับแบบเดียวกัน สำหรับค่าเฉพาะที่เรานับ โปรดดูไฟล์ชื่อ Clk_div_pitches
อินพุต
Clk (ความถี่สัญญาณนาฬิกาดั้งเดิม)
ผลลัพธ์
C, Db, D, Eb, E, F, Gb, G, Ab, A, Bb, B (เพื่อ output_select)
ส่วนประกอบ
- D ลงทะเบียน
- MUX
- อินเวอร์เตอร์
- แอดเดอร์
ขั้นตอนที่ 7: เล่น/หยุดชั่วคราว/เลือกสถานะเครื่อง
ในโครงการของเรามีเครื่องสถานะ จำกัด (FSM) สองเครื่อง FSM เป็นอุปกรณ์ลอจิกที่สามารถมีอยู่ในสถานะเดียวเท่านั้นจากจำนวนสถานะที่จำกัด การใช้ FSM วงจรดิจิทัลสามารถย้ายไปยังสถานะใหม่โดยอาศัยการรวมกันของอินพุต การใช้ตรรกะอินพุต สถานะของ FSM จะเปลี่ยนไปเมื่อมีขอบของนาฬิกาสูงขึ้น จากสถานะและอินพุตในวงจร คุณสามารถสร้างตรรกะของเอาต์พุตที่ให้เอาต์พุตที่มีอยู่ก็ต่อเมื่อ FSM อยู่ในสถานะที่แน่นอนเท่านั้น
เครื่องสถานะ PPS เป็น FSM เครื่องแรกในวงจรของเรา มีสามสถานะใน FSM นี้; โหมดเล่น หยุดชั่วคราว และการเลือก ในการเคลื่อนผ่านสถานะต่างๆ เราใช้ปุ่ม PP และปุ่ม Selection ดูแผนภาพสถานะด้านบนเพื่อดูว่าการเปลี่ยนแปลงระหว่างรัฐเกิดขึ้นได้อย่างไร เราทำการเปลี่ยนแปลง FSM นี้บนขอบที่เพิ่มขึ้นของนาฬิกา 100 MHz ดั้งเดิม เพื่อไม่ให้เครื่องไม่เปลี่ยนเมื่อกดปุ่มใดปุ่มหนึ่ง แม้จะเป็นเวลาสั้นๆ สถานะปัจจุบัน (P_state) เป็นเอาต์พุตเดียวจากโมดูลนี้
อินพุต
- Clk (ความถี่สัญญาณนาฬิกาพื้นเมือง)
- เซล (ปุ่มซ้าย)
- PP (ปุ่มขวา)
ผลลัพธ์
P_state (สถานะปัจจุบัน ถึง output_FSM, note_assign, seg_dsiplay, final_select)
ส่วนประกอบ
- MUX
- D ลงทะเบียน
ขั้นตอนที่ 8: เล่น/หยุดชั่วคราว/เลือกสถานะเครื่อง
ขั้นตอนที่ 9: ส่งออก FSM
นี่คือ FSM ที่สองที่อ้างอิงในส่วนก่อนหน้า FSM นี้ทำหน้าที่แตกต่างจากฟังก์ชันอื่น แต่พื้นฐานสำหรับฟังก์ชันนี้โดยพื้นฐานแล้วจะเหมือนกัน
เอาต์พุต FSM จะทำงานก็ต่อเมื่อสถานะปัจจุบันจาก FSM แรกคือ "01" (สถานะการเล่น) โดยพื้นฐานแล้ว นี่คือการเปิดใช้งานในโมดูล หากสถานะเป็น "01" แสดงว่า FSM จะสลับระหว่างสถานะต่างๆ บนขอบที่เพิ่มขึ้นของสัญญาณนาฬิกา BPM เราทำเช่นนี้เพราะ output_FSM ควบคุมว่าเลขฐานสองใดสำหรับพิทช์ที่เลือกจะถูกส่งไปยังโมดูล output_select และ seg_display FSM มีอินพุต 16 บิตที่มาจากโมดูลกำหนดบันทึกย่อ ซึ่งจะกล่าวถึงต่อไป ในสถานะ "00" สำหรับ output_FSM โมดูลจะส่งออก "xxxx" สำหรับโน้ตตัวแรกที่กำหนด จากนั้นใน "01" ระบบจะส่งออก "yyyy" สำหรับโน้ตที่สองและต่อไปเรื่อยๆ สำหรับแต่ละโน้ตก่อนที่จะย้อนกลับไปยังโน้ตตัวแรก ดูแผนภาพสถานะด้านบน
FSM นี้แตกต่างจากครั้งแรกเนื่องจากไม่มีตรรกะอินพุตเพื่อควบคุมการสลับระหว่างสถานะ แต่ FSM จะทำงานก็ต่อเมื่อสถานะจาก FSM แรกเป็น "01" จากนั้น FSM จะเปลี่ยนระหว่างสถานะเฉพาะบนขอบที่เพิ่มขึ้นของสัญญาณนาฬิกา ความแตกต่างอีกประการหนึ่งคือโมดูลนี้มีลอจิกเอาต์พุต ซึ่งหมายความว่าไม่ได้แสดงสถานะปัจจุบัน แต่จะส่งออกเลขฐานสองสำหรับระดับเสียงที่สถานะนั้น
อินพุต
- Clk_BPM (สัญญาณนาฬิกา BPM จากตัวแบ่งนาฬิกา)
- FSM1_state (PS จาก PPS FSM)
- Pitch_in (ระดับเสียงจาก note_assign)
ผลลัพธ์
Pitch_out (ทีละหนึ่ง pitch เพื่อ output_select และ seg_display)
ส่วนประกอบ
- MUX
- D ลงทะเบียน
ขั้นตอนที่ 10: ส่งออก FSM
ขั้นตอนที่ 11: กำหนดหมายเหตุ
โมดูลการกำหนดบันทึกย่อมีหน้าที่กำหนดระดับเสียงให้กับบันทึกตำแหน่งหรือขั้นตอน โมดูลนี้ค่อนข้างง่าย อันดับแรกจะตรวจสอบว่าวงจรอยู่ในสถานะ "การเลือก" หรือไม่ และสวิตช์แบบสเต็ป (ซ้ายสุด) สูงหรือไม่ หากเป็นจริงและกดปุ่มกำหนด เอาต์พุตของโมดูลจะเท่ากับเลขฐานสองที่แสดงโดยสวิตช์ความถี่ (ขวาสุด)
ในขั้นต้น เราได้พยายามสร้างโมดูลที่จะบันทึกสัญญาณนาฬิกาพิทช์อันใดอันหนึ่งไปยังเอาต์พุต แต่เราประสบปัญหาเกี่ยวกับเอาต์พุตที่เปลี่ยนไปตามสัญญาณนาฬิกาอินพุต นี่เป็นโมดูลเดียวที่ใช้มากกว่าหนึ่งครั้งในการออกแบบขั้นสุดท้าย ทุกขั้นตอนมีโมดูล note_assign ที่เกี่ยวข้อง และด้วยเหตุนั้น แต่ละอินสแตนซ์ของโมดูลจึงได้รับบัสขั้นตอนหนึ่งบิต
อินพุต
- P_state (สถานะปัจจุบันจาก PPS FSM)
- เซล (ปุ่มซ้าย)
- สวิตช์ (สวิตช์ขั้นตอนเดียว)
- ความถี่ (สวิตช์ขวาสุดสำหรับระดับเสียง)
- กำหนด (ปุ่มด้านล่าง กำหนดโน้ต)
ผลลัพธ์
ระดับเสียง (เลขฐานสอง ไปยัง output_FSM)
ส่วนประกอบ
- MUX
- D ลงทะเบียน
ขั้นตอนที่ 12: เลือกเอาท์พุต
การเลือกเอาต์พุตมีหน้าที่รับเลขฐานสองสำหรับระดับเสียงและเชื่อมต่อกับสัญญาณนาฬิกาตามลำดับ แม้จะมีขนาดของมัน แต่ก็เป็นโมดูลที่ค่อนข้างง่าย Output_select เป็นตัวถอดรหัสไบนารีโดยพื้นฐานแล้วถอดรหัสเลขฐานสองสำหรับระดับเสียงเป็นสัญญาณนาฬิกาเฉพาะ จริงๆ แล้ว การกำหนดเอาต์พุตให้กับความถี่สัญญาณนาฬิกาทำงานได้ดีกว่าเมื่อเปรียบเทียบกับโมดูล note_assign เนื่องจากโมดูลทั้งหมดนี้ต้องทำคือ MUX สัญญาณนาฬิกาที่มีเลขฐานสองแทนอินพุตควบคุม
เราขออภัยในการกำหนดเส้นทางที่แปลก Vivado ได้จัดสัญญาณระดับเสียงตามตัวอักษรสำหรับไฟล์ clk_div_pitches แต่สำหรับไฟล์นี้ มีการจัดระเบียบโดยการเพิ่มเลขฐานสอง ทำให้ระดับเสียงอยู่ในลำดับที่ต่างออกไป นอกจากนี้ โปรดทราบด้วยว่าหากเลขฐานสองจาก output_FSM คือ "0000" หรือมากกว่า "1100" ดังนั้น MUX จะส่งผ่านสัญญาณ '0' แบบแบน
ป้อนข้อมูล
- ระดับเสียง (จาก output_FSM);
- C, Db, D, Eb, E, F, Gb, G, Ab, A, Bb, B (สัญญาณนาฬิกาพิทช์)
เอาท์พุต
โทน (บิตเดียวที่ตรงกับสัญญาณนาฬิกาที่เลือก ถึง square_wave)
ส่วนประกอบ
MUX
ขั้นตอนที่ 13: Square Wave Gen
โมดูล square_wave เป็นเครื่องกำเนิดคลื่นสี่เหลี่ยมที่ส่งออกจากบอร์ดไปยัง DAC การใช้สัญญาณโทนจากไฟล์ก่อนหน้า square_wave นี้จะแปลงตัวเลข 4 บิตระหว่าง "0000" และ "1111" บนขอบที่เพิ่มขึ้นของ Tone โทนคือความถี่พิทช์เฉพาะ ดังนั้น square_wave จะสร้างคลื่นที่มีความถี่ต่างกันเมื่อ output_FSM เปลี่ยนเป็นสถานะอื่น เอาต์พุต 4 บิตจากโมดูลนี้ไปที่โมดูล fin_sel โดยที่ลอจิกกำหนดว่าบัสนี้จะถูกเอาต์พุตตามสถานะจาก PPS FSM หรือไม่
อีกทางเลือกหนึ่งสำหรับเครื่องกำเนิดคลื่นสี่เหลี่ยมนี้คือการสร้างคลื่นไซน์ แม้ว่าสิ่งนี้จะทำให้โทนเสียงสุดท้ายดีขึ้น แต่ก็ยากกว่ามากที่จะนำไปใช้ ดังนั้นเราจึงเลือกที่จะสร้างคลื่นสี่เหลี่ยม
อินพุต
โทน (บิตสั่นจาก output_select)
ผลลัพธ์
DAC_input (บัส 4 บิตสั่นที่เปลี่ยนที่ความถี่เสียงเดียวกัน)
ส่วนประกอบ
- อินเวอร์เตอร์
- D ลงทะเบียน
ขั้นตอนที่ 14: การแสดงผล 7 ส่วน
โมดูล seg_display ควบคุมการแสดงผล 7 ส่วนบนบอร์ดพื้นฐานของเรา ภายในโมดูล สองกระบวนการเกิดขึ้น กระบวนการแรกจะถอดรหัส Freq เมื่ออยู่ในสถานะ "selection" หรือ Pitch เมื่ออยู่ในโหมด "play" ในโหมด "หยุดชั่วคราว" โมดูลจะถอดรหัสเพื่อแสดงสัญลักษณ์หยุดชั่วคราว เมื่อดูโค้ด VHDL คุณจะเห็นว่าตัวถอดรหัสไบนารีจริง ๆ แล้วถอดรหัสอินพุตเป็นสัญญาณที่แตกต่างกันสองแบบคือ cathode1 และ cathode2 Cathode1 แทนตัวอักษรที่สอดคล้องกับ pitch ที่จะแสดง และ cathode2 แสดงถึงสัญลักษณ์แบบแบน (b) หากมี เหตุผลนี้เกี่ยวข้องกับกระบวนการที่สองที่ทำโดยโมดูล seg_display
บนกระดาน Basy3 จอแสดงผลเซ็กเมนต์มีแคโทดทั่วไป ในขณะที่แอโนดควบคุมว่าเปิดตัวเลขใด แคโทดจะควบคุมว่าเซ็กเมนต์ใดเปิดอยู่ เนื่องจากจอแสดงผลมีแคโทดร่วม ซึ่งหมายความว่าคุณสามารถแสดงกลุ่มได้ครั้งละหนึ่งชุดเท่านั้น นั่นทำให้เกิดปัญหาสำหรับโครงการนี้เพราะเราต้องการแสดงตัวอักษรที่หลักแรกและสัญลักษณ์แบนพร้อมกัน หากจำเป็น ตอนนี้จำสัญญาณนาฬิกา 7seg ได้หรือไม่? เพื่อแก้ไขปัญหานี้ เราเปลี่ยนแอโนดและแคโทดไปมาบนสัญญาณนาฬิกา 7seg เนื่องจากสัญญาณนาฬิกาคือ 240 Hz และเราใช้ตัวเลขสองหลัก แต่ละหลักจะแกว่งที่ 60 Hz ในสายตามนุษย์จะดูเหมือนตัวเลขไม่สั่นเลย
โปรดทราบด้วยว่าการแสดงผลของบอร์ด Basy3 ใช้ตรรกะเชิงลบ ซึ่งหมายความว่าหากตั้งค่าแอโนดหรือแคโทดเป็น '0' ตัวเลขหรือเซ็กเมนต์นั้นจะเปิดอยู่ และในทางกลับกัน
อินพุต
- ระดับเสียง (เลขฐานสองสำหรับโน้ต ใช้ในสถานะการเล่น)
- ความถี่ (สวิตช์ความถี่ ใช้เมื่ออยู่ในสถานะการเลือก)
- P_state (สถานะปัจจุบันจาก PPS FSM)
- Clk_240Hz (สัญญาณนาฬิกาจาก Clk_div_7seg, double 120 เพราะเราใช้ขอบที่เพิ่มขึ้นเท่านั้น)
ผลลัพธ์
- แคโทด (บัสที่ควบคุมส่วนต่างๆ บนจอแสดงผล เอาต์พุตสุดท้าย)
- แอโนด (บัสที่ควบคุมตัวเลขบนจอแสดงผล, เอาต์พุตสุดท้าย)
ส่วนประกอบ
- สลัก
- MUX
- D ลงทะเบียน
ขั้นตอนที่ 15: Final Select
Final select เป็นโมดูลสุดท้ายที่ใช้ในโครงการนี้ โมดูลง่ายๆ อีกโมดูลหนึ่งคือโมดูลนี้ควบคุมเอาต์พุตสุดท้ายที่จะไปที่ DAC เมื่ออยู่ในสถานะ "การเลือก" หรือ "หยุดชั่วคราว" โมดูลจะส่งเสียง "0000" แบบคงที่เพื่อไม่ให้เล่นเพลงจากลำโพง ในสถานะ "เล่น" โมดูลจะส่งสัญญาณ 4 บิตที่สั่นตามที่กำหนดโดย square_wave
อินพุต
- P_state (สถานะปัจจุบันจาก PPS FSM)
- DAC_input (การสั่น 4 บิตจาก square_wave)
ผลลัพธ์
DAC (เท่ากับ DAC_input ในสถานะการเล่น เอาต์พุตสุดท้าย)
ส่วนประกอบ
MUX
ขั้นตอนที่ 16: อุปกรณ์ภายนอก: DAC
ตัวแปลงดิจิทัลเป็นแอนะล็อก (DAC) ใช้สัญญาณที่ไม่ต่อเนื่องและแปลงเป็นสัญญาณต่อเนื่อง DAC ของเรามีสี่บิตและทำจากแอมพลิฟายเออร์รวม ด้วยการใช้อัตราส่วนของตัวต้านทานในวงจรการจ่ายและป้อนกลับ เราจึงสามารถสร้างระบบที่ส่งเอาต์พุตที่ระดับต่างๆ 16 ระดับ โดยสร้าง "ผลรวม" ของแต่ละสาขา Bit0 กิ่งบนสุด มีน้ำหนักน้อยที่สุดและมีศักยภาพน้อยที่สุดเมื่อสูงเพราะกิ่งนั้นมีความต้านทานสูงกว่า น้ำหนักเพิ่มขึ้นเมื่อคุณลงไปตามกิ่งก้าน หากคุณต้องนับเลขฐานสองขึ้นแล้วถอยหลังโดยใช้อินพุตบิต แรงดันเอาต์พุตจะดูเหมือนคลื่นไซน์แบบขั้นตอน อินพุตไปยัง DAC เชื่อมต่อกับ PMOD ตัวใดตัวหนึ่งบนบอร์ดเพื่อถ่ายโอนสัญญาณ 4 บิต
เดิม DAC ถูกประกอบขึ้นสำหรับชั้นเรียนวิศวกรรมไฟฟ้า และได้รับการออกแบบและบัดกรีโดยเรา ไม่ได้ซื้อจากร้านค้า ด้านบนเป็นรูปภาพของไฟล์ออกแบบสำหรับสร้างแผงวงจรพิมพ์
ขั้นตอนที่ 17: อุปกรณ์ภายนอก: ลำโพง
สำหรับโครงการนี้ คุณจะไม่อยากซื้อลำโพงดีๆ สักตัว อย่างที่คุณบอกได้ เสียงนั้นค่อนข้างธรรมดา เราไปซื้อลำโพงคอมพิวเตอร์ราคา 8 ดอลลาร์จาก Best Buy อะไรก็ตามที่มีแจ็คหูฟังก็ใช้งานได้ดี เสียงเดียวทำงานได้ดีเช่นกัน คุณสามารถใช้หูฟังได้ แต่อาจทำให้หูฟังพังได้!
ในการเชื่อมต่อเอาท์พุตของ DAC กับลำโพง เราใช้สายจัมเปอร์ จากนั้นจับสายเคเบิลเอาท์พุตไว้ที่ปลายแจ็คหูฟังและต่อสายกราวด์กับฐาน เราลองใช้เทปพันสายไฟเพื่อยึดสายเคเบิลไว้กับที่ แต่ก็ทำให้เกิดการรบกวนได้มาก การลองใช้เทปรูปแบบอื่นสามารถแก้ปัญหานี้ได้
สำหรับลำโพงของเรา เราปรับให้เป็นการตั้งค่าสูงสุดและได้เสียงที่ดังพอสมควร
และนั่นคือขั้นตอนสุดท้ายสำหรับการสร้างซีเควนเซอร์ดิจิทัลจากบอร์ด FPGA! ไปที่สองส่วนถัดไปเพื่อดาวน์โหลดโค้ด VHDL ทั้งหมดของเราและดูซีเควนเซอร์ในการดำเนินการ
ขั้นตอนที่ 18: การสาธิตวิดีโอ
วิดีโอนี้แสดงเวอร์ชันสุดท้ายของโปรเจ็กต์การทำงาน รวมถึงกระบวนการกำหนดสวิตช์ให้กับระดับเสียงที่แตกต่างกัน 4 ระดับ และลำโพงที่เล่นโน้ตตามลำดับ
ขั้นตอนที่ 19: รหัส VHDL
นี่คือรหัสสำหรับทั้งโปรเจ็กต์ รวมถึงข้อจำกัดและไฟล์ซิมที่ใช้ขณะสร้างซีเควนเซอร์ โปรดทราบว่าไฟล์การออกแบบที่ไม่ได้ใช้พูดอย่างนั้นในสถาปัตยกรรม
แนะนำ:
Arduino MIDI Rhythm Section Sequencer: 8 ขั้นตอน (พร้อมรูปภาพ)
Arduino MIDI Rhythm Section Sequencer: การมีเครื่องดรัมแมชชีนซอฟต์แวร์ที่ดีเป็นเรื่องง่ายและราคาถูกในวันนี้ แต่การใช้เมาส์ทำให้ความสนุกหายไปสำหรับฉัน นี่คือเหตุผลที่ฉันตระหนักว่าสิ่งที่ตั้งใจไว้ตั้งแต่แรกเป็น 64 ขั้นตอนฮาร์ดแวร์ MIDI ซีเควนเซอร์กลองที่สามารถเรียกองค์ประกอบกลองที่แตกต่างกันได้ถึง 12 แบบ
Parallel Sequencer Synth: 17 ขั้นตอน (พร้อมรูปภาพ)
Parallel Sequencer Synth: นี่คือคำแนะนำสำหรับการสร้างซีเควนเซอร์อย่างง่าย ซีเควนเซอร์เป็นอุปกรณ์ที่สร้างชุดของขั้นตอนแบบวนรอบซึ่งจะขับเคลื่อนออสซิลเลเตอร์ แต่ละขั้นตอนสามารถกำหนดโทนเสียงที่แตกต่างกัน และสร้างลำดับหรือเอฟเฟกต์เสียงที่น่าสนใจ
Simple Sequencer: 16 ขั้นตอน (พร้อมรูปภาพ)
Simple Sequencer: หนึ่งในกุญแจสำคัญในการสร้างดนตรีที่ดีคือการทำซ้ำๆ นั่นคือสิ่งที่ซีเควนเซอร์ธรรมดาทำได้ดี มันทำสิ่งเดียวกันซ้ำแล้วซ้ำอีกในลำดับโน้ตแปดตัว คุณสามารถปรับความถี่ของโน้ต ระยะเวลาของโน้ต และ
Atari Punk Console กับ Baby 8 Step Sequencer: 7 ขั้นตอน (พร้อมรูปภาพ)
Atari Punk Console พร้อมซีเควนเซอร์ Baby 8 ขั้นตอน: โครงสร้างระดับกลางนี้เป็น Atari Punk Console แบบ all-in-one และ Baby 8 Step Sequencer ที่คุณสามารถกัดได้บนเครื่องกัด PCB Bantam Tools Desktop ประกอบด้วยแผงวงจรสองแผ่น อันแรกคือบอร์ดอินเทอร์เฟซผู้ใช้ (UI) และอีกอันคือบอร์ดยูทิลิตี้
Light Sequencer โดยใช้ Assembly & Microchip PIC16F690: 3 ขั้นตอน
Light Sequencer โดยใช้ Assembly & Microchip PIC16F690: จุดประสงค์ของโครงการนี้คือการสร้าง Light Sequencer เพื่อทดสอบความเร็วปฏิกิริยาของผู้เล่น อินเทอร์เฟซผู้ใช้ของซีเควนเซอร์ไฟนี้ประกอบด้วยไฟ LED 8 ดวงและปุ่มหนึ่งปุ่ม ทางด้านเทคนิค เราจะส่งรหัสที่เขียนด้วยภาษาแอสเซมบลี