Jump to content

    
Sign in to follow this  

Recommended Posts

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

 

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

Edited by Garoldy

Share this post


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

Share this post


Link to post
Share on other sites

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

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

 

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

 

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

 

 

>>des00

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

Share this post


Link to post
Share on other sites
Не совсем представляю как это сделать.

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

 

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

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

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

Share this post


Link to post
Share on other sites

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

Edited by Garoldy

Share this post


Link to post
Share on other sites
>> 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 нужен

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this