Чтобы получить из 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 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
Много других формул можно найти
тут
. Некоторые из этих формул, предназначенных для С и java script работают без изменений и для верилога. Надо однако иметь в виду, что каждое умножение в формуле превратится в схеме в умножитель (умножение на константу оптимизируется, к счастью), а это 15% ёмкости CPLD; блок для деления не влезает вообще.
Итак, реализован механизм генерации музыкоподобного звука для Марсохода. Если сравнивать с реализацией такой же функции на микроконтроллере, то при условии что музыка не единственная функциональность, проект на ПЛИС оказывается проще, не влияет на скорость соседних задач, только объем отъедает. В прилагаемом wma-файле записано то, что в итоге получилось. Прилагаются также фотографии и проект для Quartus.
UPD: К сожалению, проект и wma-файл слишком велики с точки зрения движка форума. Во вложении верилог и bdf-файлы.