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

Процессоры фирмы "Элвис"

Прототип системы на ВМ5 - я все же сделал и запустил. Но на пол года позже, когда уже никому это небыло нужно. Тему вроде прикрыли. Меня запнули под плинтус и "для сохранения лица" мне пришлось сменить работу. Надеюсь более в этой жизни не доведется и подумать о применении Ваших изделий №1. Успехов.

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


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

Вероятно, те, кому "повезло" первыми получить чипы от AD, прошли то же самое :)

Я не знаю конечно, как там у AD, но у Xilinx и Altera, с которыми я работаю, дела обстоят примерно так. Новые микросхемы выходят с индексом "ES". Кто хочет первым попариться - покупает. Получает своевременно Errata об обнаруженных ошибках. Потом ошибки исправляются, и выходят микросхемы без багов. Если баги в серийке все же обнаруживаются - об этом на сайте в свободном доступе появляется errata, на нее можно подписаться по почте.

 

А в Элвисе дела обстоят так. В Мультикорах контроллер памяти при повторной инициализации перестает нормально функционировать (пропадает рефреш DRAM). Об этом ни в какой документации нигде не было написано, хотя инженерам, как выяснилось, это было известно. То есть крутится Linux, надо перезагрузиться - пожалуйте, зависание и ресет по watchdog. Мучались наверное месяц, пока я не обнаружил баг и не спросил прямо, какого $%^ пропадает рефреш. На что кто-то очень большой в саппорте проснулся и сказал сакраментально: "Вы очень плохие программисты, раз вам требуется повторная инициализация. Это такие грабли у нас, да, но до вас на них никто не наступал". Не знаю, может мы были плохие программисты, а может были первыми, кто на их шину памяти повесил свое устройство. Но факт: признанный баг есть, описания нет, исправления нет.

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


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

В Мультикорах контроллер памяти при повторной инициализации перестает нормально функционировать (пропадает рефреш DRAM).

Вот это хороший вопрос, который на глаза нашему саппорту пока не попадался.

Вы, как партнеры (на тот момент), общались напрямую с нашими программистами.

 

В документации описания не нашли, но нашли того, кто с этим сталкивался, и молчал,:maniac:

 

Суть такова:

Если мы попали на адрес 0xBFC0_0000 не из-за аппаратного ресета, а по NMI, то при повторной записи единицы в SDRCON[31] пропадает рефреш SDRAM.

 

Что делать:

1)перед инициализацией проверять, был ли сейчас аппаратный ресет, или же это NMI. Если NMI – пропускаем эту часть стартовой инициализации;

2) второй вариант

Есть регистр по адресу 0x182F_101C. В нем есть восьмой бит tload (не описан, т.к. тестовый). Перед инициализацией всегда записываем в этот бит единицу.

 

Еще проконсультируемся с разработчиками кристалла, и, конечно, отразим в документации.

Спасибо за сообщение.

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


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

Здравствуйте, ELVEES R&D Center.

 

Вы писали

 

В ВМ5Я LPORT работает на частоте CLK/4. При работе на CLK/2 возможны ошибки.

 

В связи с этим, возник вопрос - работает ли контроллер PCI в ВМ5Я на частоте 66 МГц, или тут тоже есть недокументированные особенности?

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


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

Еще проконсультируемся с разработчиками кристалла, и, конечно, отразим в документации.

В документации (руководстве пользователя) этот момент был отражен в разделе 4.2 (системное управление):

Отключение внутренней тактовой частоты выполняется следующим образом:

• программа CPU должна выполняться из кэш программ или из внутренней

памяти CRAM;

• SPORT, UART, DMA должны быть в неактивном состоянии;

• перевести DSP в режим STOP;

• записать 1 в 31 разряд регистра SDRCON (поле RFR не должно быть

изменено). По данной операции SDRAM деактивизируется (выполняется команда PRECHARGE);

...

Запись 1 в 31 разряд регистра SDRCON - это инициализация. В данном случае

повторная.

Чтобы было яснее введем в п. 9.2.6:

Следует отметить, что повторная инициализация (не отключая питания

микросхемы) памяти типа SDRAM (запись 1 в 31 разряд регистра SDRCON)

приводит к ее деактивизации и отключению регенерации (см. п. 4.2). Для того,

чтобы после повторной инициализация опять включить регенерацию, необходимо

произвести запись всех единиц по адресу 182F_1018 (установка сигнала CKE в

единичное состояние и включение регенерации) (см. п. 4.2).

 

 

В связи с этим, возник вопрос - работает ли контроллер PCI в ВМ5Я на частоте 66 МГц, или тут тоже есть недокументированные особенности?

Работает. Недокументированных особенностей не обнаружено.

Но рекомендуем обратить внимание на "документированную":

 

В режиме PCI Master:

При записи в фазе передачи данных микросхема ВМ5Я удерживает на выводах nCBE[3:0] высокий уровень.

В режиме PCI Slave (при записи в микросхему ВМ5Я):

При чтении в фазе передачи данных микросхема ВМ5Я игнорирует состояния сигналов nCBE[3:0] и всегда выполняет запись слова. Запись отдельных байтов не выполняется.

 

Таким образом, в режиме PCI Master можно работать только с PCI-устройствами, игнорирующими состояния сигналов nCBE[3:0] в фазе передачи данных. В режиме PCI Slave можно работать с PCI-устройствами, не использующими байтовых операций.

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


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

ELVEES R&D Center, можете оставить контактную информацию? Мой e-mail есть в профиле.

Пробовал свазаться с вами, но ответа не получил. Отправка личных сообщений у меня запрещена в профиле.

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


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

ELVEES R&D Center, можете оставить контактную информацию? Мой e-mail есть в профиле.

Пробовал свазаться с вами, но ответа не получил. Отправка личных сообщений у меня запрещена в профиле.

Связываться лучше напрямую с [email protected]. Переслал ответ Вам по email.

 

Работает. Недокументированных особенностей не обнаружено.

Но рекомендуем обратить внимание на "документированную":

Еще одно важное документированное замечание:

PCI-контроллер микросхемы 1892ВМ5Я обеспечивает обмен с частотой до 100 МГц (в том числе, 66МГц), однако пятый бит (66MHZ_CAPABLE) в статусном регистре не выставляется.

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


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

Есть ли официальный форум поддержки.. или всё разрешать тут?

Просто возникло несколько вопросов:

*какие ограничения у демо версии MCStudio?

*чем отличаются MCStudio2 , MCStudio3(о которой сказано только на этом форуме) и MCStudio-ECL?

*остались ли у Вас СнК без DSP? только RISC..

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


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

Есть ли официальный форум поддержки.. или всё разрешать тут?

Просто возникло несколько вопросов:

*какие ограничения у демо версии MCStudio?

*чем отличаются MCStudio2 , MCStudio3(о которой сказано только на этом форуме) и MCStudio-ECL?

*остались ли у Вас СнК без DSP? только RISC..

Все вопросы лучше решать через [email protected] - это официальная почта тех.поддержки. Официального форума пока нет, но планируется.

1)Демо-версии MCStudio не поддерживают отладку на «живом» процессоре. Только в симуляторе.

2)MCStudio 2 – это среда, предназначенная для работы с процессорами MC-12 (1892ВМ3Т), MC-24 (1892ВМ2Я), MC-0226 (1892ВМ5Я), MC-24R (1892ВМ8Я). MCStudio 3M – среда, предназначенная для работы с процессорами NVCom-01 и MC-0428 (1892ВМ7Я). MCStudio-ECL – среда, предназначенная для работы с процессорами MC-12 и MC-24. Ее отличительная особенность – она имеет в своем составе компилятор C для DSP-ядра. Но на наш взгляд, этот компилятор создает недостаточно оптимальный код для DSP-ядра, поэтому имеет смысл использовать его в тех приложениях, где ресурсы DSP-ядра не используются на 100%. Среда MCStudio-ECL разработана и поставляется компанией «Интерстрон». Техническая поддержка также осуществляется этой компанией. Хотя мы по возможности тоже стараемся помочь, если возникают вопросы.

3)Есть проекты и без DSP, но чипы пока не поставляются.

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


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

проясните следующее :

1) доступна ли библиотека для DSP с поддержкой стандартных ДСП-шных функций, БПФ и т.п?

если в рекламке утверждается, что такое-то БПФ за N мкс, а у меня, в следствие собственной криворукости, получится в 2-10 раз медленнее - как быть?

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

2) работает ли симулятор и есть ли к нему описание? скачал я демо версию, а потом посмотрел и полную - какая-то фигня, кнопочки симулятора жмутся, а на картинке ничего не происходит - ни по брекпоинтам не останавливается, ни регистры не показывает.

НО! выскакивает виндовая ошибка об обращении по 0х00000000

может там что-то требуется для винды доставить или что-то еще?

по поводу описания - этот симулятор (если таки есть) он времянку дает? учитывает шинный арбитраж? а то как то "симулятор программ в исходных кодах" в хелпе - непонятно

3) документация по NVCom-овскому DSP (elcore30?) будет предоставлена когда нибудь или нет? ну всякие там 64х разрядные операции, можно даже предположить, что и 128 есть, но в предлагаемой на сайте ISA для elcore24 ничего такого нет

 

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


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

проясните следующее :

Давно не слежу за ЭЛВИСом, было так(по памяти, что вспомнил):

1) Эти библиотеки были платные. по поводу скорости - режим SIMD (если не ошибаюсь) включали? в нём,кажется, запись в соседние адреса RAM идёт за такт, ускоряет алгоритм, смотря что пишете, конечно.

2) симулятор всегда вылетал(у меня). Вы ctrl.o файл модифицировали, как они пишут?его надо скомпилить в MC Studio и перезаписать им исходный файл(об этом пишут в каком-то.doc).

Ошибка была, но по-моему её устранили(или реже стало глючить, не помню) в 2009 году, где-то.но это при работе с железом, а с симулятором не скажу как.Времянки не встречал в симуляторе, но регистры отображались, в меню View(вроде бы или в одном из соседних) выбираете RISC и/или DSP - появляются окошко с регистрами.значения регистров в симуляторе всегда менялись. в железе когда-то не менялись, но потом и там стали))). И вообще, эрратов на мультикоры нет(не было), а эрроры есть,так-шта.... :smile3009:

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


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

Давно не слежу за ЭЛВИСом, было так(по памяти, что вспомнил):

1) Эти библиотеки были платные. по поводу скорости - режим SIMD (если не ошибаюсь) включали? в нём,кажется, запись в соседние адреса RAM идёт за такт, ускоряет алгоритм, смотря что пишете, конечно.

2) симулятор всегда вылетал(у меня). Вы ctrl.o файл модифицировали, как они пишут?его надо скомпилить в MC Studio и перезаписать им исходный файл(об этом пишут в каком-то.doc).

Ошибка была, но по-моему её устранили(или реже стало глючить, не помню) в 2009 году, где-то.но это при работе с железом, а с симулятором не скажу как.Времянки не встречал в симуляторе, но регистры отображались, в меню View(вроде бы или в одном из соседних) выбираете RISC и/или DSP - появляются окошко с регистрами.значения регистров в симуляторе всегда менялись. в железе когда-то не менялись, но потом и там стали))). И вообще, эрратов на мультикоры нет(не было), а эрроры есть,так-шта.... :smile3009:

 

спасибо за ответ

1) режим SIMD - это было в каком-то из первых кор (то ли какая-то спец. задача, то ли накреативили) в новых такого нет - DSP ядра автономны

2) там не так много док, я их проискал по слову симулятор - ничего не нашел, может эта не та дока, которую после регистрации всем дают? по № 3) из моего сообщения, чтобы получить пришлось сплясать гапака

если вспомните где - был бы признателен

окошки появляются - GUI работает - но в окошках ничего нет

 

к плюсам надо добавить, что в элкор30 сделали таки 128 разрядную шину к памяти (имхо, это был очевидный ботлнек), но разбить массив памяти на несколько блоков чтоб X,Y обращение за такт проходило пока не сделали

 

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


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

коллеги, не удалось ли кому-нибудь освоить загрузку по jtag процессора nvcom-01 под linux?

хочу под линуксом хотя бы загружать программу в озу; единственное что сейчас могу - под windows (которая мне в принципе для работы не подходит) разделить полученный elf файл на секции и подсунуть их в MCStudio; ну это же не серьёзно

 

собрать common-db мне не удалось (lisp :( ),

mcremote вроде грузит все секции, но программа признаков жизни не подаёт

 

 

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


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

Поделитесь схемой включения к 1892ВМ3Т пзу 1636РР2. Может кто пробовал.

Согласно рекомендация по применению 8 разрядной ПЗУ для ее программирования от процессора (я так понял через jtag что ли) необходима внешняя обвязка на логике. А 1636РР2 вообще поддерживает такой способ программирования? Разработчик рекомендует использовать фирменный программатор. Или не парится поставить разъем для внутрисхемного программирования и программатор купить.

А если следовать рекомендациям миландра, то и внешнюю обвязку не надо?

А еще посоветуйте отечественное ОЗУ для этого процессора. И неплохо бы схемку включения.

 

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


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

Выясняется, что открытых примеров программирования функций обработки сигналов для DSP ядра у Элвисов нет, либо они не хотят ими просто так делиться. Оказывается даже, что библиотека прикладных программ (цены уточните на сайте – Оооочень кусаются) не содержит исходных кодов таких основных функций как вычисление спектра сигнала по алгоритму БПФ, фильтрация и свертка.

Не знаю, как к этому относятся остальные разработчики, которым не посчастливилось работать с процессорами от Элвис, но меня это расстраивает.

Посему, закончив с прототипом функции БПФ (FFT) спешу ее опубликовать, дабы облегчить жизнь инженерам вынужденным по причине военного заказа или какой иной использовать DSP процессоры от Элвис.

В моем случае я имел дело с процессором 1892ВМ5Я.

Код, конечно не идеальный и, возможно далеко не оптимальный, но тем не менее – рабочий и будет совершенствоваться, возможно, и Вашими усилиями в том числе!

 

 

Основной файл, где вычисляется спктр:

 

.text 1

.global Start_DSP

.global In_phase

.global Out_data

.global InA

.global InB

.global OutC

 

Start_DSP:

 

j bit_rev ;переход на функцию переупорядочивания

ret_from_bit_rev:

 

j fft ;переход на функцию комплексного фурье

ret_from_fft:

 

j unpack ;переход на ф-цию восстановления фурье исходной действительной последовательности

ret_from_unpack:

 

j power ;переход на ф-ю вычисления спектра мощности исходной последовательности

ret_from_power:

stop

 

bit_rev: ;функция перестановки адресных бит (реверс)

 

move fft_data, a0 ;помещаем указатель на фходные данные в адресный регистр а0

move reordered_data, a2 ;помещаем указатель на массив переупорядоченных данных в а2

move 16, i0 ;задаем значение инкремента адреса

do 16, end_stage

move 0xffff, m0 ;модификатор генератора адреса (линейная арифметика)

move (a0+1), r2 ;линейная арифметика нужна, чтоб обратиться по нужному адресу со смещением

move 0x0000, m0 ;модификатор генератора адреса (обратный перенос)

move (a0)+i0, r0

move r0, (a2)+

move r2, (a2)+

end_stage

j ret_from_bit_rev

 

fft:

;первая стадия объединения данных включает в себя только попарное сложение-вычитание

;это нужно делать для мнимых и реальных частей отдельно (такой алгоритм)

;результат делим на 2 для того, чтоб избежать переполнения

 

move reordered_data, a0 ;загружаем в а0 указатель на реальные части переупорядоченных данных

move reordered_data+2, a2 ;загружаем в а2 указатель на второе слагаемое (реальная часть)

move reordered_data+1, a4 ;загружаем в а4 указатель на мнимые части переупорядоченных данных

move reordered_data+3, a6 ;загружаем в а6 указатель на второе слагаемое (мнимая часть)

 

move 0xffff, m0 ;модификатор генератора адреса (линейная арифметика)

move 4, i0 ;задаем значение инкремента адреса

move 4, i2 ;задаем значение инкремента адреса

move 4, i4 ;задаем значение инкремента адреса

move 4, i6 ;задаем значение инкремента адреса

 

;Stage1

do 8, end_stage1 ;цикл повторяем 8 раз (длина фурье/2)

;операция с реальными частями

move (a0), r0 ;помещаем операнды одной бабочки в регистры

move (a2), r2

asr #1, r0 ;арифметический сдвиг вправо для того, чтоб избежать переполнения (делим на 2)

asr #1, r2

addsubl r2, r0 ;делаем бабочку (на первой стадии только сложение-вычитание)

move r2, (a0)+i0 ;помещаем результат на те же места и инкрементируем адрес на 4 (значение инкрементирующего регистра)

move r0, (a2)+i2

;операция с мнимыми частями

move (a4), r0 ;помещаем операнды одной бабочки в регистры

move (a6), r2

asr #1, r0

asr #1, r2

addsubl r2, r0 ;делаем бабочку (на первой стадии только сложение-вычитание)

move r2, (a4)+i4 ;помещаем результат на те же места и инкрементируем адрес на 4 (значение инкрементирующего регистра)

move r0, (a6)+i6

end_stage1

nop

;вторая стадия объединения данных включает в себя кроме сложения-вычитания еще и смену реальных/мнимых частей

;(умножение на мнимую единицу)

;это нужно делать для мнимых и реальных частей отдельно (такой алгоритм)

;результат делим на 2 для того, чтоб избежать переполнения

 

move 8, i0 ;задаем значение инкремента адреса

move 8, i2 ;задаем значение инкремента адреса

move 8, i4 ;задаем значение инкремента адреса

move 8, i6 ;задаем значение инкремента адреса

 

move reordered_data, a0 ;загружаем в а0 указатель на реальные части переупорядоченных данных

move reordered_data+1, a2 ;загружаем в а2 указатель на мнимые части переупорядоченных данных

move reordered_data+2, a4 ;загружаем в а0 указатель на реальные части переупорядоченных данных

move reordered_data+3, a6 ;загружаем в а2 указатель на мнимые части переупорядоченных данных

;Stage2

do 4, end_stage2 ;цикл повторяем 4 раза (длина фурье/4)

;Первая бабочка (операции с участием только первого поворотного коэфф. (в нашем случае - это "1"))

;эта стадия эквивалентна Stage1

 

;операция с реальными частями

move (a0), r0 ;помещаем операнды одной бабочки в регистры

move (a0+4), r2 ;адресация со смещением

asr #1, r0 ;арифметический сдвиг вправо для того, чтоб избежать переполнения (делим на 2)

asr #1, r2

addsubl r2, r0 ;делаем бабочку (на первой стадии только сложение-вычитание)

move r0, (a0+4) ;помещаем результат на те же места

move r2, (a0)+i0

;операция с мнимыми частями

move (a2), r0 ;помещаем операнды одной бабочки в регистры

move (a2+4), r2 ;адресация со смещением

asr #1, r0

asr #1, r2

addsubl r2, r0 ;делаем бабочку (на первой стадии только сложение-вычитание)

move r0, (a2+4) ;помещаем результат на те же места

move r2, (a2)+i2

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Вторая бабочка (операции с участием только второго поворотного коэфф. (в нашем случае - это "-j"))

;эта стадия похожа на Stage1, но нужно сменить знак слагаемых и поменять реальные/мнимуе части местами

 

move (a4), r0 ;помещаем операнды одной бабочки в регистры

move (a4+5), r2 ;адресация со смещением (слагаемое "+5", т.к. прибавляем к реальной части - мнимую)

move (a6), r4 ;помещаем операнды одной бабочки в регистры

move (a6+3), r6 ;адресация со смещением (слагаемое "+3", т.к. прибавляем к мнимой части - реальную)

 

asr #1, r0 ;арифметический сдвиг вправо для того, чтоб избежать переполнения (делим на 2)

asr #1, r2

asr #1, r4

asr #1, r6

addsubl r2, r0 ;делаем бабочку (на первой стадии только сложение-вычитание)

addsubl r6, r4 ;делаем бабочку (на первой стадии только сложение-вычитание)

 

move r0, (a4+4) ;помещаем результат на противоположные места (смена знака операции) и инкрементируем адрес на 8 (значение инкрементирующего регистра)

move r2, (a4)+i4

 

move r6, (a6+4) ;помещаем результат на противоположные места (смена знака операции) и инкрементируем адрес на 8 (значение инкрементирующего регистра)

move r4, (a6)+i6

end_stage2

nop

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;стадии с третьей и до конца (всего стадий logN-1)

;на этих стадиях необходимо умножение на поворотные вектора

move addr_incr_indx+2, a7 ;переписываем указатель на массив значений инкремента в адресный регистр

move addr_half_incr_indx+2, a1 ;переписываем указатель на массив значений инкремента в адресный регистр

move butterfly_numb+2, a6 ;переписываем указатель на массив количества бабочек в стадии в адресный регистр

move repeat_numb+2, a5 ;переписываем указатель на массив повторений за стадию в адресный регистр

 

 

do 2, end_stages ;в нашем случае повторяем цикл по оставшимся стадиям 2 раза (16-точечное компл. Фурье)

 

move (a5-1), r28

move r28, i3

move r28, i4

 

 

move (a6)+, r28 ;помещаем значение кол-ва бабочек соответствующего нужной стадии в регистр и делаем инкремент адреса

 

move (a5)+, r26 ;помещаем значение кол-ва повторений соответствующего нужной стадии в регистр и делаем инкремент адреса

;Stage_n

 

 

 

;цикл по N-точечным Фурье

 

move reordered_data, a0 ;загружаем в а0 указатель на реальные части переупорядоченных данных

move reordered_data, a2 ;загружаем в а2 указатель на мнимые части переупорядоченных данных

move (a1)+, r30

 

do r26, end_stage_n ;цикл повторяем столько раз, сколько указано в регистре повторений

 

move sine, a3 ;загружаем в а3 указатель на таблицу синусов

move cosine, a4 ;загружаем в а4 указатель на таблицу косинусов

 

 

 

 

move r30, i2 ;задаем значение инкремента адреса для 0-ого адресного регистра

move (a2)+i2, r24 ;делаем это ради того, чтоб инкрементировать адрес, чтоб он указывал на середину последовательности текущей стадии

 

move 2, i0

move 2, i2

 

 

do r28, end_butterfly ;цикл по бабочкам, повторяем столько раз, сколько указано в регистре кол-ва бабочек

 

 

;операция с реальными частями

move (a0), r0 ;помещаем операнды одной бабочки в регистры

asrl #1, r0

 

move (a2), r2 ;помещаем "с" в регистр

move (a3), r4 ;выбираем значение из таблицы синусов

 

move (a2+1), r6 ;помещаем "d" в регистр (с + di - запись комплексного числа)

move (a4), r10 ;выбираем значение из таблицы косинусов

 

;зануляем значения аккумуляторов

move 0, AC0

move 0, AC1

 

mac r2, r10 ;c*cos(phi)

mac r6, r4 ;c*cos(phi) + d*sin(phi)

 

move AC0, r2 ;результат умножения кладется в r2

asrl #15, r2 ;делить на 2 можно и после перезаписи результата в регистр, т.к. данные у нас максимум 32-бит, а реги и аккум - 64

 

addsubl r2, r0 ;делаем бабочку

 

;перед тем как положить результат на места, нужно из тех мест взять данные для следующей бабочки

move (a0+1), r12 ;помещаем операнды одной бабочки в регистры

move (a2), r14 ;помещаем "с" в регистр

asrl #1, (r12)

 

move r2, (a0) ;помещаем результат на те же места

move r0, (a2)

 

negl r14, r16 ;меняем знак у "c"

;операция с мнимыми частями

 

move (a3)+i3, r4 ;выбираем значение из таблицы синусов

move (a2+1), r6 ;помещаем "d" в регистр (с + di - запись комплексного числа)

move (a4)+i4, r10 ;выбираем значение из таблицы косинусов

 

;зануляем значения аккумуляторов

move 0, AC0

move 0, AC1

 

mac r16, r4 ;-c*sin(phi)

mac r6, r10 ;-c*sin(phi) + d*cos(phi)

 

move AC0, r2 ;результат умножения кладется в r2

asrl #15, r2 ;делить на 2 можно и после перезаписи результата в регистр, т.к. данные у нас максимум 32-бит, а реги и аккум - 64

 

addsubl r2, r12 ;делаем бабочку

 

move r2, (a0+1) ;помещаем результат на те же места

move (a0)+i0, r0 ;эта процедура здесь исклучительно ради инкремента адреса

move r12, (a2+1)

move (a2)+i2, r0 ;эта процедура здесь исклучительно ради инкремента адреса

 

end_butterfly

nop

move r30, i0 ;задаем значение инкремента адреса для 0-ого адресного регистра

move (a0)+i0, r24 ;делаем это ради того, чтоб инкрементировать адрес, чтоб он указывал на середину последовательности текущей стадии

end_stage_n

nop

end_stages

nop

j ret_from_fft

 

 

unpack:

; Данная стадия состоит из двух подстадий:

; 1 - разбиение на 4 последовательности (четные/нечетные реальные части и четные/нечетные мнимые части)

; 2 - финальная бабочка для получения Фурье преобразования исходной действительной последовательности

; После первой подстадии данные расположены следующим образом:

; первые 32 отсчета - это четные реальные и мнимые части

; последние 32 отсчета - это нечетные реальные и мнимые части, расположенные в обратном порядке

 

 

; 1-я подстадия

;объявляем 4 указателя:

; 0-на начало массива реальных частей

; 1-на конец массива реальных частей

; 2-на начало массива мнимых частей

; 3-на конец массива мнимых частей

 

;первые две точки не трогаем. Они остаются без изменений

move reordered_data+2, a0 ;загружаем в а0 указатель на реальные части

move reordered_data+30, a1 ;загружаем в а1 указатель на конец массива реальных частей

move reordered_data+3, a2 ;загружаем в а2 указатель на мнимые части

move reordered_data+31, a3 ;загружаем в а3 указатель на конец массива мнимых частей

 

;продлеваем... будем хранить данные далее в том же массиве...

move reordered_data+34, a4

move reordered_data+62, a5

move reordered_data+35, a6

move reordered_data+63, a7

 

move 2, i0 ;на 2 будем инкрементировать и декрементировать все указатели

move 2, i1 ;на 2 будем инкрементировать и декрементировать все указатели

move 2, i2 ;на 2 будем инкрементировать и декрементировать все указатели

move 2, i3 ;на 2 будем инкрементировать и декрементировать все указатели

move 2, i4 ;на 2 будем инкрементировать и декрементировать все указатели

move 2, i5 ;на 2 будем инкрементировать и декрементировать все указатели

move 2, i6 ;на 2 будем инкрементировать и декрементировать все указатели

move 2, i7 ;на 2 будем инкрементировать и декрементировать все указатели

 

;среднюю точку берем из самой исходной последовательности

;делаем цикл сразу по реальным и мнимым частям

 

;состояние некоторых точек известно заранее, так что инициализируем их тут сразу

move #0, r0

move r0, (a4-2)

move r0, (a4-1)

 

move r0, (a4+14)

move r0, (a4+15)

 

 

do 7, end_real_imag ;делаем 7 повторений, т.к. первую точку оставляем без изменений

move (a0), r0 ;помещаем данные в регистры

move (a1), r2 ;помещаем данные в регистры

move (a2), r4 ;помещаем данные в регистры

move (a3), r6 ;помещаем данные в регистры

 

addsubl r2, r0 ;вычисляем сумму и разность

addsubl r6, r4 ;вычисляем сумму и разность

 

asr #1, r0 ; делим все результаты на 2

asr #1, r2 ; делим все результаты на 2

asr #1, r4 ; делим все результаты на 2

asr #1, r6 ; делим все результаты на 2

 

;кладем результат по нужным местам

move r2, (a0)+i0

move r2, (a1)-i1

move r0, (a5)-i5

negl r0, r8

move r8, (a4)+i4

 

move r6, (a2)+i2

move r6, (a3)-i3

move r4, (a7)-i7

negl r4, r8

move r8, (a6)+i6

end_real_imag

nop

; 2-я подстадия

; После первой подстадии данные расположены следующим образом:

; первые 32 отсчета - это четные реальные и мнимые части

; последние 32 отсчета - это нечетные реальные и мнимые части

move reordered_data+2, a7 ;четные реальные RP

move reordered_data, a0 ;четные реальные RP

move reordered_data+62, a1 ;нечетные реальные RM

move reordered_data+1, a2 ;четные мнимые IP

move reordered_data+63, a3 ;нечетные мнимые IM

move reordered_data+32, a6 ;указатель на середину массива

 

;первую и N-ю точку (реальн. и мн. части) можно вычислить без поворотных коэфф.

move #0, r10

move #0, r11

move r10, (a2)+i2 ;первая точка, мнимая часть

move r10, (a6+1) ;N-я точка, мнимая часть

 

move (a0), r0

move (a2), r2

 

addsubl r2, r0

 

move r2, (a0)+i0 ;первая точка реальная часть

move r0, (a6)+i6 ;N-я точка, реальная часть

 

move sine+1, a4 ;загружаем в а3 указатель на таблицу синусов, постинкремент нужен для того, чтоб обратиться начиная со второго эл-та

move cosine+1, a5 ;загружаем в а4 указатель на таблицу косинусов

move #1, i4

move #1, i5

 

do 15, end_butterfly_last ;цикл повторяем 15 раз, т.к. первую точку рассчитали заранее

move (a2), r0 ;IP

move (a1), r2 ;RM

 

negl r2, r4 ;-RM

negl r0, r6 ;-IP

 

move (a4), r8 ;выбираем значение из таблицы синусов

move (a5), r10 ;выбираем значение из таблицы косинусов

 

;Вычисляем AI

;инициализируем значения аккумуляторов

move 0, AC1

move 0, AC0;

 

mac r10, r4 ;-RM*cos(phi)

mac r8, r6 ;-RM*cos(phi) - IP*sin(phi)

 

move AC0, r0 ;результат умножения кладется в r0

asrl #14, r0

 

move (a3), r20

addl r0, r20

negl r20, r4

;Вычисляем AR

move (a2)+i2, r0 ;IP

move (a1), r2 ;RM

;вычисленные заранее данные кладем по местам после того, как считали те, что нам еще нужны

move r20, (a7+1)

move r4, (a3)-i3

 

negl r2, r4 ;-RM

negl r0, r6 ;-IP

 

move (a4)+i4, r8 ;выбираем значение из таблицы синусов

move (a5)+i5, r10 ;выбираем значение из таблицы косинусов

;инициализируем значения аккумуляторов

move 0, AC0

move 0, AC1

 

mac r10, r0 ;IP*cos(phi)

mac r8, r4 ;IP*cos(phi) - RM*sin(phi)

 

move AC0, r0 ;результат умножения кладется в r0

asrl #14, r0

move (a0)+i0, r20

addl r20, r0

 

move r0, (a7)+i7

move r20, (a1)-i1

 

end_butterfly_last

nop

j ret_from_unpack

 

power:

 

move reordered_data, a0

move reordered_data+1, a1

 

do 32, end_power_spectrum

move (a0), r0

move (a0), r2

move (a1), r4

move (a1), r6

 

move 0, AC0

move 0, AC1

 

mac r0, r2

mac r4, r6

 

move AC0, r0 ;результат умножения кладется в r0

asrl #14, r0

move r0, (a0)+i0

move #0, r2

move r2, (a1)+i1

 

end_power_spectrum

nop

 

j ret_from_power

 

.data 1

 

In_phase: .space 0xff*4, 1

Out_data: .skip 0xff*4

InA: .dl 100

InB: .dl 123

OutC: .dl 234

Phase_counter: .dl 1

.end

 

Файл инициализации памяти

 

.text

.global fft_data

.global reordered_data

.global addr_incr_indx

.global butterfly_numb

.global repeat_numb

.global sine

.global cosine

.global addr_half_incr_indx

 

 

.data ;секция переменных для преобразования Фурье

 

 

sine: ;резервируем под таблицу поворачивающих векторов (синусы)

.word 0

.word 3196

.word 6270

.word 9102

.word 11585

.word 13623

.word 15137

.word 16069

.word 16384

.word 16069

.word 15137

.word 13623

.word 11585

.word 9102

.word 6270

.word 3196

 

cosine: ;резервируем под таблицу поворачивающих векторов (косинусы)

.word 16384

.word 16069

.word 15137

.word 13623

.word 11585

.word 9102

.word 6270

.word 3196

.word 0

.word -3196

.word -6270

.word -9102

.word -11585

.word -13623

.word -15137

.word -16069

 

 

K_FFT_SIZE: .dl 32 ;размер преобразования Фурье (2N) (программа будет вычислять N-точечное преобразование

;комплексное и из него потом переходить к 2N-точечному реальному)

 

.align 32 ;выравниваем по 64 байтам, чтоб правильно работала адресация с обратным переносом

empty: .skip 24*4 ;чтоб нормально работала адресация с обр. переносом необходимо выровнить

;данные так, чтоб все разряды числа инкремента равнялись нулю, а след. за ним был единицей

 

reordered_data: .skip 32*4 ;резервируем пространство для переупорядоченных данных

 

 

fft_data: ;резервируем в памяти 4N слов (младшие 2N слов будут содерать исходные данные

; а старшие будут использоваться при вычислениях)

; на выходе будем иметь 4N точечное комплексное преобразование исходной

; последовательности

; .word 4053, 7855, 11168, 13787, 15548, 16343, 16122, 14898, 12748, 9805, 6253, 2312, -1773, -5747, -9364, -12399

; .word -14664, -16016, -16372, -15711, -14073, -11560, -8328, -4578, -544, 3525, 7374, 10764, 13485, 15368, 16296, 16210

.word 4053, 7855, 11168, 13787, 15548, 16343, 16122, 14898, 12748, 9805, 6253, 2312, -1773, -5747, -9364, -12399

.word -14664, -16016, -16372, -15711, -14073, -11560, -8328, -4578, -544, 3525, 7374, 10764, 13485, 15368, 16296, 16210

 

real_fft_output: .space 32*4*2, 5 ;резервируем 2N слов под выходной спектр мощности

 

addr_incr_indx: ;массив инкрементов адресных регистров на каждом шаге Фурье

.word 4, 8, 16, 32

addr_half_incr_indx: ;массив половинных инкрементов адресных регистров на каждом шаге Фурье

.word 2, 4, 8, 16

butterfly_numb: ;массив значений количества бабочек в стадии (равно числу поворотн. коэфф. для стадии)

.word 1, 2, 4, 8

repeat_numb: ;массив значений количества повторений операци умножения/сложения для одной бабочки на стадии

.word 8, 4, 2, 1

 

.end

 

 

 

 

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...