реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Дробные параметры в Верилоге
Kluwert
сообщение Nov 20 2017, 08:19
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 239
Регистрация: 15-11-09
Из: Санкт-Петербург
Пользователь №: 53 639



Коллеги,
что-то не могу сообразить как решить такую простую задачку. Есть простой модуль, который задаёт следующие друг за другом временные интервалы. Он работает на некоторой тактовой частоте. Соответственно, по ТЗ временные интервалы заданы в миллисекундах. Можно, конечно, пересчитать длительность интервалов в число на выходе счётчика на данной тактовой частоте и успокоиться. Но как-то это не изящно: изменилась тактовая частота, или временнАя диаграмма - садись за калькулятор и пересчитывай.
А как бы вот так сделать, что бы время и тактовая частота задавалась в параметрах модуля сразу в мсек и МГц, соответственно, а в модуле автоматом пересчитывалось в такты счётчика?
Go to the top of the page
 
+Quote Post
blackfin
сообщение Nov 20 2017, 08:28
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261



localparam max_cntr = $rtoi(frequency * interval) ;
Go to the top of the page
 
+Quote Post
Kluwert
сообщение Nov 20 2017, 09:05
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Nov 20 2017, 09:27
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
Kluwert
сообщение Nov 20 2017, 11:02
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 239
Регистрация: 15-11-09
Из: Санкт-Петербург
Пользователь №: 53 639



Цитата(RobFPGA @ Nov 20 2017, 12:27) *
Можно просто max_cntr = (frequency * interval);
Обычно синтезатор сам округлит результат умножения до целого. Поворчав warning-ом для причия что "... мол округляю...".

Увы, тоже мимо. Округлять синтезатор Квартуса не захотел: сообщил, что с real variable data type он работать не намерен. Единственным пока решением проблемы оказалось установка в модуль подмодулей FP-умножения и округления до целых. Когда на входе постоянные, то компайлер этот огромный умножитель несколько упрощает, но, всё равно всё настолько громоздким становится, что, похоже, калькулятор - самое простое решение sad.gif
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Nov 20 2017, 11:13
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643



Приветствую!

Цитата(Kluwert @ Nov 20 2017, 14:02) *
Увы, тоже мимо. Округлять синтезатор Квартуса не захотел: сообщил, что с real variable data type он работать не намерен. Единственным пока решением проблемы оказалось установка в модуль подмодулей FP-умножения и округления до целых. Когда на входе постоянные, то компайлер этот огромный умножитель несколько упрощает, но, всё равно всё настолько громоздким становится, что, похоже, калькулятор - самое простое решение sad.gif


Можете привести тут часть кода на которую ругается Qu?

Удачи! Rob.
Go to the top of the page
 
+Quote Post
Tosha1984
сообщение Nov 20 2017, 12:32
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 82
Регистрация: 20-04-06
Пользователь №: 16 295



Можо в лоб если точность не критична.
Помножьте параметр на 10 в требуемой степени, чтоб сделать целым.
Осуществите все требуемые арифметические операции с целыми числами.
У полученного результата отбросьте требуемое количество младших битов (ну то есть если умножали на 10 - отбросьте 3).
Результат будет с точностью до степени 2. Ну и логики конечно возможно немеренно уйдет на такое.

Сообщение отредактировал Tosha1984 - Nov 20 2017, 12:38
Go to the top of the page
 
+Quote Post
iosifk
сообщение Nov 20 2017, 12:43
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Tosha1984 @ Nov 20 2017, 15:32) *
Результат будет с точностью до степени 2. Ну и логики конечно возможно немеренно уйдет на такое.

У ТС речь идет о "localparam", который вычисляется по формуле. И при чем тут "логики немеренно уйдет"? Ведь сама формула - не синтезируется...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Tosha1984
сообщение Nov 20 2017, 13:06
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
blackfin
сообщение Nov 20 2017, 13:18
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261



Цитата(Kluwert @ Nov 20 2017, 14:02) *
Увы, тоже мимо. Округлять синтезатор Квартуса не захотел: сообщил, что с real variable data type он работать не намерен.

Тогда так:

localparam integer max_cntr = frequency * interval;
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 20 2017, 13:25
Сообщение #11


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Переведите мегагерцы в наносекунды и делите свои миллисекунды на наносекунды.
Go to the top of the page
 
+Quote Post
Kluwert
сообщение Nov 20 2017, 13:41
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 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 я не понимаю.
Go to the top of the page
 
+Quote Post
blackfin
сообщение Nov 20 2017, 13:46
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261



Цитата(Kluwert @ Nov 20 2017, 16:41) *
Но всё-таки осадочек остался: почему нельзя было хотя бы для постоянных реализовать функцию $rtoi я не понимаю.

Так проверьте еще через параметр: пост #10.
Go to the top of the page
 
+Quote Post
Kluwert
сообщение Nov 20 2017, 14:19
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 239
Регистрация: 15-11-09
Из: Санкт-Петербург
Пользователь №: 53 639



Цитата(blackfin @ Nov 20 2017, 16:46) *
Так проверьте еще через параметр: пост #10.

Сорри, коллега, не заметил ваш пост. Слушайте, да, похоже работает и ваш способ похоже лучший на данный момент!Спасибо! Вот ведь меня на define'ах заклинило sm.gif
Go to the top of the page
 
+Quote Post
blackfin
сообщение Nov 20 2017, 14:24
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261



Цитата(Kluwert @ Nov 20 2017, 17:19) *
Слушайте, да, похоже работает и ваш способ похоже лучший на данный момент! Спасибо!

Это не мой способ. Это способ RobFPGA. Его и благодарите.. biggrin.gif
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th April 2024 - 00:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01617 секунд с 7
ELECTRONIX ©2004-2016