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

 
 
> MATLAB R2012a HDL Code Generation, непонятки с типами, знаками, размерностями
LiNED
сообщение Sep 17 2012, 13:25
Сообщение #1





Группа: Участник
Сообщений: 14
Регистрация: 29-09-11
Пользователь №: 67 465



Написал простую функцию, расчет положения при падении объекта в воздухе. На вход подаются текущие координаты (in_x, in_y), текущая скорость (in_spdx, in_spdy), масса объекта(mass), коэффициенты для горизонтального/вертикального сопротивления воздуха (R_x, R_y) и частота дискретизации (sample_time).
Сначала вычисляю конечные составляющие скорости: вертикальную составляющую с учетом силы тяжести и коэффициента сопротивления воздуха, и вертикальную просто с учетом коэффициента сопротивления воздуха.
Потом вычисляю координаты, при этом беру скорость как среднее арифметическое от начальной/конечной скоростей.
Это для понимания ситуации, код MATLAB привожу ниже:

Код
function [out_x, out_y, out_spdx, out_spdy] = par_model(in_x, in_y, in_spdx, in_spdy, mass, R_x, R_y,sample_time)
    
    out_spdx = in_spdx + R_x*in_spdx*in_spdx/mass;
    out_spdy = in_spdy + ((R_y*in_spdy*in_spdy/mass)-9.8);
    
    out_x = in_x + (out_spdx+in_spdx)*sample_time/2.0;
    out_y = in_y + (out_spdy+in_spdy)*sample_time/2.0;
end


Соответственно, тестовое окружение для него работает следующим образом. Беру большие массивы нулей, даю в первом значении начальные условия, задаю коэффициенты и массу, и последовательно забиваю массивы числами пока объект не достигнет земли (т.е. пока текущая координата y(i) не станет отрицательной или равной нулю) либо пока не кончится массив. Код ниже, содержит два теста:

Код
% INIT ARRAYS
x = zeros(10000,1,'double');
y = zeros(10000,1,'double');
vx = zeros(10000,1,'double');
vy = zeros(10000,1,'double');

%
%TEST ONE
%
H = 1000;

x(1) = 2;
y(1) = H;
vx(1) = 2;
vy(1) = 0;
K_x = -0.001;
K_y = 0.001;

m = 1;
sample_time = 0.002;

i = 1;

while y(i)>=0 && i<=10000
   [x(i+1), y(i+1), vx(i+1), vy(i+1)] = par_model(x(i), y(i), vx(i), vy(i), m, K_x, K_y, sample_time);
   i = i + 1;
end

subplot(2,1,1);
plot(x(1:i)+1i*y(1:i));

%
%TEST TWO
%
H = 100;

x(1) = 4;
y(1) = H;
vx(1) = 2;
vy(1) = 0;
K_x = 0.0001;
K_y = 0.003;

m = 1;
sample_time = 0.002;

i = 1;

while y(i)>=0 && i<=1000
   [x(i+1), y(i+1), vx(i+1), vy(i+1)] = par_model(x(i), y(i), vx(i), vy(i), m, K_x, K_y, sample_time);
   i = i + 1;
end

subplot(2,1,2);
plot(x(1:i)+1i*y(1:i));


Теперь собственно описание проблемы:
Попытка сгенерировать для этого кода вариант с фиксированной точкой приводит к следующей ошибке:
-------------- output variable : out_x --------------
Matrix dimensions must agree.
При этом графики строятся, но на них показан бред - объект вместо того, чтобы плавно падать, стремительно взлетает ввысь. Моделирование исходного кода заканчивается успешно и без ошибок/предупреждений.
Еще выяснилось, что:
Деление пополам (при вычислении среднего арифметического) кодер заменяет на смещение на разряд, при этом благополучно игнорируя знаковость. А поскольку для вертикальной координаты делимое, как правило, отрицательно - ясно почему взлетает объект.
Также выяснилось, что масса благополучно округляется с единицы на ноль, в результате чего моделирование готового fixed point тестового окружения приводит к куче ошибок типа деления на ноль.
Самое печальное, что попытки зафиксировать типы для значений не решают проблемы, выставлял для всех переменных ufix16_En24, ставил для массы целочисленный тип, но все равно в результатах получался бред.

Есть у кого предложения по решению этих проблем?

Сообщение отредактировал LiNED - Sep 17 2012, 13:53
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ИльяКи
сообщение Sep 19 2012, 13:42
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 30-01-10
Из: Таганрог
Пользователь №: 55 160



Цитата
Можно взять Simulink и вставить как блок-модули вашу логику а место где деление - вставить как Verilog файл. Помниться мы так делали когда нас не устраивали ньюансы laughing.gif правда много вставлять Verilog-а не получалось - жаба падала, но в ключевых моментах это нам помогло.

Ну это костыли еще посуровее будут, получается надо препарировать модель в местах деления пополам, такое зверство над моделью maniac.gif Безусловно, мне как начинающему будет полезно поманьячить лишний раз, но для чего-то серьезного надо бы уходить от подобной практики.

Послушать отзывы так попытки использования MATLAB для мало-мальски эффективной HDL-генерации пока что есть утопия и лучше сразу писать в HDL. А так радужно это дело мне описывали, мол, написал функцию - она сразу так красиво сама в код заделалась и хоть сразу компиль и зашивай в ПЛИСину или разводи в ASIC, только настройки успевай выставлять. А оказалось что эта система даже об элементарную арифметику уже спотыкается =_=
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Sep 24 2012, 18:30
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



Цитата(ИльяКи @ Sep 19 2012, 16:42) *
Ну это костыли еще посуровее будут, получается надо препарировать модель в местах деления пополам, такое зверство над моделью maniac.gif Безусловно, мне как начинающему будет полезно поманьячить лишний раз, но для чего-то серьезного надо бы уходить от подобной практики.

На счёт препарирования - из того что видел, такая метода позволяет существенно сократить время на разработку когда нарисовался какой то глюк через криворукость кодера или свою (или скорость не дотягивает), времени разбираться нет потому что нужно на "позавчера" и оно всё работает. Просто, как было сказано, нужно иметь представление о вн. структуре алгоритма, тогда такие "препарации" будут не очень болезненными, ну или представлять как оно может быть приблизительно реализовано на камне - тогда ещё проще laughing.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- LiNED   MATLAB R2012a HDL Code Generation   Sep 17 2012, 13:25
- - LiNED   Поставил 2.0001 вместо 2, строго задал fraction le...   Sep 18 2012, 06:11
- - Kuzmi4   Цитата(LiNED @ Sep 17 2012, 16:25) ... Ес...   Sep 18 2012, 14:38
- - des00   /me наслушавшись манагеров и саппортеров матлаба ...   Sep 18 2012, 15:32
|- - Gate   Цитата(des00 @ Sep 18 2012, 19:32) Народ,...   Sep 20 2012, 07:49
|- - des00   Цитата(Gate @ Sep 20 2012, 02:49) Советую...   Sep 20 2012, 08:43
|- - Gate   Цитата(des00 @ Sep 20 2012, 12:43) хмм, а...   Sep 20 2012, 19:29
- - litv   Для ЦОС однозначно надо уходить в МАТЛАБ ( Xilinx ...   Sep 19 2012, 04:00
|- - des00   Цитата(litv @ Sep 18 2012, 22:00) Для ЦОС...   Sep 19 2012, 04:33
- - litv   Чистый нэтивный не пользую. У Xilinx явно более вы...   Sep 19 2012, 04:55
|- - des00   Цитата(litv @ Sep 18 2012, 22:55) Проекты...   Sep 19 2012, 05:31
- - litv   m язык же конечно ограниченный (if ,case, for, ти...   Sep 19 2012, 05:39
|- - des00   Цитата(litv @ Sep 18 2012, 23:39) Моделир...   Sep 19 2012, 06:17
- - litv   Simulink моделирует раз в 10 быстрее VHDL симулято...   Sep 19 2012, 06:31
|- - des00   Цитата(litv @ Sep 19 2012, 01:31) Обратны...   Sep 19 2012, 07:26
|- - litv   Цитата(des00 @ Sep 19 2012, 11:26) Вот пр...   Sep 19 2012, 08:15
|- - des00   Цитата(litv @ Sep 19 2012, 03:15) Вообще ...   Sep 19 2012, 09:09
- - litv   На всякий случай я говорил за m-язык Xilinx System...   Sep 19 2012, 10:41
|- - des00   Цитата(ИльяКи @ Sep 19 2012, 07:42) Послу...   Sep 19 2012, 14:40
|- - Tue   Попробую повыступать в защиту HDL Code Generation ...   Sep 24 2012, 17:38
||- - des00   Цитата(Tue @ Sep 24 2012, 12:38) Да много...   Sep 28 2012, 15:37
||- - Tue   Цитата(des00 @ Sep 28 2012, 19:37) ...сго...   Oct 1 2012, 18:16
||- - des00   Цитата(Tue @ Oct 1 2012, 12:16) А есть ка...   Oct 2 2012, 03:25
- - ИльяКи   Да уж, ничего больше не остается - пытать саппорт ...   Sep 20 2012, 05:07
- - syoma   Хочу написать, как пользователь Xilinx System Gene...   Oct 4 2012, 12:55
|- - Goose   Цитата(syoma @ Oct 4 2012, 15:55) Хочу на...   Oct 26 2012, 06:14
|- - Mogwaika   Цитата(syoma @ Oct 4 2012, 16:55) У меня ...   Nov 1 2012, 19:15
- - x736C   Мы перевели разработку модема на рельсы модельно-о...   Oct 30 2012, 07:30
|- - petrov   Цитата(x736C @ Oct 30 2012, 11:30) Мы пер...   Oct 30 2012, 10:01
|- - des00   Цитата(petrov @ Oct 30 2012, 04:01) Как о...   Oct 30 2012, 11:43
|- - petrov   Цитата(des00 @ Oct 30 2012, 15:43) У меня...   Oct 30 2012, 12:04
|- - x736C   Цитата(petrov @ Oct 30 2012, 16:04) Если ...   Oct 30 2012, 13:05
- - des00   Цитата(petrov @ Oct 30 2012, 06:04) Отпиш...   Oct 30 2012, 15:29
|- - petrov   Цитата(des00 @ Oct 30 2012, 19:29) Пока я...   Oct 30 2012, 15:55
|- - des00   Цитата(petrov @ Oct 30 2012, 09:55) Т. е....   Oct 30 2012, 16:13
- - Gold777   Кто-нибудь использовал Матлаб или Симулинк для реа...   Jul 19 2013, 18:07
|- - Mogwaika   Цитата(Gold777 @ Jul 19 2013, 22:07) Кто-...   Oct 14 2013, 07:18
- - DASM   Надо будет попробовать, но после того как мне Матл...   Jul 22 2013, 00:19
- - Gold777   Быстро пришлось отказаться от использования мегафу...   Jul 22 2013, 16:21
- - DASM   Много времени в смысле на разработку ? Кстати по в...   Jul 22 2013, 19:12
- - Gold777   Написание своих блоков декодирования потребовало г...   Jul 23 2013, 15:41
- - DASM   Развертывание циклов. Которые он сам и генерит. Ну...   Jul 23 2013, 15:52
- - foxer   В качестве обзорной информации по генерации HDL из...   Oct 16 2013, 09:01
- - filo   встроенный HDL coder вполне читабельный код генери...   Nov 25 2013, 16:16
- - svetlika   Кто-нибудь использовал Матлаб или Симулинк для реа...   Jun 5 2014, 04:24
|- - des00   Цитата(svetlika @ Jun 5 2014, 11:24) инте...   Sep 30 2014, 03:13
- - petrov   Как в симулинке параметризируемую enabled линию за...   Sep 28 2014, 17:05


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

 


RSS Текстовая версия Сейчас: 25th June 2025 - 16:44
Рейтинг@Mail.ru


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