
Цель данной работы - продемонстрировать простой и наглядный проект, подходящий для первых шагов работы с платой. Источником музыкального сигнала будет не последовательность нот, а формулы определенного вида, подсмотренные у демосценщиков:
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-битного уровня сигнала однобитный используется самопальный ЦАП, реализованный через своего рода ШИМ, вот таким модулем:
Сигнал rnd берется от счетчика, считающего тики клока. Сейчас в проекте реализованы три мелодии выбираемые кнопками 0 и 1. Вот как выглядит основной модуль:
module tsap(
input wire [7:0] X,
input wire [7:0] rnd,
output wire res
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
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 Y // выход на динамик
input [8:0] D, // рандомизатор для "ЦАП"
input [3:0] K, // состояние кнопок
output wire Y // выход на динамик
);
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
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:

marsohod.org/.../
Сдвиг же позволяет присваивать со смещением: А=В "
Ну вот присваиваете вы одну шину другой. А=В означает, что А[0]=В[0], А[1]=В[1], ...
Сдвиг же позволяет присваивать со смещением: А=В
И вообще на верилоге оператор >>. Хочу перенести на VHDL.
Я уже попробовал - громкость больше. Значительно.
А чтобы громкость побольше была можно второй выход заюзать(через инвертор первый).
никакого волшебства там нет. Timequest не трогайте вообще - от него ничего не зависит - это просто анализатор того, что получилось после компиляции. Если есть входной пин на которую подана внешняя частота с генератора, то поделите ее счетчиком внутри плис и выведите на светодиод. Должен моргать
СПАСИБО за оперативность! Т.е. нет по Квартусу конкретного документа, который описывает порядк ПРАВИЛЬНОГО подключения тактового сигнала в проекте?? У меня, просто, о порядке работы с Квартусом информация такая...собират ельная что ли: то там почитал, это там подсказали...А в handbooke и описании отладочной платы конкретно ничего не говорится...Мож ет правильно это с мегафункциями делать?...или с Timequest analaizerом?... Подскажте, пож.!
И С НАСТУПАЮЩИМ ВАС!!! САЙТ КЛАССНЫЙ! И ОБЪЯСНЯТЬ УМЕЕТЕ!!! УСПЕХОВ ВАМ!
На плате должен быть генератор, от него идет сигнал к ПЛИС. Нужно знать номер этого контакта (по схеме платы) и в Assignment Editor привязать номер этого контакта к какому нибудь входному сигналу из модуля top level (схема или verilog?). Если это не работает проверяйте осциллографом работает ли генератор на плате? читайте сообщения компиляции - warnings и прочее, может ошиблись при назначениях?
Да, действительно, мусор от тега приписывается в конце ссылки, вот так надо:
pelulamu.net/.../...
А то ж! Подставочка собрана из мелочевки комплекта Inex Pop-bot-а (www.inexglobal.com/.../) Рекомендую, очень правильно написан мануал, в комплекте не поскупились на мелочевку.