Valek87 1 8 апреля, 2021 Опубликовано 8 апреля, 2021 · Жалоба Здравствуйте. У меня есть 2 счетчика. Значение первого счетчика (count1) после определенного события запоминается. Например, это значение = 487. Теперь второй счетчик (count2) должен генерировать каждые 1/6*count1 (т.е. 487/6 ~ 82) тактов сигнал готовности. У меня вопрос - как мне определить эту 1/6 часть значения от count1? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 8 апреля, 2021 Опубликовано 8 апреля, 2021 · Жалоба разделить на делителе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Valek87 1 8 апреля, 2021 Опубликовано 8 апреля, 2021 · Жалоба 1 minute ago, des00 said: разделить на делителе. Вопрос как? Я пробовал логическим сдвигом, но там только 1/4 и 1/8 я могу определить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masics 0 8 апреля, 2021 Опубликовано 8 апреля, 2021 · Жалоба Если первый - действительно счётчик, то можно сразу считать 1/6. Иначе делить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Valek87 1 8 апреля, 2021 Опубликовано 8 апреля, 2021 · Жалоба Что из себя должен представлять делитель? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 8 апреля, 2021 Опубликовано 8 апреля, 2021 · Жалоба 1 minute ago, Valek87 said: Вопрос как? Я пробовал логическим сдвигом, но там только 1/4 и 1/8 я могу определить. в столбик, как в школе, ЕМНИП 5ый класс Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Valek87 1 8 апреля, 2021 Опубликовано 8 апреля, 2021 (изменено) · Жалоба Деление не приветствуется в FPGA. Ресурсы жрет. Изменено 8 апреля, 2021 пользователем Valek87 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 8 апреля, 2021 Опубликовано 8 апреля, 2021 · Жалоба Just now, Valek87 said: Реление не приветствуется в FPGA. Ресурсы жрет. ну если вам жаль 2 регистра по 16 бит на делитель + 8 бит регистр на счетчик, делайте деление на константу через умножение. потратите умножитель. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
embddr 0 8 апреля, 2021 Опубликовано 8 апреля, 2021 · Жалоба 11 минут назад, Valek87 сказал: Вопрос как? Я пробовал логическим сдвигом, но там только 1/4 и 1/8 я могу определить. А вы разложите 1/6 в ряд и сложите члены: 1/8+1/32+1/128+1/512+... до требуемой разрядности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Shamil 2 8 апреля, 2021 Опубликовано 8 апреля, 2021 · Жалоба 38 минут назад, Valek87 сказал: Что из себя должен представлять делитель? Посмотрите как Viko реализует счетчик с дробным коэффициентом деления. Я думаю вам вполне подойдет. Надо только реализовать вычисление выражения, которое там константное: localparam X = ((1<<$clog2(N)) - N + M); В Вашем случае параметр M равен константе 6, а вот N будет переменным, равным содержимому count1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 8 апреля, 2021 Опубликовано 8 апреля, 2021 · Жалоба Тут вопрос действительно в том, где будет использоваться поделённое число. Если задача стоит в чистом делении и математических операциях, тогда с некоторой точностью можно взять сумму 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) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 8 апреля, 2021 Опубликовано 8 апреля, 2021 · Жалоба 21 minutes ago, Nick_K said: Если задача стоит в чистом делении и математических операциях, тогда с некоторой точностью можно взять сумму N=(N<<3)+(N<<5)+(N<<7)+(N<<9)... и далее все нечётные значения. Точного деления на 6 не будет, но максимально приближённое получится. Если же нужно поделить значение счётчика и на выходе есть некий интегратор/аккумулятор, тогда точное деление можно получить через Сигма-Дельта Модулятор (SDM). Суть заключается в том, что при делении на 6 будет происходить попеременное деление на 4 и на 8. А точнее выходной счётчик будет считать 2 отсчёта делённого числа на 8 и один отсчёт делённого на 4, в результате интегрирования будет среднее 6. что только не придумают, лишь бы банальный делитель не ставить, чтобы поделить число, которое раз в пятилетку обновляется)))))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 8 апреля, 2021 Опубликовано 8 апреля, 2021 · Жалоба 1 minute ago, des00 said: что только не придумают, лишь бы банальный делитель не ставить, чтобы поделить число которое раз в пятилетку обновляется)))))) Я привёл пример из реального проекта делителя для PLL. Там математика не нужна и безсмысленна, а входное число меняется каждый отсчёт, так как нужно учитывать термодинамику элементов или изменять выходную частоту. А делитель нужен, чтобы сравнить референс с осцилятором. Праавда у меня челая часть за десятки заваливает, но есть и дробная и работает по тому же принципу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serhiy_UA 1 8 апреля, 2021 Опубликовано 8 апреля, 2021 · Жалоба 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). Потом формируйте нужный импульс сигнала готовности, сумматор обнуляйте и все повторяйте сначала. Это как бы деление, но уже с другой стороны... Умножителя нет, и делителя здесь тоже нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 194 8 апреля, 2021 Опубликовано 8 апреля, 2021 · Жалоба 1 час назад, Valek87 сказал: Деление не приветствуется в FPGA. Ресурсы жрет Вам сразу предложили делитель на 6, т.е. практический ноль дополнительных ресурсов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться