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

 
 
> 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
Ответов
des00
сообщение Oct 30 2012, 15:29
Сообщение #2


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(petrov @ Oct 30 2012, 06:04) *
Отпишите пожалуйста в чём там соль, пока непонятно. Взять например FFT, в симулинке это просто большая комбинационная схема, что за искусственный интеллект автоматически разобьёт это на оптимальное количество последовательных бабочек и блоков памяти. Если всё это вручную детально рисовать в симулинке, то в чём отличие от разработки цифровой схемы в схематике?

Пока я крутил только 2 вещи : Digital Filter и Viterbi Decoder. Могу ответить за них :

1. Когда крутил Digital Filter, поставил ему реализацию на цепи сумматоров (вроде инверсная реализация называется) и использование константных умножителей. Когда полез смотреть код, то увидел вполне читаемый код, в котором регистры были на своем месте, логика на своем. При этом производиться реализация умножения на битовом уровне (в столбик) и оптимизация умножения на константы (например вместо умножения на 7, он делает сдвиг на 3 и -1).
При этом в параметрах генерации этого фильтра есть настройки : конвейризация входа/выхода/логики. Когда конвейризируем вход/выход он добавляет туда регистры, когда логику, он, ЕМНИП вставляет регистры в умножители, дробя на равномерные слайсы.
Если же этот фильтр поставить в систему и задействовать Sharing Factor, задав например что тактовая в 2 раза выше символьной, то он начнет делать многотактный фильтр, если Streaming Factor, то начнет на вход одного филтьра мультиплексировать 2 разных потока (канала).
Задержку же фильтра можно учесть в модели, сделав что-то вроде back annotation, который сам генерит фильтр и добавляет нужное кол-во регистров.

2. Когда крутил Viterbi Decoder, то сначала крутил demos в 2007, он там сделан на рассыпухе и на m файлах. В этих демках все в ручную : нужна конвейризация - ставим ручками регистр. Но большой плюс, что в матлабе размерность и типы данных могут быть легко изменены, что в витерби, с его обработкой массивов сплошь и рядом.
Сравнивал его с параметрами Altera Viterbi Decoder. Корректного сравнения не получилось, т.к. в моделях реализован Register Traceback, а у Altera RAM Traceback. Но в 2012b есть компонент Viterbi Decoder HDL optimized. Когда я взял его и собрал, то он оказался по ресурсу меньше альтеровского, при этом выдает нормальный читаемый код, сам подбирает разрядности и т.д. и т.п.

На этом отложил изучение. Не до конца понял как он делает многотактную обработку и какие handshake использует. Обработку по clockenable не проверял, т.к. не всегда есть возможность делать clockenable дерево, а хотелось бы пропустить его через цепочку регистров. Но код после него, абсолютно читаемый, иерархия сохраняется. Можно загнать в симулятор и посмотреть что к чему.

ЗЫ. Открытие для меня было в 2012б наличие demos где показан синтез HDL кода с использованием multicycle paths. Как бы где матлаб, а где плисоводная времянка ...... %)

ЗЗЫ. Много примеров по генерации сделано на m языке, что у меня привело к ощущению того, что mathworks просто с xilinx/altera не договорились в свое время, плюнули на их нежелание делать высокоуровневый синтез, набрали хорошую команду и сделали свой синтезатор. Как говорилось в одном старом фильме "Чувствуется рука создателя", когда смотришь на сгенерированный код %))


--------------------
Go to the top of the page
 
+Quote Post
petrov
сообщение Oct 30 2012, 15:55
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 220
Регистрация: 21-10-04
Из: Balakhna
Пользователь №: 937



Цитата(des00 @ Oct 30 2012, 19:29) *
Пока я крутил только 2 вещи : Digital Filter и Viterbi Decoder. Могу ответить за них :


Т. е. это просто корки параметризируемые которые можно к симулинк модели подключить?
Меня интересует разработка произвольной сложной цифровой схемы, которая ни в какие корки не вписывается, есть ли там нечто, что позволяет уйти от написания ручками RTL или это будет тот же схематик вид сбоку?

Go to the top of the page
 
+Quote Post
des00
сообщение Oct 30 2012, 16:13
Сообщение #4


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(petrov @ Oct 30 2012, 09:55) *
Т. е. это просто корки параметризируемые которые можно к симулинк модели подключить?
Меня интересует разработка произвольной сложной цифровой схемы, которая ни в какие корки не вписывается, есть ли там нечто, что позволяет уйти от написания ручками RTL или это будет тот же схематик вид сбоку?

хмм, толи я объясняю не так, то ли одно из двух. найдите файл
..\toolbox\hdlcoder\hdlcoderdemos\hdlcoderviterbi.mdl
в 2007а он точно был, вот это дает синтезируемый рабочий вариант. по вашему это достаточно произвольная сложная цифровая схема?

а вот краткий список того что есть синтезируемого в демках 2012б
Код
AES.mdl
dct8_fixed.mdl
hdlArcCosine.mdl
hdlArcCosineSetting.m
hdlArcSine.mdl
hdlArcSineSetting.m
hdlCartesian2Polar.mdl
hdlcodercfir.mdl
hdlcodercpu.mdl
hdlcoderfdtd.mdl
hdlcoderfft.mdl
hdlcoderfftdit.mdl
hdlcoderfirram.mdl
hdlcodergcd.mdl
hdlcoderlms.mdl
hdlcodermimo.mdl
hdlcoderramrom.m
hdlcoderrecon.mdl
hdlcoderrecon2.mdl
hdlcoderrecon2_m.m
hdlcoderreconcmds.m
hdlcoderrecon_m.m
hdlcoderrom.slx
hdlcodervectorlms.mdl
hdlcoderviterbi.mdl
hdlcoderviterbi2.mdl
hdlcoder_aes.m
hdlcoder_agc.mdl
hdlcoder_audiofiltering.mdl
hdlcoder_bitops_eml.mdl
hdlcoder_byte2tuple_eml.mdl
hdlcoder_clockdemo.mdl
hdlcoder_counters_eml.mdl
hdlcoder_delays_eml.mdl
hdlcoder_delay_balancing.m
hdlcoder_distributed_pipelining.m
hdlcoder_dspddc.mdl
hdlcoder_edalinks_cosimulation.m
hdlcoder_eml_design_patterns.m
hdlcoder_fft32_eml.mdl
hdlcoder_fsm_eml.mdl
hdlcoder_int2bits_eml.mdl
hdlcoder_multiclock.m
hdlcoder_nibbleswap_eml.mdl
hdlcoder_ofdm_fft.mdl
hdlcoder_ofdm_fft_eml.mdl
hdlcoder_ofdm_fft_eml_m.m
hdlcoder_ofdm_fft_m.m
hdlcoder_saturate_eml.mdl
hdlcoder_serial_fft_butterfly.m
hdlcoder_sharing_optimization.m
hdlcoder_slsysgen.slx
hdlcoder_slsysgen_preload.m
hdlcoder_slsysgen_stop.m
hdlcoder_sobel_serial_eml.mdl
hdlcoder_streaming_optimization.m
hdlcoder_system_generator_subsystem.m
hdlcoder_vectorized_lms_eml.mdl
hdlcordic_eml.mdl
hdledascripts.m
hdlfirtdecim_multicycle.mdl
hdl_areaopt1.mdl
hdl_cosim_demo1.mdl
hdl_cosim_demo2.mdl
hdl_cosim_demo3.mdl
hdl_cosim_demo4.mdl
hdl_delaybalancing.mdl
mcombo.mdl
mpipe_multchain.mdl
sfir_fixed.mdl
sfir_fixed_pipe1.m
sfir_fixed_pipe2.m


--------------------
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
- - ИльяКи   ЦитатаМожно взять Simulink и вставить как блок-мод...   Sep 19 2012, 13:42
|- - 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
|- - Kuzmi4   Цитата(ИльяКи @ Sep 19 2012, 16:42) Ну эт...   Sep 24 2012, 18:30
- - ИльяКи   Да уж, ничего больше не остается - пытать саппорт ...   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
- - 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 - 09:39
Рейтинг@Mail.ru


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