|
Дробные параметры в Верилоге |
|
|
|
Nov 20 2017, 08:19
|
Местный
Группа: Участник
Сообщений: 239
Регистрация: 15-11-09
Из: Санкт-Петербург
Пользователь №: 53 639
|
Коллеги, что-то не могу сообразить как решить такую простую задачку. Есть простой модуль, который задаёт следующие друг за другом временные интервалы. Он работает на некоторой тактовой частоте. Соответственно, по ТЗ временные интервалы заданы в миллисекундах. Можно, конечно, пересчитать длительность интервалов в число на выходе счётчика на данной тактовой частоте и успокоиться. Но как-то это не изящно: изменилась тактовая частота, или временнАя диаграмма - садись за калькулятор и пересчитывай. А как бы вот так сделать, что бы время и тактовая частота задавалась в параметрах модуля сразу в мсек и МГц, соответственно, а в модуле автоматом пересчитывалось в такты счётчика?
|
|
|
|
|
Nov 20 2017, 09:05
|
Местный
Группа: Участник
Сообщений: 239
Регистрация: 15-11-09
Из: Санкт-Петербург
Пользователь №: 53 639
|
Цитата(blackfin @ Nov 20 2017, 11:28) localparam max_cntr = $rtoi(frequency * interval) ; Спасибо, но, увы: Error (10174): Verilog HDL Unsupported Feature error at encodersimitation.v(26): system function "$rtoi" is not supported for synthesis
|
|
|
|
|
Nov 20 2017, 09:27
|
Профессионал
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643
|
Приветствую! Цитата(Kluwert @ Nov 20 2017, 12:05) Спасибо, но, увы: Error (10174): Verilog HDL Unsupported Feature error at encodersimitation.v(26): system function "$rtoi" is not supported for synthesis Можно просто max_cntr = (frequency * interval); Обычно синтезатор сам округлит результат умножения до целого. Поворчав warning-ом для причия что "... мол округляю...". В зависимости от синтезатора и поддерживаемой версии Verilog можно и так: integer'(frequency * interval) чтоб не ворчал; Удачи! Rob.
|
|
|
|
|
Nov 20 2017, 11:02
|
Местный
Группа: Участник
Сообщений: 239
Регистрация: 15-11-09
Из: Санкт-Петербург
Пользователь №: 53 639
|
Цитата(RobFPGA @ Nov 20 2017, 12:27) Можно просто max_cntr = (frequency * interval); Обычно синтезатор сам округлит результат умножения до целого. Поворчав warning-ом для причия что "... мол округляю...". Увы, тоже мимо. Округлять синтезатор Квартуса не захотел: сообщил, что с real variable data type он работать не намерен. Единственным пока решением проблемы оказалось установка в модуль подмодулей FP-умножения и округления до целых. Когда на входе постоянные, то компайлер этот огромный умножитель несколько упрощает, но, всё равно всё настолько громоздким становится, что, похоже, калькулятор - самое простое решение
|
|
|
|
|
Nov 20 2017, 11:13
|
Профессионал
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643
|
Приветствую! Цитата(Kluwert @ Nov 20 2017, 14:02) Увы, тоже мимо. Округлять синтезатор Квартуса не захотел: сообщил, что с real variable data type он работать не намерен. Единственным пока решением проблемы оказалось установка в модуль подмодулей FP-умножения и округления до целых. Когда на входе постоянные, то компайлер этот огромный умножитель несколько упрощает, но, всё равно всё настолько громоздким становится, что, похоже, калькулятор - самое простое решение Можете привести тут часть кода на которую ругается Qu? Удачи! Rob.
|
|
|
|
|
Nov 20 2017, 13:06
|
Частый гость
Группа: Участник
Сообщений: 82
Регистрация: 20-04-06
Пользователь №: 16 295
|
Цитата(iosifk @ Nov 20 2017, 15:43) У ТС речь идет о "localparam", который вычисляется по формуле. И при чем тут "логики немеренно уйдет"? Ведь сама формула - не синтезируется... Младшие биты, которые лишние - тоже будут участвовать в арифметических операциях. То есть если домножили скажем на 1000 - появляется 10 битов которые надо туда-сюда таскать по RTL, а в конечном итоге отбросить. Я так делал когда-то давно когда писал преобразование цвета из одной системы в другую (например RGB -> HSB). Там коэффициенты были как раз дробные и передавались параметрами. Далее я их формулами в теле делал целыми (домножал) что естественно не синтезировалось, потом непосредственно в верилоге все это перемножал/суммировал, а потом отбрасывал младшие биты. В итоге получалась гора логики, которая влияла на 1-2 младших бита в конечном результате - то есть она не была оптимизирована при синтезе, но по сути являлась балластом.
Сообщение отредактировал Tosha1984 - Nov 20 2017, 13:08
|
|
|
|
|
Nov 20 2017, 13:41
|
Местный
Группа: Участник
Сообщений: 239
Регистрация: 15-11-09
Из: Санкт-Петербург
Пользователь №: 53 639
|
Цитата(iosifk @ Nov 20 2017, 15:43) У ТС речь идет о "localparam", который вычисляется по формуле. И при чем тут "логики немеренно уйдет"? Ведь сама формула - не синтезируется... Иосиф прав, во-первых, синтезироваться-то ничего и не должно, это - постоянные. Во-вторых, аппроксимировать деление на степени 10 делением на степени 2 - это как-то уж совсем грубо. Но, ваша идея мне подсказала, походу самый оптимальный путь: время не в мкс, а в нс. Т.е., как-то так: parameter F_CLK_MHZ = 230; parameter T_PULSE_NS = 275300; `define COUNTER_MAX (F_CLK*T_PULSE_NS/1000) Проверил, Квартус прожевал, вроде работает. Но всё-таки осадочек остался: почему нельзя было хотя бы для постоянных реализовать функцию $rtoi я не понимаю.
|
|
|
|
|
Nov 20 2017, 14:19
|
Местный
Группа: Участник
Сообщений: 239
Регистрация: 15-11-09
Из: Санкт-Петербург
Пользователь №: 53 639
|
Цитата(blackfin @ Nov 20 2017, 16:46) Так проверьте еще через параметр: пост #10. Сорри, коллега, не заметил ваш пост. Слушайте, да, похоже работает и ваш способ похоже лучший на данный момент!Спасибо! Вот ведь меня на define'ах заклинило
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|