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

Помогите с NIOS+float

Здравствуйте.

Работаю на ките Стратикса4, Квартус11.1.

Недавно столкнулся с такой проблемой:

1. создал в квартусе qSys-систему:

post-59925-1367291831_thumb.png

2. в настройках НИОСа выставил галочку "Hardware divide":

post-59925-1367291838_thumb.png

3. в настройках BSP проекта выставил три галочки:

post-59925-1367291850_thumb.png

4. флаги в файле public.mk у меня генерятся следующие:

post-59925-1367291855_thumb.png

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

            а.) temp_U = IORD(F1_BASE_ADDRESS, F1_ADDR_U);
            б.) f1_array_u[f1_index_u] = temp_U;
            в.) temp_F = (float)(temp_U) * f1_3_3A_8_calc_coeff_1;
            г.) f1_array_u_float[f1_index_u_float] = temp_F;
            д.) IOWR(DATA_MODULE_BASE, 3003, 1);

6. по СигналТапку отслеживаю сигналы на шине Авалон.

 

Проблема в следующем:

от Авалоновской пересылки в строке а.) до пересылки в строке д.) насчитывается до 300 тактов.

НИОС и СигналТап тактируются частотой 50МГц.

 

Пробовал менять флаги вместо 60-1 ставил 60-2 - стало даже хуже :05:

 

Что не так с моей системой? Или все должно быть так?

И можно ли в обработчик прерываний совать плавающую математику?

 

Есть мысль вообще использовать внешний компонент "умножитель", тогда пересылки по Авалону туда/сюда

займут тактов 30-40, вычисление на "умножителе" - тактов 5-6, ИТОГО выигрыш в 6-7 раз.

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


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

objdump в студию.

Извиняюсь за такую длительную паузу.

Вот часть из файла .objdump:

    //-------------------------------------------------------------
    temp_U = IORD(F1_3_3A_8_BASE_ADDRESS, F1_3_3A_8_ADDRMAP_U_LPF_0);
   413ac:    00800234     movhi    r2,8
   413b0:    10945404     addi    r2,r2,20816
   413b4:    10800037     ldwio    r2,0(r2)
   413b8:    e0bffd15     stw    r2,-12(fp)
    f1_3_3A_8_array_u_lp_0[f1_3_3A_8_index_u_lpf] = temp_U;
   413bc:    d0a6c517     ldw    r2,-25836(gp)
   413c0:    00c00174     movhi    r3,5
   413c4:    18df4804     addi    r3,r3,32032
   413c8:    1085883a     add    r2,r2,r2
   413cc:    1085883a     add    r2,r2,r2
   413d0:    10c7883a     add    r3,r2,r3
   413d4:    e0bffd17     ldw    r2,-12(fp)
   413d8:    18800015     stw    r2,0(r3)
    temp_F = (float)(temp_U) * f1_3_3A_8_calc_coeff_0;
   413dc:    e13ffd17     ldw    r4,-12(fp)
   413e0:    00421540     call    42154 <__floatsisf>
   413e4:    1007883a     mov    r3,r2
   413e8:    d0a6c717     ldw    r2,-25828(gp)
   413ec:    1885ff32     custom    252,r2,r3,r2
   413f0:    e0bffc15     stw    r2,-16(fp)
    f1_3_3A_8_array_u_lpf_0[f1_3_3A_8_index_u_lpf] = temp_F;
   413f4:    d0a6c517     ldw    r2,-25836(gp)
   413f8:    00c00174     movhi    r3,5
   413fc:    18ddb804     addi    r3,r3,30432
   41400:    1085883a     add    r2,r2,r2
   41404:    1085883a     add    r2,r2,r2
   41408:    10c7883a     add    r3,r2,r3
   4140c:    e0bffc17     ldw    r2,-16(fp)
   41410:    18800015     stw    r2,0(r3)

    IOWR(DATA_MODULE_F1_3_3A_8_0_BASE, 3003, 0);
   41414:    00800234     movhi    r2,8
   41418:    108bbb04     addi    r2,r2,12012
   4141c:    10000035     stwio    zero,0(r2)
    //-------------------------------------------------------------

для кода:

 

Изменено пользователем billidean

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


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

Есть мысль вообще использовать внешний компонент "умножитель", тогда пересылки по Авалону туда/сюда

займут тактов 30-40, вычисление на "умножителе" - тактов 5-6, ИТОГО выигрыш в 6-7 раз.

 

Так и сделал. Только я использую double, там в процессоре еще медленней получается.

Данные вывожу не через авалон, а через PIO в свой модуль с системой команд (+,-,/,*,sqrt) который использует alt_fp_*

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


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

2 billidean

413e0:    00421540     call    42154 <__floatsisf>

похоже ваш компилер не вкурсе что проц имеет хардварный FPU

Попробуйте вот этот ключ: -mcustom-fmuls

 

Кстати, вот тут смотрели, особенно последний абзац ?

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


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

2 billidean

413e0:    00421540     call    42154 <__floatsisf>

похоже ваш компилер не вкурсе что проц имеет хардварный FPU

Это мне тоже показалось подозрительным, но у меня не было времени сильно в этом копаться.

 

Спасибо за ссылку, поковыряюсь обязательно.

О результатах отпишу.

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


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

Чо-то я задолбался с этими флагами. Всякие разные флаги/галочки ставил, все-равно строка

call    ххх <__floatsisf>

присутствует в месте выполнения вычисления.

 

Неужели у вас всех все нормально, т.е. без этой строки???

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

 

З.Ы.: примерный проектик был бы ваще нормально :rolleyes:

Изменено пользователем billidean

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


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

выложил пример проекта для c3-starter. вот кусок objdump:

#include <stdio.h>

int main()
{
20001fc:	defff404 	addi	sp,sp,-48
2000200:	dfc00b15 	stw	ra,44(sp)
2000204:	df000a15 	stw	fp,40(sp)
2000208:	dcc00915 	stw	r19,36(sp)
200020c:	dc800815 	stw	r18,32(sp)
2000210:	dc400715 	stw	r17,28(sp)
2000214:	dc000615 	stw	r16,24(sp)
2000218:	df000604 	addi	fp,sp,24
   float a, b, c;
   printf("Hello from Nios II from Starter Kit!\n");
200021c:	01008074 	movhi	r4,513
2000220:	213af004 	addi	r4,r4,-5184
2000224:	20008240 	call	2000824 <puts>
   a = 1.6;
2000228:	008ff374 	movhi	r2,16333
200022c:	10b33344 	addi	r2,r2,-13107
2000230:	e0bfff15 	stw	r2,-4(fp)
   b = 2.5;
2000234:	00900834 	movhi	r2,16416
2000238:	e0bffe15 	stw	r2,-8(fp)
   c = a*b;
200023c:	e0ffff17 	ldw	r3,-4(fp)
2000240:	e0bffe17 	ldw	r2,-8(fp)
2000244:	1885ff32 	custom	252,r2,r3,r2
2000248:	e0bffd15 	stw	r2,-12(fp)
   printf("%1.3e * %1.3e = %1.3e\n", a, b, c);

custom 252 - это обращение к fpu.

nios_starter_11_0.1.7z

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


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

Спасибо, я понял где прокосячил: при настройке параметров НИОСа нужно было выбрать параметр "Hardware multiplication type" = "Embedded..".

Но у меня все равно ничего не вышло, пишет ошибку типа "Данное устройство не поддерживает данный параметр".

Вроде Стратикс4 (EP4SGX230KF40C2) повыше циклона будет, для которого пример создан. Может лицензии нет на данную опцию? кто-нибудь знает? НИОС f-типа у меня генерится как тайм-лим., может с этим и связано?

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


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

ну, вы можете пересобрать мой проект, если код изменится, то вы правы. кстати, в вашем коде тоже есть инструкции custom, так что скорее дело в самом FPU. floatsisf - это судя по всему преобразование int->float, так что родной fpu какой-то убогий. попробуйте этот:

 

http://www.alterawiki.com/wiki/Configurable_FPU

у него вроде инструкций побольше

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


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

Спасибо.

Убыстрение на 150-200 тактов на перевод между типами, т.к. C_FPU содержит инструкции по переводу int2float, float2int.

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


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

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

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

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

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

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

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

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

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

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