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

Определение 1/6 числа

46 minutes ago, Nick_K said:

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

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

46 minutes ago, Serhiy_UA said:

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

 

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

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


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

5 minutes ago, des00 said:

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

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

4 minutes ago, des00 said:

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

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

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


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

9 minutes ago, Nick_K said:

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

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

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


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

Just now, des00 said:

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

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

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

 

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


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

16 minutes ago, Nick_K said:

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

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

Quote

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

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

4 minutes ago, Serhiy_UA said:

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

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

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


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

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

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.

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


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

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

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

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

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

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


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

17 minutes ago, embddr said:

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

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

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

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


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

5 минут назад, Nick_K сказал:

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

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

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


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

6 minutes ago, embddr said:

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

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

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

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


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

Только что, Nick_K сказал:

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

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

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


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

3 minutes ago, embddr said:

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

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

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


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

2 минуты назад, Nick_K сказал:

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

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

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


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

 

always @ (posedge clk) begin
  if (count2 >= count1) begin
    count2 <= 0;
    ready <= 1;
  else begin
    count2 <= count2 + 6;
    ready <= 0;
  end
end

 

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


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

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

 

Экономно получилось!

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


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

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

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

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

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

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

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

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

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

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