Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Можно ли определить DSP ядро по ассемлеру?
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Сигнальные процессоры и их программирование - DSP
GMavr
Есть микросхемка от Texas Instuments с DSP ядром внутри (точнее miniDSP). TI документацию на ядро давать не хочет. Есть желание
задействовать DSP ядро в своих целях. Есть некоторое количество ассемблерных исходников. Но вот проблема - я впервые
вижу подобный ассемблер. Вот к примеру генератор синуса:

CODE
;== 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
Цитата(GMavr @ Aug 18 2017, 00:58) *
Есть микросхемка от Texas Instuments с DSP ядром внутри (точнее miniDSP). TI документацию на ядро давать не хочет. Есть желание

А маркировка на чипе отсутствует? Или это шарада, которую надо отгадать участникам форума?

Цитата(GMavr @ Aug 18 2017, 00:58) *
Формулы, по которым он работает:
Out (n) = 2*ToneGenerator_1_alpha * Out (n-1) - Out (n-2)

Простейший рекуррентный расчёт синуса по формуле из школьной программы. С накоплением ошибки.

Цитата(GMavr @ Aug 18 2017, 00:58) *
Кто-нибудь сталкивался с подобным ассемблером? Может быть есть какая-то документация на DSP процессор, у которого похожий ассемблер?

Вы уверены, что это именно команды ассемблера? То, что Вы привели больше похоже на макросы.

PS: А зачем так нужен именно этот таинственный DSP если полно открытых МК, с полными доками??
И, если речь только про синус, то и ARM с ним вполне справится.
GMavr
QUOTE (jcxz @ Aug 19 2017, 00:06) *
Вы уверены, что это именно команды ассемблера? То, что Вы привели больше похоже на макросы.

Да. Уверен что это ассемблер.


QUOTE (jcxz @ Aug 19 2017, 00:06) *
PS: А зачем так нужен именно этот таинственный DSP если полно открытых МК, с полными доками??
И, если речь только про синус, то и ARM с ним вполне справится.

Этот DSP - не отдельная микросхема. Это часть кодека (tlv320aicXXXX - там много таких). Документация на микросхему в целом есть.
А вот на встроенный DSP - нет. Есть только некоторые готовые алгоритмы для него, которые по факту оказались не нужны.
Для обработки данных используется Cortex M7. Но он уже не справляется. И к сожалению, нужны более сложные алгоритмы, чем генерация синуса.
Идея - перебросить часть задач на DSP в кодеке. И не переделывать плату.
aaarrr
Цитата(GMavr @ Aug 18 2017, 00:58) *
...зачем так много NOP-ов в исходниках?

Для выравнивания времени выполнения по веткам.

Цитата(GMavr @ Aug 23 2017, 01:05) *
Идея - перебросить часть задач на DSP в кодеке. И не переделывать плату.

Когда есть возможности:
1. Переделать аппаратную платформу
2. Постараться оптимизировать алгоритмы под имеющийся Cortex M7
3. Реверсить неведому зверушку, которая, весьма возможно, окажется
непригодна для реализации целевого алгоритма

Выбор п.3 представляется не лучшей идеей. А TI ничего не расскажут, они такие.
Obam
Цитата(GMavr @ Aug 23 2017, 02:05) *
Да. Уверен что это ассемблер.



Этот 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
Цитата(Obam @ Aug 23 2017, 15:36) *
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
Цитата(jcxz @ Aug 23 2017, 17:26) *
Только вот инструкции DSP и ARM - это обычно несколько разные вещи.

Так DSP и miniDSP - это тоже две большие разницы. Едва ли от встраиваемой в кодек "вычислялки" можно ждать серьезной производительности.
jcxz
Цитата(aaarrr @ Aug 23 2017, 17:36) *
Так DSP и miniDSP - это тоже две большие разницы. Едва ли от встраиваемой в кодек "вычислялки" можно ждать серьезной производительности.

Но возможно, что она имеет специализированные команды. Подходящие под задачу.
Хотя согласен с Вами: ТС скорей всего в конце-концов пойдёт путём корректировки платы. И правильно! sm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.