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

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

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

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

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


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

1 minute ago, des00 said:

разделить на делителе.

Вопрос как? Я пробовал логическим сдвигом, но там только 1/4 и 1/8 я могу определить.

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


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

Если первый - действительно счётчик, то можно сразу считать 1/6. Иначе делить.

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


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

1 minute ago, Valek87 said:

Вопрос как? Я пробовал логическим сдвигом, но там только 1/4 и 1/8 я могу определить.

в столбик, как в школе, ЕМНИП 5ый класс

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


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

Деление не приветствуется в FPGA. Ресурсы жрет.

Изменено пользователем Valek87

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


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

Just now, Valek87 said:

Реление не приветствуется в FPGA. Ресурсы жрет.

ну если вам жаль 2 регистра по 16 бит на делитель + 8 бит регистр на счетчик, делайте деление на константу через умножение. потратите умножитель.

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


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

11 минут назад, Valek87 сказал:

Вопрос как? Я пробовал логическим сдвигом, но там только 1/4 и 1/8 я могу определить.

А вы разложите 1/6 в ряд и сложите члены: 1/8+1/32+1/128+1/512+... до требуемой разрядности.

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


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

38 минут назад, Valek87 сказал:

Что из себя должен представлять делитель?

Посмотрите как Viko реализует счетчик с дробным коэффициентом деления.

Я думаю вам вполне подойдет. Надо только реализовать вычисление выражения, которое там константное:

localparam X = ((1<<$clog2(N)) - N + M);

В Вашем случае параметр M равен константе 6, а вот N будет переменным, равным содержимому count1.

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


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

Тут вопрос действительно в том, где будет использоваться поделённое число.

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

Если же нужно поделить значение счётчика и на выходе есть некий интегратор/аккумулятор, тогда точное деление можно получить через Сигма-Дельта Модулятор (SDM). Суть заключается в том, что при делении на 6 будет происходить попеременное деление на 4 и на 8. А точнее выходной счётчик будет считать 2 отсчёта делённого числа на 8 и один отсчёт делённого на 4, в результате интегрирования будет среднее 6.

На пальцах: 487 / 6 = 81,16(6) - из примера в первом посте

1. один осчёт на 1/4: 487 / 4 = 121,75

2. плюс отсчёт на 1/8: 487 / 8 = 60,875 ; Усредняем: (121,75 + 60,875) / 2 = 91,3125 (близко но не совсем)

3. и плюс ещё отсчёт на 1/8: 487 / 8 = 60,875 ; Усредняем всё вместе: (121,75 + 60,875 + 60,875) / 3 = 81,16(6)

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

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


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

21 minutes ago, Nick_K said:

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

Если же нужно поделить значение счётчика и на выходе есть некий интегратор/аккумулятор, тогда точное деление можно получить через Сигма-Дельта Модулятор (SDM). Суть заключается в том, что при делении на 6 будет происходить попеременное деление на 4 и на 8. А точнее выходной счётчик будет считать 2 отсчёта делённого числа на 8 и один отсчёт делённого на 4, в результате интегрирования будет среднее 6.

что только не придумают, лишь бы банальный делитель не ставить, чтобы поделить число, которое раз в пятилетку обновляется))))))

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


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

1 minute ago, des00 said:

что только не придумают, лишь бы банальный делитель не ставить, чтобы поделить число которое раз в пятилетку обновляется))))))

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

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


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

1 hour ago, Valek87 said:

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

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

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

 

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


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

1 час назад, Valek87 сказал:

Деление не приветствуется в FPGA. Ресурсы жрет

Вам сразу предложили делитель на 6, т.е. практический ноль дополнительных ресурсов.

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


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

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

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

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

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

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

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

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

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

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