МАРСОХОД

Open Source Hardware Project

Проекты Altera Quartus II для платы Марсоход

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

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 бит результата.
Из железа кроме собственно платы нужен динамик, в моём случае это звонок от старого радиотелефона. В качестве шаблона был взят http://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: icon Процедурная музыка для Марсохода (77.25 Кбайт)
 
 

Комментарии  

0 #16 nick17 11.03.2012 08:51
Спасибо, разобрался. На VHDL этот выглядит так: t srl 7.
0 #15 lesha birukov 11.03.2012 07:51
Проблема с угловой скобкой, ответил на форуме:
http://marsohod.org/forum/index.php?option=com_kunena&func=view&catid=6&id=919&Itemid=2#919
0 #14 lesha birukov 11.03.2012 07:47
Ну вот присваиваете вы одну шину другой. А=В означает, что А[0]=В[0], А[1]=В[1], ...
Сдвиг же позволяет присваивать со смещением: А=В "
0 #13 lesha birukov 11.03.2012 07:42
Цитирую nick17:
во что синтезируется конструкция "t>>7" из формулы "t*5&t>>7"? "t*5" умножитель, а "&t" побитовое и на логике.
И вообще на верилоге оператор >>. Хочу перенести на VHDL.


Ну вот присваиваете вы одну шину другой. А=В означает, что А[0]=В[0], А[1]=В[1], ...
Сдвиг же позволяет присваивать со смещением: А=В
0 #12 nick17 11.03.2012 03:11
во что синтезируется конструкция "t>>7" из формулы "t*5&t>>7"? "t*5" умножитель, а "&t" побитовое и на логике.
И вообще на верилоге оператор >>. Хочу перенести на VHDL.
0 #11 parus 21.01.2012 13:21
Цитирую lesha birukov:
Насчёт второго пина, да, понял идею, надо будет попробовать.

Я уже попробовал - громкость больше. Значительно.
0 #10 lesha birukov 20.01.2012 20:48
Ну это явно даже не формула, а шаблон, понять бы только, куда там ноты подставлять. Было бы весьма полезно получить аналогичную без умножений- делений. Насчёт второго пина, да, понял идею, надо будет попробовать.
0 #9 parus 19.01.2012 17:57
Во ещё какую нагуглил, только её в маленькой ПЛИС реализовать, имхо, невозможно: http://t.co/TjFCl5cq

А чтобы громкость побольше была можно второй выход заюзать(через инвертор первый).
0 #8 nckm_ 30.12.2011 06:24
Цитирую Женя:
[quote name="nckm_"]
У меня, просто, о порядке работы с Квартусом информация такая...собирательная что ли: то там почитал, это там подсказали...А в handbooke и описании отладочной платы конкретно ничего не говорится...Может правильно это с мегафункциями делать?...или с Timequest analaizerом?

никакого волшебства там нет. Timequest не трогайте вообще - от него ничего не зависит - это просто анализатор того, что получилось после компиляции. Если есть входной пин на которую подана внешняя частота с генератора, то поделите ее счетчиком внутри плис и выведите на светодиод. Должен моргать
0 #7 Женя 29.12.2011 16:57
Цитирую nckm_:

На плате должен быть генератор, от него идет сигнал к ПЛИС. Нужно знать номер этого контакта (по схеме платы) и в Assignment Editor привязать номер этого контакта к какому нибудь входному сигналу из модуля top level (схема или verilog?). Если это не работает проверяйте осциллографом работает ли генератор на плате? читайте сообщения компиляции - warnings и прочее, может ошиблись при назначениях?

СПАСИБО за оперативность! Т.е. нет по Квартусу конкретного документа, который описывает порядк ПРАВИЛЬНОГО подключения тактового сигнала в проекте?? У меня, просто, о порядке работы с Квартусом информация такая...собират ельная что ли: то там почитал, это там подсказали...А в handbooke и описании отладочной платы конкретно ничего не говорится...Мож ет правильно это с мегафункциями делать?...или с Timequest analaizerом?... Подскажте, пож.!
И С НАСТУПАЮЩИМ ВАС!!! САЙТ КЛАССНЫЙ! И ОБЪЯСНЯТЬ УМЕЕТЕ!!! УСПЕХОВ ВАМ!
0 #6 nckm_ 29.12.2011 10:12
Цитирую Женя:
Товарищи! Помогите оперативно разобраться! Как на вход объекта, из моего проекта, правильно подать тактовый сигнал?!!! Бьюсь неделю, уже душить меня начинают! Где в описаниях это описано!!!!! Проект загружется в плис (отладочная c Nios), но никак не проявляет наличие тактового: я его прописывал из timing analizera, входной пин обозначал...все по инструкции. НО ТАК ЛИ СЛЕДУЕТ его подключать?????!!! ГДЕ ПОЧИТАТЬ???!!

На плате должен быть генератор, от него идет сигнал к ПЛИС. Нужно знать номер этого контакта (по схеме платы) и в Assignment Editor привязать номер этого контакта к какому нибудь входному сигналу из модуля top level (схема или verilog?). Если это не работает проверяйте осциллографом работает ли генератор на плате? читайте сообщения компиляции - warnings и прочее, может ошиблись при назначениях?
0 #5 Женя 28.12.2011 20:17
Товарищи! Помогите оперативно разобраться! Как на вход объекта, из моего проекта, правильно подать тактовый сигнал?!!! Бьюсь неделю, уже душить меня начинают! Где в описаниях это описано!!!!! Проект загружется в плис (отладочная c Nios), но никак не проявляет наличие тактового: я его прописывал из timing analizera, входной пин обозначал...все по инструкции. НО ТАК ЛИ СЛЕДУЕТ его подключать????? !!! ГДЕ ПОЧИТАТЬ???!!
0 #4 lesha birukov 23.12.2011 18:21
Цитирую Сергей:
ссылка на формулы-битая

Да, действительно, мусор от тега приписывается в конце ссылки, вот так надо:
http://pelulamu.net/countercomplex/music_formula_collection.txt
0 #3 Сергей 23.12.2011 04:45
ссылка на формулы-битая
0 #2 lesha birukov 21.12.2011 17:48
Цитирую Ю р и й:
Классная подставочка для платы. :-)

А то ж! Подставочка собрана из мелочевки комплекта Inex Pop-bot-а (http://www.inexglobal.com/products.php?type=micro&cat=AVR&model=popbot) Рекомендую, очень правильно написан мануал, в комплекте не поскупились на мелочевку.
0 #1 Ю р и й 20.12.2011 09:43
Классная подставочка для платы. :-)

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


Защитный код
Обновить


GitHub YouTube Twitter
Вы здесь: Начало Проекты Проект Марсоход Процедурная музыка для Марсохода