GMavr 0 17 августа, 2017 Опубликовано 17 августа, 2017 · Жалоба Есть микросхемка от Texas Instuments с DSP ядром внутри (точнее miniDSP). TI документацию на ядро давать не хочет. Есть желание задействовать DSP ядро в своих целях. Есть некоторое количество ассемблерных исходников. Но вот проблема - я впервые вижу подобный ассемблер. Вот к примеру генератор синуса: ;== Component Interface == ; .port ToneGenerator_1.Ch1_Out ToneGenerator_1_Ch_Out ; Data Declarations for output .data_miniDSP_D ToneGenerator_1_Ch_Out ; Data format 3.yy ; ;Coefficients Definitions .coeff_miniDSP_D ToneGenerator_1_Status =256 @5 ; .coeff_miniDSP_D ToneGenerator_1_alpha =0,8526401519775390625M1 @5+1 ; .coeff_miniDSP_D ToneGenerator_1_beta =-0,2612493038177490234375M1 @5+2 ; .coeff_miniDSP_D ToneGenerator_1_Amplitude =0,5M2 @5+3 ;not used but added to use same DLL as quad .coeff_miniDSP_D ToneGenerator_1_Minus_stopped =-25344 ;Data Definitions .data_miniDSP_D ToneGenerator_1_Out(n) .data_miniDSP_D ToneGenerator_1_Out(n-1) .data_miniDSP_D ToneGenerator_1_Out(n-2) .data_miniDSP_D ToneGenerator_1_Status(n) .data_miniDSP_D ToneGenerator_1_Status(n-1) ; ; .codeblock ToneGenerator_1_Block target=miniDSP_D, cycles=15, stream=Primary, component=ToneGenerator_1 acc_init ToneGenerator_1_Status data_one compare ToneGenerator_1_Minus_stopped data_one compare MinusOne_M1 ToneGenerator_1_Status(n-1) acc_init ToneGenerator_1_beta data_one write 0 ToneGenerator_1_Status(n) jump jmp_eq ToneGenerator_1_Stopped ;current status is start acc_init Zero data_one jump jmp_eq ToneGenerator_1_RunwoInit ;Do init here write 0 ToneGenerator_1_Out(n-2) acc_init MinusOne_M1 ToneGenerator_1_Out(n-2) write 0 ToneGenerator_1_Out(n-1) ;acc_2 ToneGenerator_1_alpha ToneGenerator_1_Out(n-1) // not required because Out(n-1) is zero jump jmp ToneGenerator_1_Run ToneGenerator_1_RunwoInit: ;nop balance acc_init MinusOne_M1 ToneGenerator_1_Out(n-2) acc_2 ToneGenerator_1_alpha ToneGenerator_1_Out(n-1) nop nop ToneGenerator_1_Run: jump jmp ToneGenerator_1_Done; ToneGenerator_1_Stopped: acc_init Zero data_one nop ;nop balance nop nop nop nop nop ToneGenerator_1_Done: write 0 ToneGenerator_1_Out(n) write 0 ToneGenerator_1_Ch_Out .endcodeblock Формулы, по которым он работает: Out (n) = 2*ToneGenerator_1_alpha * Out (n-1) - Out (n-2) Инициализация: Out (-1) = 0 Out (-2) = ToneGenerator_1_beta Кто-нибудь сталкивался с подобным ассемблером? Может быть есть какая-то документация на DSP процессор, у которого похожий ассемблер? Если кому интересно acc_init a b помещает в аккумулятор a*b, т.е. Акк = a*b acc a b -> Акк = Акк + a*b acc_2 a b -> Акк = Акк + 2*a*b Есть еще команды Init_abs, Writef, Writecoeff, mult, Acc_abs, AC_R_AC, AC_F_AC, AC_RW_AC, ACC_INIT_DATAPAD, ACC_SUB И так далее. Полный список можно вытащить из компилятора. Но вот что они делают? И зачем так много NOP-ов в исходниках? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 18 августа, 2017 Опубликовано 18 августа, 2017 · Жалоба Есть микросхемка от Texas Instuments с DSP ядром внутри (точнее miniDSP). TI документацию на ядро давать не хочет. Есть желание А маркировка на чипе отсутствует? Или это шарада, которую надо отгадать участникам форума? Формулы, по которым он работает: Out (n) = 2*ToneGenerator_1_alpha * Out (n-1) - Out (n-2) Простейший рекуррентный расчёт синуса по формуле из школьной программы. С накоплением ошибки. Кто-нибудь сталкивался с подобным ассемблером? Может быть есть какая-то документация на DSP процессор, у которого похожий ассемблер? Вы уверены, что это именно команды ассемблера? То, что Вы привели больше похоже на макросы. PS: А зачем так нужен именно этот таинственный DSP если полно открытых МК, с полными доками?? И, если речь только про синус, то и ARM с ним вполне справится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GMavr 0 22 августа, 2017 Опубликовано 22 августа, 2017 · Жалоба Вы уверены, что это именно команды ассемблера? То, что Вы привели больше похоже на макросы. Да. Уверен что это ассемблер. PS: А зачем так нужен именно этот таинственный DSP если полно открытых МК, с полными доками?? И, если речь только про синус, то и ARM с ним вполне справится. Этот DSP - не отдельная микросхема. Это часть кодека (tlv320aicXXXX - там много таких). Документация на микросхему в целом есть. А вот на встроенный DSP - нет. Есть только некоторые готовые алгоритмы для него, которые по факту оказались не нужны. Для обработки данных используется Cortex M7. Но он уже не справляется. И к сожалению, нужны более сложные алгоритмы, чем генерация синуса. Идея - перебросить часть задач на DSP в кодеке. И не переделывать плату. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 22 августа, 2017 Опубликовано 22 августа, 2017 · Жалоба ...зачем так много NOP-ов в исходниках? Для выравнивания времени выполнения по веткам. Идея - перебросить часть задач на DSP в кодеке. И не переделывать плату. Когда есть возможности: 1. Переделать аппаратную платформу 2. Постараться оптимизировать алгоритмы под имеющийся Cortex M7 3. Реверсить неведому зверушку, которая, весьма возможно, окажется непригодна для реализации целевого алгоритма Выбор п.3 представляется не лучшей идеей. А TI ничего не расскажут, они такие. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 23 августа, 2017 Опубликовано 23 августа, 2017 · Жалоба Да. Уверен что это ассемблер. Этот DSP - не отдельная микросхема. Это часть кодека (tlv320aicXXXX - там много таких). Документация на микросхему в целом есть. А вот на встроенный DSP - нет. Есть только некоторые готовые алгоритмы для него, которые по факту оказались не нужны. Для обработки данных используется Cortex M7. Но он уже не справляется. И к сожалению, нужны более сложные алгоритмы, чем генерация синуса. Идея - перебросить часть задач на DSP в кодеке. И не переделывать плату. Не знаю, видели ли вы это в SLAU497A (выделено мной): 2.12 miniDSP The TLV320AIC3254-Q1 features two miniDSP cores. The first miniDSP core is tightly coupled to the ADC, the second miniDSP core is tightly coupled to the DAC. The fully programmable algorithms for the miniDSP must be loaded into the device after power up. The miniDSPs have direct access to the digital stereo audio stream on the ADC and on the DAC side, offering the possibility for advanced, very-low group delay DSP algorithms. Each miniDSP can run up to 1152 instructions on every audio sample at a 48kHz sample rate. The two cores can run fully synchronized and can exchange data. Typical algorithms for the TLV320AIC3254-Q1 miniDSPs are active noise cancellation, acoustic echo cancellation or advanced DSP sound enhancement algorithms. 2.12.1 Software Software development for the TLV320AIC3254-Q1 is supported through TI's comprehensive PurePath Studio Development Environment; a powerful, easy-to-use tool designed specifically to simplify software development on the TLV320AIC3254-Q1 miniDSP audio platform. The Graphical Development Environment consists of a library of common audio functions that can be dragged-and-dropped into an audio signal flow and graphically connected together. The DSP code can then be assembled from the graphical signal flow with the click of a mouse. Please visit the TLV320AIC3254-Q1 product folder on www.ti.com to learn more about PurePath Studio and the latest status on available, ready-to-use DSP algorithms. M7 такую производительность не обеспечивает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 23 августа, 2017 Опубликовано 23 августа, 2017 · Жалоба M7 такую производительность не обеспечивает? 48000*1152*2 = 110592000 инструкций. Только вот инструкции DSP и ARM - это обычно несколько разные вещи. В тех DSP, на асме которых я работал, одна инструкция могла выполнить два MAC при этом загрузить данные из памяти и записать данные в память. И всё это за один такт. И при том, что это выполнялось в аппаратном цикле (не требовало SUBS R0, #1; BNE loop в конце цикла) и с аппаратной циклической адресацией. И с другими параллельными плюшками. А на ARM MAC-операция между 2-я значениями в памяти: LDR R0, [R3] LDR R1, [R4], #4 SMMLAR R2, R1, R0, R2 STR R2, [R3], #4 итого: 7 тактов в сумме (при выполнении из ОЗУ)! а нормальный DSP может несколько таких за такт сделать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 23 августа, 2017 Опубликовано 23 августа, 2017 · Жалоба Только вот инструкции DSP и ARM - это обычно несколько разные вещи. Так DSP и miniDSP - это тоже две большие разницы. Едва ли от встраиваемой в кодек "вычислялки" можно ждать серьезной производительности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 23 августа, 2017 Опубликовано 23 августа, 2017 · Жалоба Так DSP и miniDSP - это тоже две большие разницы. Едва ли от встраиваемой в кодек "вычислялки" можно ждать серьезной производительности. Но возможно, что она имеет специализированные команды. Подходящие под задачу. Хотя согласен с Вами: ТС скорей всего в конце-концов пойдёт путём корректировки платы. И правильно! :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться