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

    

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

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

 

 

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти