Перейти к содержанию
    

деление GCLK

Добрый день! Суть проблемы вот в чем. Есть 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 си

 

Точности до единиц достаточно будет.

Изменено пользователем Garoldy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нужно из этой частоты получить частоты нот первой октавы,

курить гугл по теме DDS

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день! Суть проблемы вот в чем. Есть 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 МГц => разве связка счетчик + дешифратор не решает проблему?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не совсем представляю как это сделать.

Вот у меня есть счетчик:

 

process(CLK)
begin
   if rising_edge(CLK) then
        counter<=counter+1;  --сигнал counter 24 bit
   else
        null;
   end if;
end process;

 

Как вы предлагаете подключить дешифратор? Или Вы имели ввиду какой-то другой счетчик?

 

 

>>des00

Спасибо! Только вот DDS для моего проекта будет излишне! Мне всего лишь хочется разобраться как воспроизводить однотональные мелодии на ПЛИС.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не совсем представляю как это сделать.

Вот у меня есть счетчик:

 

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

Не обижайтесь... какой вопрос - такой ответ.

Искренне желаю успехов!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

>> 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®, надеюсь что когда-нибудь буду понимать все ваши слова с ходу, а не пропуская черег гугл..)

Изменено пользователем Garoldy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

>> 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 нужен

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...