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