Jump to content

    

Recommended Posts

46 minutes ago, Nick_K said:

Я привёл пример из реального проекта делителя для PLL. Там математика не нужна и безсмысленна, а входное число меняется каждый отсчёт, так как нужно учитывать термодинамику элементов или изменять выходную частоту. А делитель нужен, чтобы сравнить референс с осцилятором. Праавда у меня челая часть за десятки заваливает, но есть и дробная и работает по тому же принципу.

угу, у ТС как раз PLL. "...Значение первого счетчика (count1) после определенного события запоминается......".

46 minutes ago, Serhiy_UA said:

Вам нужно при каждом такте к некоторому сумматору добавлять 6. То есть он будет считать 0,6,12,18 и так далее до числа большего 487 (того, что в count1). Потом формируйте нужный импульс сигнала готовности, сумматор обнуляйте и все повторяйте сначала. Это как бы деление, но уже с другой стороны... Умножителя нет, и делителя здесь тоже нет.

 

вы же понимаете, что в случае цифр, которые озвучил ТС, на это уйдет 82 такта, тогда как деление в лоб, использующее тот же сумматор, займет всего 3 такта)

Share this post


Link to post
Share on other sites
5 minutes ago, des00 said:

угу, у ТС как раз PLL

Я не говорил что у него PLL. Присто привёл пример. Такой подход используется во многои схемах. От формирователей импульсов, до частотных преобразователей и ADC/DAC систем.

4 minutes ago, des00 said:

вы же понимаете, что в случае цифр, которые озвучил ТС, на это уйдет 82 такта

Вы же понимаете, что у ТС и так стоит на выходе счётчик, который и так досчитает до 82. А так придётся ждать 82+3.

Share this post


Link to post
Share on other sites
9 minutes ago, Nick_K said:

Вы же понимаете, что у ТС и так стоит на выходе счётчик, который и так досчитает до 82. А так придётся ждать 82+3.

Причем здесь ваш счетчик до 82 и длительность деления? Я бы понял если бы вы мне указали что @Serhiy_UA предлагает не последовательный делитель, а NCO, с фиксированным шагом 6 и переменным коэффициентом счета, определяемым тем что насчитал первый счетчик, так можно сдеалать, если допускается дрожание сигнала. 

Share this post


Link to post
Share on other sites
Just now, des00 said:

вы же понимаете, что в случае цифр, которые озвучил ТС, на это уйдет 82 такта, тогда как деление в лоб, использующее тот же сумматор, займет всего 3 такта)

ТС строит устройство: "У меня есть 2 счетчика.  Значение первого счетчика (count1) после определенного события запоминается. Например, это значение = 487. Теперь второй счетчик (count2) должен генерировать каждые 1/6*count1 (т.е. 487/6 ~ 82) тактов сигнал готовности. У меня вопрос - как мне определить эту 1/6 часть значения от count1? "

и как мне представляется, мое решение могло бы устроить ТС. 

 

Share this post


Link to post
Share on other sites
16 minutes ago, Nick_K said:

Я не говорил что у него PLL. Присто привёл пример. Такой подход используется во многои схемах. От формирователей импульсов, до частотных преобразователей и ADC/DAC систем.

да, есть такое, но в контексте вопроса ТС, для задачи один раз в пятилетку определить результат деления

Quote

Важным условием является наличие выходного интегратора (для PLL, к примеру, используется Low Pass Filter)

вот это совершенно излишне, с учетом того, что до вашего ответа ТС написал что экономит ресурсы и не может позволить себе 2 регистра на делитель)

4 minutes ago, Serhiy_UA said:

и как мне представляется, мое решение могло бы устроить ТС.

все верно, чисто математически вы правы, но последствия такого решения, что делить делимое методом вычитания делителя, когда делитель много меньше делимого, займет времени дольше чем делить напрямую в столбик. Ресурсы плис здесь будут те же, ссылку на код делителя от @SM в этой теме я уже приводил) Это я к тому, что делитель на ПЛИС примитивная и простая вещь, чего их бояться. Тем более для операций раз в пятилетку

Share this post


Link to post
Share on other sites

Приветствую!

3 hours ago, Valek87 said:

Здравствуйте.

У меня есть 2 счетчика.  Значение первого счетчика (count1) после определенного события запоминается. Например, это значение = 487. Теперь второй счетчик (count2) должен генерировать каждые 1/6*count1 (т.е. 487/6 ~ 82) тактов сигнал готовности. У меня вопрос - как мне определить эту 1/6 часть значения от count1? Спасибо.

Если  не получается  делить  на 6 в процессе счета первого счетчика (как выше предлагали, IMHO самый простой вариант) то деление  на 6 можно заменить умножением  на К и делением результата (сдвигом) на 2**N.   
где  (2**N)/K=1.33....,   К и N выбираются  в зависимости от разрядности счетчика для обеспечения нужной точности.  А так как К  будет константой то разложив на множители умножение можно будет заменить суммой сдвинутых значение вашего счетчика.    

 

Удачи! Rob.

Share this post


Link to post
Share on other sites

Деление в столбик предложил @des00
уже в первом ответе (потом уточнил). Потом ещё три раза рассказали, как это делать. Уж что проще умножения/деления на константу?

2 часа назад, Nick_K сказал:

можно взять сумму N=(N<<3)+(N<<5)+(N<<7)+(N<<9)... и далее все нечётные значения. Точного деления на 6 не будет, но максимально приближённое получится.

Почему не получится? Получится точное целочисленное деление.

Share this post


Link to post
Share on other sites
17 minutes ago, embddr said:

Почему не получится? Получится точное целочисленное деление.

Ну как получится. В пределах разрядности входного числа) Ибо само деление на 6 подразумевает умножение на 0,16-и-6 в периоде. Отсюда приближение.

Опять же зависит от задач. Иногда и 64-х разрядов мало, а иногда и 6-7 с головой :smile:

Share this post


Link to post
Share on other sites
5 минут назад, Nick_K сказал:

В пределах разрядности входного числа

Наверное таки выходного. Входное можно расширить до нужного числа разрядов.

Share this post


Link to post
Share on other sites
6 minutes ago, embddr said:

Наверное таки выходного. Входное можно расширить до нужного числа разрядов.

Расширить то можно, но если добить нулями, то в определённый момент любой сдвиг вправо перестанет давать результат. То есть вся математика опирается на количество знАчимых разрядов входного числа.

P.S. В приведённой мной ранее сумме N=... сдвиг должен быть вправо. Опечатался)

Share this post


Link to post
Share on other sites
Только что, Nick_K сказал:

Расширить то можно, но если добить нулями, то в определённый момент любой сдвиг вправо перестанед давать результат

Добиваем нулями справа (или другими словами - смещаем точку влево). Это можно делать бесконечно.

Share this post


Link to post
Share on other sites
3 minutes ago, embddr said:

Добиваем нулями справа (или другими словами - смещаем точку влево). Это можно делать бесконечно.

Ещё раз - я опечатался, сдвигать нужно вправо (сдвиг в лево - умножение). В право можно достичь нулевого бита и дальше суммирование сдвинутых данных не окажет никакого влияния на результат. Хотя возможно в таком контексте правильнее говорить, что мы ограничены разрядностью выходного слова.

Share this post


Link to post
Share on other sites
2 минуты назад, Nick_K сказал:

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

Добавляем справа X нулей и время достижения нулевого разряда увеличивается на X шагов.

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.