Garoldy 0 12 августа, 2011 Опубликовано 12 августа, 2011 (изменено) · Жалоба Добрый день! Суть проблемы вот в чем. Есть spartan-3 starter kit. На платей установлен кварцевый генератор на 50 МГц. Нужно из этой частоты получить частоты нот первой октавы, т.е приходится делить на числа отличные от (2 в степени n). Подскажите, как можно это сделать на VHDL? Прочел, что есть блок PLL, которым можно поделить скажем на 10 или 50, но описания на русском, как его задействовать, не нашел. частота, Гц; Нота; 261.63 до1 293.67 ре1 329.63 ми1 349.23 фа1 392.00 соль1 440.00 ля1 493.88 си Точности до единиц достаточно будет. Изменено 12 августа, 2011 пользователем Garoldy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 12 августа, 2011 Опубликовано 12 августа, 2011 · Жалоба Нужно из этой частоты получить частоты нот первой октавы, курить гугл по теме DDS Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 12 августа, 2011 Опубликовано 12 августа, 2011 · Жалоба Добрый день! Суть проблемы вот в чем. Есть spartan-3 starter kit. На платей установлен кварцевый генератор на 50 МГц. Нужно из этой частоты получить частоты нот первой октавы, т.е приходится делить на числа отличные от (2 в степени n). Подскажите, как можно это сделать на VHDL? Прочел, что есть блок PLL, которым можно поделить скажем на 10 или 50, но описания на русском, как его задействовать, не нашел. частота, Гц; Нота; 261.63 до1 293.67 ре1 329.63 ми1 349.23 фа1 392.00 соль1 440.00 ля1 493.88 си Точности до единиц достаточно будет. если приведенные частоты в Гц а ваша ПЛИС работает на 50 МГц => разве связка счетчик + дешифратор не решает проблему? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Garoldy 0 12 августа, 2011 Опубликовано 12 августа, 2011 · Жалоба Не совсем представляю как это сделать. Вот у меня есть счетчик: process(CLK) begin if rising_edge(CLK) then counter<=counter+1; --сигнал counter 24 bit else null; end if; end process; Как вы предлагаете подключить дешифратор? Или Вы имели ввиду какой-то другой счетчик? >>des00 Спасибо! Только вот DDS для моего проекта будет излишне! Мне всего лишь хочется разобраться как воспроизводить однотональные мелодии на ПЛИС. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LV26 0 12 августа, 2011 Опубликовано 12 августа, 2011 · Жалоба Не совсем представляю как это сделать. Вот у меня есть счетчик: process(CLK) begin if rising_edge(CLK) then counter<=counter+1; --сигнал counter 24 bit else null; end if; end process; Как вы предлагаете подключить дешифратор? Или Вы имели ввиду какой-то другой счетчик? >>des00 Спасибо! Только вот DDS для моего проекта будет излишне! Мне всего лишь хочется разобраться как воспроизводить однотональные мелодии на ПЛИС. Если вы поняли, что DDS излишне, то эта задача должна быть для Вас смехотворной... С нетерпением и с затаенным волнением жду от Вас решения задачи :) P.S. Сигналы Вам в каком виде получить надо? Что бы красиво пищало - это надо синус или косинус (что именно надо еще решить). Если не надо красиво - гуглите PWM (в простонародье - ШИМ). Но там тоже не все гладко... одностороняя, двухсторонняя... Вообщем - сложно все это... сделайте лучше генераторы на BJТ. Если хочется покуражиться - лямбда-диоды можно применить. P.P.S Не обижайтесь... какой вопрос - такой ответ. Искренне желаю успехов! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Garoldy 0 12 августа, 2011 Опубликовано 12 августа, 2011 (изменено) · Жалоба >> Victor® Вы оказались правы, на счет смехотворности!! Почитал не много про счетчики, после этого все стало понятно. Я сделал следующим образом: process(CLK) begin if rising_edge(CLK) then counter_do<=counter_do+1; counter_re<=counter_re+1; -- для каждой ноты свой counter_xx if counter_do="10111010101000100" then --если в counter_do натикало число, соответсвующее counter_do<=(others=>'0'); -- половине периода ноты До, то обнулить счетчик count_do<=count_do+1; --в нулевой бит counter_do записать 1, при следующем обнулении счетчика, -- нулевой бит будет уже нулем и т.д --частота изменения нулевого бита будет соответсовать частоте ноты До. else null; end if; if counter_re="10100110010001011" then --тоже самое и для Ре и для остальных нот. counter_re<=(others=>'0'); count_re<=count_re+1; else null; end if; -- продолжение операторов if для оставшихся нот end process; Victor®, на счет форм сигнала даже и не думал. Достаточно того, что бы просто пищало. На сайте марсохода, нашел проект с проигрованием мелодии "Подмосковные вечера" вот и захотел повторить. Кстати, все получилось! Подобрал нормальную длительность нот, и стало один в один как на тамошнем видео! Всем спасибо за помощь! PS Victor®, надеюсь что когда-нибудь буду понимать все ваши слова с ходу, а не пропуская черег гугл..) Изменено 12 августа, 2011 пользователем Garoldy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LV26 0 13 августа, 2011 Опубликовано 13 августа, 2011 · Жалоба >> Victor® Вы оказались правы, на счет смехотворности!! Почитал не много про счетчики, после этого все стало понятно. Я сделал следующим образом: process(CLK) begin if rising_edge(CLK) then counter_do<=counter_do+1; counter_re<=counter_re+1; -- для каждой ноты свой counter_xx if counter_do="10111010101000100" then --если в counter_do натикало число, соответсвующее counter_do<=(others=>'0'); -- половине периода ноты До, то обнулить счетчик count_do<=count_do+1; --в нулевой бит counter_do записать 1, при следующем обнулении счетчика, -- нулевой бит будет уже нулем и т.д --частота изменения нулевого бита будет соответсовать частоте ноты До. else null; end if; if counter_re="10100110010001011" then --тоже самое и для Ре и для остальных нот. counter_re<=(others=>'0'); count_re<=count_re+1; else null; end if; -- продолжение операторов if для оставшихся нот end process; Victor®, на счет форм сигнала даже и не думал. Достаточно того, что бы просто пищало. На сайте марсохода, нашел проект с проигрованием мелодии "Подмосковные вечера" вот и захотел повторить. Кстати, все получилось! Подобрал нормальную длительность нот, и стало один в один как на тамошнем видео! Всем спасибо за помощь! PS Victor®, надеюсь что когда-нибудь буду понимать все ваши слова с ходу, а не пропуская черег гугл..) Вот видите как все удачно сложилось ;) Достаточно подумать некоторое время. A DDS в Вашем случае очень кстати хорошо... Грубо говоря, счетчик - это вырожденный DDS, который считает не +1, а + <сколько надо> И вот это "сколько надо" и меняйте динамически при проигрывании мелодии. 1 DDS нужен Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться