Перейти к содержанию

    

Можно ли определить DSP ядро по ассемлеру?

Есть микросхемка от 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-ов в исходниках?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Есть микросхемка от Texas Instuments с DSP ядром внутри (точнее miniDSP). TI документацию на ядро давать не хочет. Есть желание

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

 

Формулы, по которым он работает:

Out (n) = 2*ToneGenerator_1_alpha * Out (n-1) - Out (n-2)

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

 

Кто-нибудь сталкивался с подобным ассемблером? Может быть есть какая-то документация на DSP процессор, у которого похожий ассемблер?

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

 

PS: А зачем так нужен именно этот таинственный DSP если полно открытых МК, с полными доками??

И, если речь только про синус, то и ARM с ним вполне справится.

Поделиться сообщением


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

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

 

 

PS: А зачем так нужен именно этот таинственный DSP если полно открытых МК, с полными доками??

И, если речь только про синус, то и ARM с ним вполне справится.

Этот DSP - не отдельная микросхема. Это часть кодека (tlv320aicXXXX - там много таких). Документация на микросхему в целом есть.

А вот на встроенный DSP - нет. Есть только некоторые готовые алгоритмы для него, которые по факту оказались не нужны.

Для обработки данных используется Cortex M7. Но он уже не справляется. И к сожалению, нужны более сложные алгоритмы, чем генерация синуса.

Идея - перебросить часть задач на DSP в кодеке. И не переделывать плату.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
...зачем так много NOP-ов в исходниках?

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

 

Идея - перебросить часть задач на DSP в кодеке. И не переделывать плату.

Когда есть возможности:

1. Переделать аппаратную платформу

2. Постараться оптимизировать алгоритмы под имеющийся Cortex M7

3. Реверсить неведому зверушку, которая, весьма возможно, окажется

непригодна для реализации целевого алгоритма

 

Выбор п.3 представляется не лучшей идеей. А TI ничего не расскажут, они такие.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Да. Уверен что это ассемблер.

 

 

 

Этот 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 такую производительность не обеспечивает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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 может несколько таких за такт сделать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Только вот инструкции DSP и ARM - это обычно несколько разные вещи.

Так DSP и miniDSP - это тоже две большие разницы. Едва ли от встраиваемой в кодек "вычислялки" можно ждать серьезной производительности.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Так DSP и miniDSP - это тоже две большие разницы. Едва ли от встраиваемой в кодек "вычислялки" можно ждать серьезной производительности.

Но возможно, что она имеет специализированные команды. Подходящие под задачу.

Хотя согласен с Вами: ТС скорей всего в конце-концов пойдёт путём корректировки платы. И правильно! :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация