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

verilog, проверка кратности числа на sv

Добрый день, форумчане.

Глупый у меня вопрос, наверное даже должен извиниться за такую глупость =) Но все же.

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.

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

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


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

Остаток от деления на 2 -- это просто младший бит.

Проект обконстрейнен?

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


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

1 minute ago, andrew_b said:

Остаток от деления на 2 -- это просто младший бит.

Проект обконстрейнен?

2 - как пример, на нем все работает хорошо. Уже начиная от 10, схема ползет

не обконстрейен, но в TimeQuestAnalyzer по этому коду репортов нет. Я тут немного плаваю. Вот рассказываю как вижу.

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


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

1 минуту назад, new123 сказал:

2 - как пример, на нем все работает хорошо. Уже начиная от 10, схема ползет

Ну так естественно. Остаток от деления -- операция нетривиальная. Можете сами посмотреть в RTL  viewer, как она реализуется.

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

не обконстрейен, но в TimeQuestAnalyzer по этому коду репортов нет.

Логично -- нет констрейнов, нет репортов.

Необконстрейненный проект будет работать как бог на душу положит.

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


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

25 minutes ago, andrew_b said:

Логично -- нет констрейнов, нет репортов.

Необконстрейненный проект будет работать как бог на душу положит.

Понятненько. Спасибо, буду заниматься тогда

25 minutes ago, andrew_b said:

Ну так естественно. Остаток от деления -- операция нетривиальная. Можете сами посмотреть в RTL  viewer, как она реализуется.

Интересно, если я задействую bsp блок, помогло бы? Чисто из спортивного интереса. Там же они создавались для мат вычислений

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


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

По хорошему это делается так:
Отдельным счётчиком считающий до N и выдающим один импульс каждые N тактов вполне по которым и происходит запись данных. 

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


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

11 minutes ago, MegaVolt said:

По хорошему это делается так:
Отдельным счётчиком считающий до N и выдающим один импульс каждые N тактов вполне по которым и происходит запись данных. 

Спасибо. вот я так похоже и выкрутился. Я там написал в первом сообщении.

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


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

 

24 минуты назад, new123 сказал:

Спасибо. вот я так похоже и выкрутился. Я там написал в первом сообщении.

Ну так хорошее же решение. В чём сомнения?

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


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

10 minutes ago, MegaVolt said:

 

Ну так хорошее же решение. В чём сомнения?

сомнений нет, все работает. Просто хотел устранить пробелы в знаниях, неужели операция деления может так сказываться. Сейчас заполняю констрейны, проверю потом просто из любопытства с ними.

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


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

54 минуты назад, new123 сказал:

сомнений нет, все работает. Просто хотел устранить пробелы в знаниях, неужели операция деления может так сказываться. Сейчас заполняю констрейны, проверю потом просто из любопытства с ними.

Да операция деления самая дорогая из обычных действий. Дальше корень и тригонометрия. Умножение тоже не дешёвая. Но для умножения хотя бы блоки DSP есть. А для деления нужно заменять его на умножение на 1/x где 1/x вычисляется заранее.  

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


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

18 hours ago, MegaVolt said:

А для деления нужно заменять его на умножение на 1/x где 1/x вычисляется заранее.  

это будет не точно. можно просто реализовать делитель на логике) конвейризированный

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


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

8 часов назад, des00 сказал:

это будет не точно. можно просто реализовать делитель на логике) конвейризированный

Конечно можно. Вопрос зачем. Если задача получить каждый Nый импульс то деление не нужно вовсе. А если применение другое то степерь оптимизации деления и её необходимость уже каждый решает сам.

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


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

12 hours ago, MegaVolt said:

Конечно можно. Вопрос зачем. Если задача получить каждый Nый импульс то деление не нужно вовсе. А если применение другое то степерь оптимизации деления и её необходимость уже каждый решает сам.

Всё так, но применение "заменять его на умножение на 1/x где 1/x вычисляется заранее" к счетчику по модулю тоже имеет сильно опосредованное отношение)

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


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

6 часов назад, des00 сказал:

Всё так, но применение "заменять его на умножение на 1/x где 1/x вычисляется заранее" к счетчику по модулю тоже имеет сильно опосредованное отношение)

Да. 1/X относилось к делению.

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


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

BTW, оператор остатка от деления удобно применять в циклах generate-for для хитрых вычислений индексов, например (там ему самое место), в этом случае на этапе препроцессора циклы разворачиваются, а все индексы вычисляются заменяясь на константы на стороне хоста.

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

 

 

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


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

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

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

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

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

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

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

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

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

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