Jump to content

    

Recommended Posts

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

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

Share this post


Link to post
Share on other sites
1 minute ago, Valek87 said:

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

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

Share this post


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

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

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

Share this post


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

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

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

Share this post


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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

Если задача стоит в чистом делении и математических операциях, тогда с некоторой точностью можно взять сумму 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)

Share this post


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

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

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

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

Share this post


Link to post
Share on other sites
1 minute ago, des00 said:

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

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

Share this post


Link to post
Share on other sites
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). Потом формируйте нужный импульс сигнала готовности, сумматор обнуляйте и все повторяйте сначала. Это как бы деление, но уже с другой стороны... Умножителя нет, и делителя здесь тоже нет.

 

Share this post


Link to post
Share on other sites
1 час назад, Valek87 сказал:

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

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

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.