Оглавление:

4-шаговый цифровой секвенсор: 19 шагов (с изображениями)
4-шаговый цифровой секвенсор: 19 шагов (с изображениями)

Видео: 4-шаговый цифровой секвенсор: 19 шагов (с изображениями)

Видео: 4-шаговый цифровой секвенсор: 19 шагов (с изображениями)
Видео: Korg Volca FM Tutorial на русском | Полный разбор | LE-NA 2024, Июль
Anonim
4-х ступенчатый цифровой секвенсор
4-х ступенчатый цифровой секвенсор
4-х ступенчатый цифровой секвенсор
4-х ступенчатый цифровой секвенсор

CPE 133, Калифорнийский политехнический университет Сан-Луис-Обиспо

Создатели проекта: Джейсон Джонстон и Бьорн Нельсон

В современной музыкальной индустрии одним из наиболее часто используемых «инструментов» является цифровой синтезатор. Каждый музыкальный жанр, от хип-хопа до поп-музыки и даже кантри, использует в студии цифровой синтезатор для создания битов и звуков, необходимых для воплощения своей музыки в жизнь. В этом уроке мы создадим очень простой синтезатор на плате Basys 3 FPGA.

Синтезатор сможет играть четыре выбранные четвертные ноты с постоянным числом ударов в минуту. Пользователи будут использовать переключатели, чтобы назначить каждую четвертную ноту музыкальной высоте звука. В этом проекте мы используем 4-битный цифро-аналоговый преобразователь (ЦАП) для преобразования выходного сигнала платы в аналоговый сигнал. Затем выходной сигнал ЦАП будет поступать на стандартный компьютерный динамик, создавая нашу музыку. Возможны шестнадцать дискретных шагов. Мы ограничим наш синтезатор одной октавой из 12 нот, которые находятся между средним C (261,6 Гц) и B4 (493,9 Гц). Пользователь также будет иметь возможность назначать несколько нот одновременно, а также назначать паузу, нажимая назначить, при этом ни один из переключателей высоты тона не смещен вверх. При выборе и воспроизведении каждой ноты буква отображается на 7-сегментном дисплее. Мы также будем использовать три кнопки на плате: одну для воспроизведения и приостановки музыки, одну для сброса синтезатора и перевода его в режим «выбора», а третью - для назначения каждой ноте высоты звука в режиме выбора.

Как только пользователь будет удовлетворен своим выбором нот и после нажатия кнопки воспроизведения, синтезатор будет воспроизводить каждую ноту последовательно несколько раз, пока пользователь не нажмет паузу или не выберет.

Вот список необходимого оборудования:

  • Vivado (или любое рабочее пространство VHDL)
  • Плата Basys 3 или аналогичная FPGA
  • Цифро-аналоговый преобразователь (мин. 4 бита)
  • Динамик с разъемом для наушников
  • Проволочные выводы

Шаг 1. Использование цифрового секвенсора пользователем

Работа пользователя с цифровым секвенсором
Работа пользователя с цифровым секвенсором

Следующие шаги предназначены для работы с цифровым секвенсором. Цифровой секвенсор поддерживает воспроизведение 12 различных звуков (C, Db, D, Eb, E, F, Gb, G, Ab, A, Bb, B) в диапазоне от 261,6 Гц до 493,9 Гц.

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 (перевести синтезатор в режим выбора)
  • Назначить (назначить шаг шагу)
  • Шаг (позиционные ноты)
  • Freq (переключатели, создающие желаемую высоту тона)

Выходы

  • Анод (7-сегментные аноды)
  • Катод (7-сегментные катоды)
  • ЦАП (4-битное управление ЦАП)

Шаг 3. Технические подробности

Технические подробности
Технические подробности

Шаг 4: 7-сегментный делитель тактовой частоты

7-сегментный делитель тактовой частоты
7-сегментный делитель тактовой частоты

В нашем синтезаторе используются три делителя тактовой частоты, каждый из которых производит сигналы, которые служат разным целям в нашем проекте. Делитель тактовой частоты принимает собственный тактовый сигнал и выдает измененный сигнал, частота которого меньше исходного тактового сигнала. Собственная частота Basys 3 составляет 100 МГц. Это частота, которую используют наши делители тактовой частоты. Если вы используете другую плату FPGA с другой собственной тактовой частотой, вам, возможно, придется изменить код.

7-сегментный делитель тактовой частоты выдает сигнал, который управляет файлом seg_display. Мы объясним, как этот файл работает более подробно, когда перейдем к его разделу. По сути, этот делитель тактовой частоты выдает сигнал 240 Гц, который будет использоваться для переключения между анодами и катодами на дисплее. Сигнал составляет 240 Гц, потому что частота, при которой человеческий глаз не может распознать отсутствие света, составляет 60 Гц. Мы используем две цифры, поэтому, удвоив эту частоту, каждая цифра будет колебаться с частотой 60 Гц. Затем мы удваиваем его, чтобы получить 240 Гц, потому что система меняется только тогда, когда сигнал становится высоким, а не когда он становится низким.

Для этого делитель принимает исходный сигнал 100 МГц и ведет счет на каждом нарастающем фронте. Когда счетчик достигнет 416667, выходной сигнал изменится с низкого на высокий или наоборот.

Входы

Clk (собственный тактовый сигнал)

Выходы

Clk_7seg (для seg_display)

Компоненты

  • Регистр D
  • MUX
  • Инвертор
  • Сумматор

Шаг 5: делитель частоты ударов в минуту

Делитель частоты ударов в минуту
Делитель частоты ударов в минуту

Делитель тактовой частоты BPM работает аналогичным образом. Этот делитель вырабатывает тактовую частоту, которая управляет переключением между четырьмя шагами при выводе тонов в состоянии воспроизведения. Мы решили переключаться между нотами со скоростью 100 ударов в минуту. При 100 ударах в минуту каждая нота будет воспроизводиться 3/5 секунды. Результирующий сигнал будет иметь частоту 1,67 Гц.

Чтобы получить сигнал этой частоты, мы снова использовали счетную систему, но на этот раз счет составил 60 миллионов. Каждый раз, когда счетчик достигает 60 миллионов, выходной сигнал переключается на высокий или низкий.

Входы

Clk (собственная тактовая частота)

Выходы

Clk_BPM (к output_FSM)

Компоненты

  • Регистр D
  • MUX
  • Инвертор
  • Сумматор

Шаг 6: делитель тактовой частоты

Шаги тактового делителя
Шаги тактового делителя

Делитель Pitches Clock Divider - самый большой из наших делителей времени. Этот делитель выводит 12 различных сигналов, соответствующих 12 различным нотам, которые может воспроизводить наш синтезатор. Используя базовые знания теории музыки, мы пришли к выводу, что бит или шина могут колебаться со скоростью, соответствующей частоте музыкальных нот. Чтобы увидеть используемые частоты, посмотрите здесь. Мы использовали четвертую октаву высоты тона.

Здесь используется та же система подсчета. Конкретные значения, которые мы подсчитали, см. В файле Clk_div_pitches.

Входы

Clk (собственная тактовая частота)

Выходы

C, Db, D, Eb, E, F, Gb, G, Ab, A, Bb, B (для output_select)

Компоненты

  • Регистр D
  • MUX
  • Инвертор
  • Сумматор

Шаг 7: воспроизведение / пауза / выбор конечного автомата

Воспроизведение / пауза / выбор конечного автомата
Воспроизведение / пауза / выбор конечного автомата

В нашем проекте есть два конечных автомата (FSM). Автомат - это логическое устройство, которое может существовать только в одном состоянии из конечного количества состояний. Используя автомат, цифровая схема может перейти в новое состояние на основе комбинации входов. Используя входную логику, состояние конечного автомата будет изменяться при нарастании фронта тактового сигнала. Из состояния и входов в схему вы можете создать логику вывода, которая дает выходы, которые существуют только в том случае, если конечный автомат находится в определенном состоянии.

Конечный автомат PPS - это первый автомат в нашей схеме. В этом автомате есть три состояния; Режимы воспроизведения, паузы и выбора. Для перемещения по различным состояниям мы использовали кнопки PP и Selection. См. Диаграмму состояний выше, чтобы увидеть, как происходят переходы между состояниями. Мы сделали этот переход FSM по нарастающему фронту собственной тактовой частоты 100 МГц, чтобы машина не могла не переключиться при нажатии одной из кнопок даже в течение очень короткого промежутка времени. Текущее состояние (P_state) - единственный вывод этого модуля.

Входы

  • Clk (собственная тактовая частота)
  • Sel (левая кнопка)
  • ПП (правая кнопка)

Выходы

P_state (текущее состояние, to output_FSM, note_assign, seg_dsiplay, final_select)

Компоненты

  • MUX
  • Регистр D

Шаг 8: воспроизведение / пауза / выбор конечного автомата

Воспроизведение / пауза / выбор конечного автомата
Воспроизведение / пауза / выбор конечного автомата

Шаг 9: вывод конечного автомата

Выходной автомат
Выходной автомат

Это второй конечный автомат, упомянутый в предыдущем разделе. Этот автомат выполняет другую функцию, чем другой, но основа для этого по существу та же.

Выходной автомат работает только в том случае, если текущее состояние из первого конечного автомата равно «01» (состояние воспроизведения). По сути, это включение модуля. Если состояние «01», то конечный автомат будет переключаться между состояниями по нарастающему фронту тактового сигнала BPM. Мы делаем это, потому что output_FSM контролирует, какое двоичное число для выбранного шага будет отправлено в модули output_select и seg_display. FSM имеет 16-битный вход, поступающий от модуля назначения нот, который будет рассмотрен далее. В состоянии «00» для output_FSM модуль выведет «xxxx» для первой назначенной ноты. Затем в «01» он будет выводить «yyyy» для второй ноты и так далее для каждой ноты, прежде чем вернуться к первой заметке. См. Диаграмму состояний выше.

Этот конечный автомат отличается от первого тем, что в нем нет входной логики для управления переключением между состояниями. Вместо этого конечный автомат будет работать только тогда, когда состояние первого конечного автомата равно «01», а затем этот конечный автомат будет переходить между состояниями только по нарастающему фронту тактового сигнала. Другое отличие состоит в том, что этот модуль имеет логику вывода, то есть он не выводит текущее состояние, а выводит двоичное число для высоты тона в этом состоянии.

Входы

  • Clk_BPM (тактовый сигнал BPM от тактового делителя)
  • FSM1_state (PS из PPS FSM)
  • Pitch_in (высота звука из note_assign)

Выходы

Pitch_out (по одному шагу, для output_select и seg_display)

Компоненты

  • MUX
  • Регистр D

Шаг 10: вывод конечного автомата

Выходной автомат
Выходной автомат

Шаг 11: Назначение нот

Заметка Назначить
Заметка Назначить

Модуль назначения нот отвечает за фактическое назначение высоты тона позиционной ноте или шагу. Этот модуль на самом деле довольно простой. Сначала он проверяет, находится ли схема в состоянии «выбора» и находится ли ступенчатый переключатель (крайний слева) в высоком положении. Если это так и нажата кнопка назначения, выходной сигнал модуля будет равен двоичному числу, представленному переключателями частоты (крайний справа).

Первоначально мы пытались создать модуль, который фактически сохранял бы один из сигналов тактовой частоты основного тона на выходе, но у нас возникли проблемы с изменением выхода в соответствии с входными тактовыми сигналами. Это единственный модуль, который использовался более одного раза в окончательном дизайне. С каждым шагом связан модуль note_assign, и поэтому каждый экземпляр модуля получает один бит шины Step.

Входы

  • P_state (текущее состояние из PPS FSM)
  • Sel (левая кнопка)
  • Переключатель (одноступенчатый переключатель)
  • Freq (крайние правые переключатели для высоты тона)
  • Назначить (нижняя кнопка, назначает примечание)

Выходы

Шаг (двоичное число, to output_FSM)

Компоненты

  • MUX
  • D resgister

Шаг 12: выбор выхода

Выбор выхода
Выбор выхода

Выбор выхода отвечает за принятие двоичного числа для высоты звука и подключение его к соответствующему тактовому сигналу. Несмотря на свои размеры, это также относительно простой модуль. Output_select - это, по сути, двоичный декодер, декодирующий двоичное число высоты тона для определенного тактового сигнала. На самом деле назначение выхода на тактовую частоту работало здесь лучше по сравнению с модулем note_assign, потому что все, что нужно было сделать этому модулю, - это мультиплексировать тактовые сигналы с двоичным числом, представляющим управляющий вход.

Приносим свои извинения за странную маршрутизацию, Vivado организовал сигналы высоты тона в алфавитном порядке для файла clk_div_pitches, но для этого файла он организовал их по возрастанию двоичного числа, в результате чего высота тона была в другом порядке. Также обратите внимание, что если двоичное число из output_FSM было «0000» или что-то большее, чем «1100», то мультиплексор отправил через плоский сигнал «0».

Вход

  • Шаг (из output_FSM);
  • C, Db, D, Eb, E, F, Gb, G, Ab, A, Bb, B (сигналы тактовой частоты)

Выход

Тон (один бит, который соответствует выбранному тактовому сигналу, в square_wave)

Компоненты

MUX

Шаг 13: Генерация прямоугольной волны

Генератор прямоугольной волны
Генератор прямоугольной волны

Модуль square_wave - это генератор прямоугольной волны, которая выводится с платы на ЦАП. Используя тональный сигнал из предыдущего файла, эта square_wave инвертирует 4-битное число между «0000» и «1111» на переднем фронте тона. Тон - это определенная частота основного тона, поэтому square_wave создает волну с другой частотой, когда output_FSM переходит в другое состояние. 4-битный вывод этого модуля поступает в модуль fin_sel, где логика определяет, будет ли эта шина выводиться на основе состояния из PPS FSM.

Альтернативой этому генератору прямоугольных сигналов является синусоидальная волна. Хотя это, скорее всего, даст лучший финальный тон, это значительно сложнее реализовать, поэтому мы решили просто генерировать прямоугольную волну.

Входы

Тон (колеблющийся бит из output_select)

Выходы

DAC_input (осциллирующая 4-битная шина, которая изменяется с той же частотой тона)

Компоненты

  • Инвертор
  • Регистр D

Шаг 14: 7-сегментный дисплей

7-сегментный дисплей
7-сегментный дисплей

Модуль seg_display управляет 7-сегментным дисплеем на нашей основной плате. Внутри модуля происходят два процесса. Первый процесс декодирует Freq в состоянии «выбора» или Pitch в режиме «воспроизведения». В режиме «пауза» модуль декодирует, чтобы показать символ паузы. Глядя на код VHDL, вы можете видеть, что двоичный декодер фактически декодирует вход в два разных сигнала: cathode1 и cathode2. Катод1 представляет букву, соответствующую отображаемому шагу, а катод2 представляет плоский символ (b), если он есть. Причина этого связана со вторым процессом, выполняемым модулем seg_display.

На плате basys3 сегментный дисплей имеет общие катоды. В то время как аноды контролируют, какая цифра включена, катоды контролируют, какие сегменты включены. Поскольку дисплей имеет общие катоды, это означает, что вы можете отображать только один набор сегментов за раз. Это создает проблему для этого проекта, потому что мы хотим отображать букву на первой цифре и плоский символ, если необходимо, одновременно. Теперь помните тактовый сигнал 7seg? Чтобы обойти эту проблему, мы меняем аноды и катоды взад и вперед по тактовому сигналу 7seg. Поскольку тактовый сигнал составляет 240 Гц, а мы используем две цифры, каждая цифра будет колебаться с частотой 60 Гц. Человеческому глазу это будет выглядеть так, как будто цифры вообще не колеблются.

Также обратите внимание, что дисплей платы basys3 использует отрицательную логику. Это означает, что если для анода или катода установлено значение «0», эта цифра или сегмент будут включены, и наоборот.

Входы

  • Высота (двоичное число для ноты, используется в состоянии воспроизведения)
  • Freq (переключатели частоты, используются в состоянии выбора)
  • P_state (текущее состояние из PPS FSM)
  • Clk_240Hz (тактовый сигнал от Clk_div_7seg, удвоение 120, потому что мы используем только нарастающий фронт)

Выходы

  • Катод (шина, управляющая сегментами на дисплее, конечный вывод)
  • Анод (шина, которая управляет цифрами на дисплее, конечный вывод)

Компоненты

  • Защелка
  • MUX
  • Регистр D

Шаг 15: окончательный выбор

Окончательный выбор
Окончательный выбор

Окончательный выбор - это последний модуль, использованный в этом проекте. Другой простой модуль, этот модуль управляет конечным выходом, который будет идти на ЦАП. В состоянии «выбор» или «пауза» модуль будет выводить статическое «0000», так что из динамиков не будет воспроизводиться музыка. В состоянии "play" модуль будет выводить колеблющиеся 4 бита, как определено square_wave.

Входы

  • P_state (текущее состояние из PPS FSM)
  • DAC_input (колеблющиеся 4 бита от square_wave)

Выходы

DAC (равно DAC_input в состоянии воспроизведения, конечный выход)

Компоненты

MUX

Шаг 16: Внешние устройства: ЦАП

Внешние устройства: ЦАП
Внешние устройства: ЦАП

Цифро-аналоговый преобразователь (ЦАП) принимает дискретный сигнал и преобразует его в непрерывный сигнал. Наш ЦАП имеет четыре бита и сделан из суммирующего усилителя. Используя соотношение резисторов в цепи питания и обратной связи, мы смогли создать систему, которая выводит на 16 различных уровнях, создаваемых путем «суммирования» каждой ветви. Bit0, верхняя ветвь, несет наименьший вес и дает наименьший потенциал при высоком уровне из-за более высокого сопротивления ответвлений. Вес увеличивается по мере того, как вы спускаетесь по веткам. Если бы вы считали в двоичном формате вверх, а затем обратно, используя битовые входы, выходные напряжения были бы похожи на пошаговую синусоидальную волну. Вход ЦАП был подключен к одному из PMOD на плате для передачи 4-битного сигнала.

Изначально ЦАП был собран для класса электротехники, спроектирован и спаян нами, а не куплен в магазине. Выше изображение файла дизайна для создания печатной платы.

Шаг 17: Внешние устройства: динамик

Внешние устройства: динамик
Внешние устройства: динамик

Для этого проекта вам не захочется покупать пару супер хороших динамиков. Как видите, звук довольно простой. Мы пошли и купили в Best Buy комплект компьютерных колонок за 8 долларов. Все, что есть с разъемом для наушников, работает нормально. Монотонный тоже работает нормально. Вы даже можете использовать наушники, но можете их взорвать!

Чтобы подключить выход ЦАП к динамикам, мы использовали соединительные кабели, а затем подключили выходной кабель к кончику гнезда для наушников, а кабель заземления - к базе. Мы пытались закрепить кабели изолентой, но это вызвало много помех. Проблему можно решить, попробовав ленту другого типа.

Что касается наших динамиков, мы установили их на максимальную настройку и получили прилично громкий шум.

И это последний шаг к созданию цифрового секвенсора из платы FPGA! Перейдите к следующим двум разделам, чтобы загрузить весь наш код VHDL и увидеть секвенсор в действии.

Шаг 18: демонстрация видео

В этом видео показана финальная версия рабочего проекта, включая процесс назначения переключателей на 4 различных высоты звука и воспроизведение динамиками соответствующих нот.

Шаг 19: Код VHDL

Вот код всего проекта, включая файлы ограничений и sim-файлы, используемые при создании секвенсора. Обратите внимание, что неиспользуемые файлы дизайна говорят об этом в архитектуре.

Рекомендуемые: