Forum: FPGA, VHDL & Co. Custom Instructions - Parameterübergabe


von Student (Gast)


Lesenswert?

Hallo,

ich habe folgendes Problem:

Ich habe eine Funktion programmiert und diese im SOPC Builder über 
Custom Instructions eingebunden.
Nun möchte ich diese im Nios verwenden und habe Sie folgendermaßen 
aufgerufen.
Es handelt sich um ein Programm, dass Gleitkommazahlen in Integerzahlen 
umwandelt!

-----------------------------------------------------------------
#include <stdio.h>
#include <math.h>
#include <system.h>

int FLOAT_TO_INT(int val){                       //     Float to Int
    return ALT_CI_FLOAT_TO_INT_INST(val,0) ; }


float index = -100.0;
int *pval = (int *)&index ;

int main(void){
        while (1){
        index+=5.0;
        printf(" Dez:  %d\n",FLOAT_TO_INT(*pval));}
------------------------------------------------------------------

Ich habe hier den Umweg gewählt und einen Pointer auf meinen Float 
zeigen lassen, diesen Zeiger dann in Integer gespeichert und der 
Funktion übergeben.
Nun würde ich meiner Funktion gerne direkt den Float übergeben ohne den 
Umweg über den Zeiger. Leider funktioniert mein Programm dann nicht 
mehr. Ich hatte gehofft, dass es reicht, in der folgenden Zeile (int) 
einfach durch (float) zu ersetzten, doch das reicht nicht.

-------------------------------------------------------------------
int FLOAT_TO_INT(float val){                       //     Float to Int
    return ALT_CI_FLOAT_TO_INT_INST(val,0) ; }


float index = -100.0;

int main(void){
        while (1){
        index+=5.0;
        printf(" Dez:  %d\n",FLOAT_TO_INT(index));}
------------------------------------------------------------------

Kann mir vielleicht jemand helfen, welche Änderung ich vornehemn muss, 
damit ich der Funktion auch einen Float übergeben kann?

Mfg Christoph

von Florian G. (badscher)


Lesenswert?

Habe in meiner dipl.- Arbeit vor nem Jahr mir CIs gearbeitet und meine 
mich noch leicht einnern zu können, dass man bei CI-Aufrufen 
dataa(32bit) & datab(32bit) übergibt und die CI zum Schluss 
result(32bit) ausgibt.

Folgendes krame ich mal aus meinen grauen hirnzellen raus:


...
unsigned int A,B,RESULT;

RESULT=ALT_CI_[CI-Name](A,B,n);

...

das 'n' ist ein 8 bit Steuerwort, aber das hast du ja auch schon 
berücksichtigt ;)

So wie es oben steht sollte es funtionieren.

Mit dem Befehl wird nur !einmal! über A und B ein Parameter von je 32 
bit übergeben, float hat aber glaub ich 64? so müsstest du den anderen 
Input (B) noch hinzunehmen, deine Hardware ein wenig umstellen und das 
Ding sollte laufen.

Ich habe als übergabe parameter immer unsigned integer genommen, die 
haben in meinem Fall (CORDIC-Algorithmus) gelangt.

von Christoph (Gast)


Lesenswert?

Hallo,

Habe mein Problem erkannt:

Mir wurde erklärt das die Custom Instruction am Ein- und Ausgang nur 32 
Bit Integer verarbeiten können. (mag sein das es auch noch andere 
Möglichkeiten gibt...)
Ich habe es aber jetzt dabei belasen und meinen einfachen 32 Float über 
diesen Trick übergeben...

Danke für die Antwort!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.