des00 26 April 8, 2021 Posted April 8, 2021 · Report post 46 minutes ago, Nick_K said: Я привёл пример из реального проекта делителя для PLL. Там математика не нужна и безсмысленна, а входное число меняется каждый отсчёт, так как нужно учитывать термодинамику элементов или изменять выходную частоту. А делитель нужен, чтобы сравнить референс с осцилятором. Праавда у меня челая часть за десятки заваливает, но есть и дробная и работает по тому же принципу. угу, у ТС как раз PLL. "...Значение первого счетчика (count1) после определенного события запоминается......". 46 minutes ago, Serhiy_UA said: Вам нужно при каждом такте к некоторому сумматору добавлять 6. То есть он будет считать 0,6,12,18 и так далее до числа большего 487 (того, что в count1). Потом формируйте нужный импульс сигнала готовности, сумматор обнуляйте и все повторяйте сначала. Это как бы деление, но уже с другой стороны... Умножителя нет, и делителя здесь тоже нет. вы же понимаете, что в случае цифр, которые озвучил ТС, на это уйдет 82 такта, тогда как деление в лоб, использующее тот же сумматор, займет всего 3 такта) Quote Share this post Link to post Share on other sites More sharing options...
Nick_K 0 April 8, 2021 Posted April 8, 2021 · Report post 5 minutes ago, des00 said: угу, у ТС как раз PLL Я не говорил что у него PLL. Присто привёл пример. Такой подход используется во многои схемах. От формирователей импульсов, до частотных преобразователей и ADC/DAC систем. 4 minutes ago, des00 said: вы же понимаете, что в случае цифр, которые озвучил ТС, на это уйдет 82 такта Вы же понимаете, что у ТС и так стоит на выходе счётчик, который и так досчитает до 82. А так придётся ждать 82+3. Quote Share this post Link to post Share on other sites More sharing options...
des00 26 April 8, 2021 Posted April 8, 2021 · Report post 9 minutes ago, Nick_K said: Вы же понимаете, что у ТС и так стоит на выходе счётчик, который и так досчитает до 82. А так придётся ждать 82+3. Причем здесь ваш счетчик до 82 и длительность деления? Я бы понял если бы вы мне указали что @Serhiy_UA предлагает не последовательный делитель, а NCO, с фиксированным шагом 6 и переменным коэффициентом счета, определяемым тем что насчитал первый счетчик, так можно сдеалать, если допускается дрожание сигнала. Quote Share this post Link to post Share on other sites More sharing options...
Serhiy_UA 1 April 8, 2021 Posted April 8, 2021 · Report post Just now, des00 said: вы же понимаете, что в случае цифр, которые озвучил ТС, на это уйдет 82 такта, тогда как деление в лоб, использующее тот же сумматор, займет всего 3 такта) ТС строит устройство: "У меня есть 2 счетчика. Значение первого счетчика (count1) после определенного события запоминается. Например, это значение = 487. Теперь второй счетчик (count2) должен генерировать каждые 1/6*count1 (т.е. 487/6 ~ 82) тактов сигнал готовности. У меня вопрос - как мне определить эту 1/6 часть значения от count1? " и как мне представляется, мое решение могло бы устроить ТС. Quote Share this post Link to post Share on other sites More sharing options...
des00 26 April 8, 2021 Posted April 8, 2021 · Report post 16 minutes ago, Nick_K said: Я не говорил что у него PLL. Присто привёл пример. Такой подход используется во многои схемах. От формирователей импульсов, до частотных преобразователей и ADC/DAC систем. да, есть такое, но в контексте вопроса ТС, для задачи один раз в пятилетку определить результат деления Quote Важным условием является наличие выходного интегратора (для PLL, к примеру, используется Low Pass Filter) вот это совершенно излишне, с учетом того, что до вашего ответа ТС написал что экономит ресурсы и не может позволить себе 2 регистра на делитель) 4 minutes ago, Serhiy_UA said: и как мне представляется, мое решение могло бы устроить ТС. все верно, чисто математически вы правы, но последствия такого решения, что делить делимое методом вычитания делителя, когда делитель много меньше делимого, займет времени дольше чем делить напрямую в столбик. Ресурсы плис здесь будут те же, ссылку на код делителя от @SM в этой теме я уже приводил) Это я к тому, что делитель на ПЛИС примитивная и простая вещь, чего их бояться. Тем более для операций раз в пятилетку Quote Share this post Link to post Share on other sites More sharing options...
RobFPGA 58 April 8, 2021 Posted April 8, 2021 · Report post Приветствую! 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. Quote Share this post Link to post Share on other sites More sharing options...
embddr 0 April 8, 2021 Posted April 8, 2021 · Report post Деление в столбик предложил @des00 уже в первом ответе (потом уточнил). Потом ещё три раза рассказали, как это делать. Уж что проще умножения/деления на константу? 2 часа назад, Nick_K сказал: можно взять сумму N=(N<<3)+(N<<5)+(N<<7)+(N<<9)... и далее все нечётные значения. Точного деления на 6 не будет, но максимально приближённое получится. Почему не получится? Получится точное целочисленное деление. Quote Share this post Link to post Share on other sites More sharing options...
Nick_K 0 April 8, 2021 Posted April 8, 2021 · Report post 17 minutes ago, embddr said: Почему не получится? Получится точное целочисленное деление. Ну как получится. В пределах разрядности входного числа) Ибо само деление на 6 подразумевает умножение на 0,16-и-6 в периоде. Отсюда приближение. Опять же зависит от задач. Иногда и 64-х разрядов мало, а иногда и 6-7 с головой Quote Share this post Link to post Share on other sites More sharing options...
embddr 0 April 8, 2021 Posted April 8, 2021 · Report post 5 минут назад, Nick_K сказал: В пределах разрядности входного числа Наверное таки выходного. Входное можно расширить до нужного числа разрядов. Quote Share this post Link to post Share on other sites More sharing options...
Nick_K 0 April 8, 2021 Posted April 8, 2021 · Report post 6 minutes ago, embddr said: Наверное таки выходного. Входное можно расширить до нужного числа разрядов. Расширить то можно, но если добить нулями, то в определённый момент любой сдвиг вправо перестанет давать результат. То есть вся математика опирается на количество знАчимых разрядов входного числа. P.S. В приведённой мной ранее сумме N=... сдвиг должен быть вправо. Опечатался) Quote Share this post Link to post Share on other sites More sharing options...
embddr 0 April 8, 2021 Posted April 8, 2021 · Report post Только что, Nick_K сказал: Расширить то можно, но если добить нулями, то в определённый момент любой сдвиг вправо перестанед давать результат Добиваем нулями справа (или другими словами - смещаем точку влево). Это можно делать бесконечно. Quote Share this post Link to post Share on other sites More sharing options...
Nick_K 0 April 8, 2021 Posted April 8, 2021 · Report post 3 minutes ago, embddr said: Добиваем нулями справа (или другими словами - смещаем точку влево). Это можно делать бесконечно. Ещё раз - я опечатался, сдвигать нужно вправо (сдвиг в лево - умножение). В право можно достичь нулевого бита и дальше суммирование сдвинутых данных не окажет никакого влияния на результат. Хотя возможно в таком контексте правильнее говорить, что мы ограничены разрядностью выходного слова. Quote Share this post Link to post Share on other sites More sharing options...
embddr 0 April 8, 2021 Posted April 8, 2021 · Report post 2 минуты назад, Nick_K сказал: В право можно достичь нулевого бита и дальше суммирование сдвинутых данных не окажет никакого влияния на результат. Добавляем справа X нулей и время достижения нулевого разряда увеличивается на X шагов. Quote Share this post Link to post Share on other sites More sharing options...
_pv 101 April 8, 2021 Posted April 8, 2021 · Report post always @ (posedge clk) begin if (count2 >= count1) begin count2 <= 0; ready <= 1; else begin count2 <= count2 + 6; ready <= 0; end end Quote Share this post Link to post Share on other sites More sharing options...
Serhiy_UA 1 April 8, 2021 Posted April 8, 2021 · Report post 32 minutes ago, _pv said: always @ (posedge clk) begin if (count2 >= count1) begin count2 <= 0; ready <=1; else begin count2 <= count2 + 6; ready <=0; end end Экономно получилось! Quote Share this post Link to post Share on other sites More sharing options...