new123 0 17 декабря, 2018 Опубликовано 17 декабря, 2018 · Жалоба Добрый день, форумчане. Глупый у меня вопрос, наверное даже должен извиниться за такую глупость =) Но все же. 1) У меня есть счетчик инкрементирую 2) У меня есть fifo 3) У меня есть флаг, который отвечает за запись в fifo В fifo я хочу записывать каждые N значений счетчика. В принципе ничего вроде сложного Свой флаг я взвожу примерно так assign start = ( ( (fifo_counts < LOG_SIZE) || (fifo_empty) ) && ( enabled && (log_id_counter % 2 == 0) ) )? 1'b1: 1'b0; always @ (posedge clk) begin if (enabled) begin log_id_counter <= log_id_counter + 1'b1; end end То есть сама кратность у меня проверяется в конструкции log_id_counter % 2 == 0 Чем больше я делаю шаг кратности, тем больше у меня появляется глюков. FIFO выдает мне потом какую то чехарду. Например каждый шестнадцатый элемент с левым значением счетчика. Выкрутиться, я выкрутился. Примерно так (взвожу некий бит каждый 50 000 счетчик) always @ (posedge CLK_25) begin log_bit_counter <= log_bit_counter + 1'b1; if (log_bit_counter == 16'd50000) begin log_bit <= ~log_bit; log_bit_counter <= 16'b00; end end Выкрутиться выкрутился, я покоя не дает. Что же не так делаю. Может операция остатка от деления такая долгая? Может где по времени не прохожу? Железо у меня Stratix V. Вдруг кто что нибудь подскажет. Буду признателен, если устраните пробел в моей голове. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 17 декабря, 2018 Опубликовано 17 декабря, 2018 · Жалоба Остаток от деления на 2 -- это просто младший бит. Проект обконстрейнен? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 17 декабря, 2018 Опубликовано 17 декабря, 2018 · Жалоба 1 minute ago, andrew_b said: Остаток от деления на 2 -- это просто младший бит. Проект обконстрейнен? 2 - как пример, на нем все работает хорошо. Уже начиная от 10, схема ползет не обконстрейен, но в TimeQuestAnalyzer по этому коду репортов нет. Я тут немного плаваю. Вот рассказываю как вижу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 17 декабря, 2018 Опубликовано 17 декабря, 2018 · Жалоба 1 минуту назад, new123 сказал: 2 - как пример, на нем все работает хорошо. Уже начиная от 10, схема ползет Ну так естественно. Остаток от деления -- операция нетривиальная. Можете сами посмотреть в RTL viewer, как она реализуется. 2 минуты назад, new123 сказал: не обконстрейен, но в TimeQuestAnalyzer по этому коду репортов нет. Логично -- нет констрейнов, нет репортов. Необконстрейненный проект будет работать как бог на душу положит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 17 декабря, 2018 Опубликовано 17 декабря, 2018 · Жалоба 25 minutes ago, andrew_b said: Логично -- нет констрейнов, нет репортов. Необконстрейненный проект будет работать как бог на душу положит. Понятненько. Спасибо, буду заниматься тогда 25 minutes ago, andrew_b said: Ну так естественно. Остаток от деления -- операция нетривиальная. Можете сами посмотреть в RTL viewer, как она реализуется. Интересно, если я задействую bsp блок, помогло бы? Чисто из спортивного интереса. Там же они создавались для мат вычислений Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MegaVolt 22 17 декабря, 2018 Опубликовано 17 декабря, 2018 · Жалоба По хорошему это делается так: Отдельным счётчиком считающий до N и выдающим один импульс каждые N тактов вполне по которым и происходит запись данных. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 17 декабря, 2018 Опубликовано 17 декабря, 2018 · Жалоба 11 minutes ago, MegaVolt said: По хорошему это делается так: Отдельным счётчиком считающий до N и выдающим один импульс каждые N тактов вполне по которым и происходит запись данных. Спасибо. вот я так похоже и выкрутился. Я там написал в первом сообщении. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MegaVolt 22 17 декабря, 2018 Опубликовано 17 декабря, 2018 · Жалоба 24 минуты назад, new123 сказал: Спасибо. вот я так похоже и выкрутился. Я там написал в первом сообщении. Ну так хорошее же решение. В чём сомнения? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 17 декабря, 2018 Опубликовано 17 декабря, 2018 · Жалоба 10 minutes ago, MegaVolt said: Ну так хорошее же решение. В чём сомнения? сомнений нет, все работает. Просто хотел устранить пробелы в знаниях, неужели операция деления может так сказываться. Сейчас заполняю констрейны, проверю потом просто из любопытства с ними. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MegaVolt 22 17 декабря, 2018 Опубликовано 17 декабря, 2018 · Жалоба 54 минуты назад, new123 сказал: сомнений нет, все работает. Просто хотел устранить пробелы в знаниях, неужели операция деления может так сказываться. Сейчас заполняю констрейны, проверю потом просто из любопытства с ними. Да операция деления самая дорогая из обычных действий. Дальше корень и тригонометрия. Умножение тоже не дешёвая. Но для умножения хотя бы блоки DSP есть. А для деления нужно заменять его на умножение на 1/x где 1/x вычисляется заранее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 18 декабря, 2018 Опубликовано 18 декабря, 2018 · Жалоба 18 hours ago, MegaVolt said: А для деления нужно заменять его на умножение на 1/x где 1/x вычисляется заранее. это будет не точно. можно просто реализовать делитель на логике) конвейризированный Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MegaVolt 22 18 декабря, 2018 Опубликовано 18 декабря, 2018 · Жалоба 8 часов назад, des00 сказал: это будет не точно. можно просто реализовать делитель на логике) конвейризированный Конечно можно. Вопрос зачем. Если задача получить каждый Nый импульс то деление не нужно вовсе. А если применение другое то степерь оптимизации деления и её необходимость уже каждый решает сам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 19 декабря, 2018 Опубликовано 19 декабря, 2018 · Жалоба 12 hours ago, MegaVolt said: Конечно можно. Вопрос зачем. Если задача получить каждый Nый импульс то деление не нужно вовсе. А если применение другое то степерь оптимизации деления и её необходимость уже каждый решает сам. Всё так, но применение "заменять его на умножение на 1/x где 1/x вычисляется заранее" к счетчику по модулю тоже имеет сильно опосредованное отношение) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MegaVolt 22 19 декабря, 2018 Опубликовано 19 декабря, 2018 · Жалоба 6 часов назад, des00 сказал: Всё так, но применение "заменять его на умножение на 1/x где 1/x вычисляется заранее" к счетчику по модулю тоже имеет сильно опосредованное отношение) Да. 1/X относилось к делению. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Doka 1 8 января, 2019 Опубликовано 8 января, 2019 · Жалоба BTW, оператор остатка от деления удобно применять в циклах generate-for для хитрых вычислений индексов, например (там ему самое место), в этом случае на этапе препроцессора циклы разворачиваются, а все индексы вычисляются заменяясь на константы на стороне хоста. В рантайме (использования с сигналами, меняющими значение после синтеза) я бы поостерёгся бездумного использования операций деления, остатка от деления и прочих. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться