สารบัญ:

4 ขั้นตอน Digital Sequencer: 19 ขั้นตอน (พร้อมรูปภาพ)
4 ขั้นตอน Digital Sequencer: 19 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: 4 ขั้นตอน Digital Sequencer: 19 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: 4 ขั้นตอน Digital Sequencer: 19 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: Designing a simple 5-step sequencer from scratch 2024, กันยายน
Anonim
4 ขั้นตอนดิจิตอลซีเควนเซอร์
4 ขั้นตอนดิจิตอลซีเควนเซอร์
4 ขั้นตอนดิจิตอลซีเควนเซอร์
4 ขั้นตอนดิจิตอลซีเควนเซอร์

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

การทำงานของผู้ใช้ Digital Sequencer
การทำงานของผู้ใช้ 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 ส่วน

ตัวแบ่งนาฬิกา 7 ส่วน
ตัวแบ่งนาฬิกา 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 นี้ทำหน้าที่แตกต่างจากฟังก์ชันอื่น แต่พื้นฐานสำหรับฟังก์ชันนี้โดยพื้นฐานแล้วจะเหมือนกัน

เอาต์พุต 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

เอาต์พุตFSM
เอาต์พุต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 Gen
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 ส่วน

จอแสดงผล 7 ส่วน
จอแสดงผล 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
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

ตัวแปลงดิจิทัลเป็นแอนะล็อก (DAC) ใช้สัญญาณที่ไม่ต่อเนื่องและแปลงเป็นสัญญาณต่อเนื่อง DAC ของเรามีสี่บิตและทำจากแอมพลิฟายเออร์รวม ด้วยการใช้อัตราส่วนของตัวต้านทานในวงจรการจ่ายและป้อนกลับ เราจึงสามารถสร้างระบบที่ส่งเอาต์พุตที่ระดับต่างๆ 16 ระดับ โดยสร้าง "ผลรวม" ของแต่ละสาขา Bit0 กิ่งบนสุด มีน้ำหนักน้อยที่สุดและมีศักยภาพน้อยที่สุดเมื่อสูงเพราะกิ่งนั้นมีความต้านทานสูงกว่า น้ำหนักเพิ่มขึ้นเมื่อคุณลงไปตามกิ่งก้าน หากคุณต้องนับเลขฐานสองขึ้นแล้วถอยหลังโดยใช้อินพุตบิต แรงดันเอาต์พุตจะดูเหมือนคลื่นไซน์แบบขั้นตอน อินพุตไปยัง DAC เชื่อมต่อกับ PMOD ตัวใดตัวหนึ่งบนบอร์ดเพื่อถ่ายโอนสัญญาณ 4 บิต

เดิม DAC ถูกประกอบขึ้นสำหรับชั้นเรียนวิศวกรรมไฟฟ้า และได้รับการออกแบบและบัดกรีโดยเรา ไม่ได้ซื้อจากร้านค้า ด้านบนเป็นรูปภาพของไฟล์ออกแบบสำหรับสร้างแผงวงจรพิมพ์

ขั้นตอนที่ 17: อุปกรณ์ภายนอก: ลำโพง

อุปกรณ์ภายนอก: ลำโพง
อุปกรณ์ภายนอก: ลำโพง

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

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

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

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

ขั้นตอนที่ 18: การสาธิตวิดีโอ

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

ขั้นตอนที่ 19: รหัส VHDL

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

แนะนำ: