|
MATLAB R2012a HDL Code Generation, непонятки с типами, знаками, размерностями |
|
|
|
Sep 17 2012, 13:25
|
Группа: Участник
Сообщений: 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
|
|
|
|
|
 |
Ответов
|
Oct 30 2012, 15:29
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 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 не договорились в свое время, плюнули на их нежелание делать высокоуровневый синтез, набрали хорошую команду и сделали свой синтезатор. Как говорилось в одном старом фильме "Чувствуется рука создателя", когда смотришь на сгенерированный код %))
--------------------
|
|
|
|
|
Oct 30 2012, 16:13
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 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
--------------------
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|