Процедурная музыка для Марсохода

jukebox на плате Марсоход   jukebox на плате Марсоход

Цель данной работы - продемонстрировать простой и наглядный проект, подходящий для первых шагов работы с платой. Источником музыкального сигнала будет не последовательность нот, а формулы определенного вида, подсмотренные у демосценщиков:
http://countercomplex.blogspot.com/2011/10/algorithmic-symphonies-from-one-line-of.html
http://countercomplex.blogspot.com/2011/10/some-deep-analysis-of-one-line-music.html

Пример подходящей формулы: (t>>7|t|t>>6)*10+4*(t&t>>13|t>>6)

Здесь единственный параметр это время, точнее, номер отсчета ИКМ (eng:PCM) сигнала при частоте дискретизации 8kHz. Вычисляемое значение используется для формирования амплитуды сигнала, берутся младшие 8 бит результата.
Из железа кроме собственно платы нужен динамик, в моём случае это звонок от старого радиотелефона. В качестве шаблона был взят https://marsohod.org/projects/plata1/8-emptyproject 'почти "пустой проект"'.
Чтобы получить из 8-битного уровня сигнала однобитный используется самопальный ЦАП, реализованный через своего рода ШИМ, вот таким модулем:

module tsap(
  input wire [7:0] X,
  input wire [7:0] rnd,
  output wire res
);
assign res =
  rnd[0] ? X[7] : (
  rnd[1] ? X[6] : (
  rnd[2] ? X[5] : (
  rnd[3] ? X[4] : (
  rnd[4] ? X[3] : (
  rnd[5] ? X[2] : (
  rnd[6] ? X[1] : (
  rnd[7] ? X[0] : 0)))))));
endmodule

Сигнал rnd берется от счетчика, считающего тики клока. Сейчас в проекте реализованы три мелодии выбираемые кнопками 0 и 1. Вот как выглядит основной модуль:

module jukebox(
  input [22:0] X,// номер отсчета
  input [8:0] D, // рандомизатор для "ЦАП"
  input [3:0] K, // состояние кнопок
  output wire
// выход на динамик
);
wire [22:0] t;
assign t=X;
wire [22:0] X2=
  ~K[0] ? t * ((t>>12|t>>8)&63&t>>4) :  //    25% LE
  ~K[1] ? (t*5&t>>7)|(t*3&t>>10) :      //    14% LE
  (t>>7|t|t>>6)*10+4*(t&t>>13|t>
>6);    //    14% LE
tsap ( X2, D, Y );
endmodule

Много других формул можно найти тут http://pelulamu.net/countercomplex/music_formula_collection.txt .
 
Некоторые из этих формул, предназначенных для С и java script работают без изменений и для верилога. Надо однако иметь в виду, что каждое умножение в формуле превратится в схеме в умножитель (умножение на константу оптимизируется, к счастью), а это 15% ёмкости CPLD; блок для деления не влезает вообще.
 
Итак, реализован механизм генерации музыкоподобного звука для Марсохода. Если сравнивать с реализацией такой же функции на микроконтроллере, то при условии что музыка не единственная функциональность, проект на ПЛИС оказывается проще, не влияет на скорость соседних задач, только объем отъедает. В прилагаемом wma-файле записано то, что в итоге получилось.
Прилагаются также фотографии и проект для Quartus:
 
 

Добавить комментарий