Guten Morgen,
vor kurzem hab ich hier schon mal was gepostet... es ging dabei um die
Frage wie man die Kommunikation FPGA zu USB-Controller am einfachsten
machen kann. Es ging in Richtung Softcore... aber ich möchte mich
dennoch mal schlaumachen, wie es ohne einen einprogrammierten µP gehen
könnte.
Hier im Forum hab ich gelesen, von C Code zu synthesefähigem VHDL zu
kommen geht nur mit Handarbeit oder sündhaft teuren Tools. Doch ich
frage mich, wie macht man sowas in Handarbeit??
Nehmen wir also an, ich hab den C-Code vorliegen.. wie fang ich an? Gibt
es dafür irgendwelche Richtlinien oder Kochrezepte? Kennt jemand
Tutorials zu sowas wo das mal an einfachen Beispielen vorgestellt wird?
Mir ist einfach der Übergang von dieser Schritt-für-Schritt Reihenfolge
bei C (oder Pascal oder sowas) hin zu der "alles wird nur verdrahtet"
Philosophie von reiner Hardwarebeschreibung nicht richtig klar... das
richtige Stichwort dazu ist State Machine, das weiß ich, aber wie, was
und warum ist mir unklar
Danke für eure Antworten
Viele Grüße
CM
@CM
>Hier im Forum hab ich gelesen, von C Code zu synthesefähigem VHDL zu>kommen geht nur mit Handarbeit oder sündhaft teuren Tools. Doch ich>frage mich, wie macht man sowas in Handarbeit??
1.) Man muss fit in C sein.
2.) Man muss fit in VHDL sein.
3.) Man bildet die Funktion des C-Codes inhaltlich in VHDL ab.
>Nehmen wir also an, ich hab den C-Code vorliegen.. wie fang ich an? Gibt>es dafür irgendwelche Richtlinien oder Kochrezepte? Kennt jemand
Jain.
>Tutorials zu sowas wo das mal an einfachen Beispielen vorgestellt wird?
Nicht dass ich wüsste. Das Problem ist vor allem, dass C und VHDL
verschiedene Grundprinzipien beinhalten.
C : Sequenzielle Abläufe
VHDL: Sequenzielle oder parallele Abläufe
Die muss man transformieren, das verlangt viel Know How von beiden
Sprachen.
Mir ist einfach der Übergang von dieser Schritt-für-Schritt Reihenfolge
bei C (oder Pascal oder sowas) hin zu der "alles wird nur verdrahtet"
Philosophie von reiner Hardwarebeschreibung nicht richtig klar... das
Ist auch nicht ganz trivial :-) Die Spezialisten für sowas werden gut
bezahlt ;-)
>richtige Stichwort dazu ist State Machine, das weiß ich, aber wie, was>und warum ist mir unklar
Eine State Machine realisiert einen sequenziellen Befehlsablauf wie in
einem C-Programm.
MfG
Falk
Danke für eure Antworten
Viele Grüße
CM
So wird es zB. automatisch gemacht:
http://mesl.ucsd.edu/spark/
Funktioniert ganz gut, wenn man die Einschränkungen beachtet:
- keine Pointer
- keine structs
- kein break / continue
Ergebnis des Prozesses ist als Steuerpfad eine One-Hot FSM und als
Datenpfad die in ALUs abgebildete Arithmetik.
Wer auch immer dieser CM war, der um 09.49h was gepostet hat, er spricht
nicht für mich!!! Es intressiert mich sehr wohl, was hier gepostet wird
und ich lese es mit großem Intresse!!!!
Vor allem an dich Falk mal nen großen Dank, du hast mir diese Woche
schon sehr viel weitergeholfen!!!
>Eine State Machine realisiert einen sequenziellen Befehlsablauf wie in>einem C-Programm.
Machen wir mal ein einfaches Beispiel wie es in einem Mikrocontroller
programmiert sein könnte... nur so ausgedacht. Sagen wir P0 ist ein 8Bit
Port, bidirektional.
...
while(1)
{
P0=0x02; //Anweisung: es soll gelesen werde
//kurze Pause
Temp=P0; //lesen vom Bus
if(Temp==0xFF)
{
P0=0x03 //Anweisung: jetzt wird geschrieben
//kurze Pause
P0=0x22 //das ist ne Fehlermeldung an einen anderen Busteilnehmer
}
}
Kann man irgendwie generell sagen, wieviele Zustände eine State Machine
bräuchte, um diesen Ablauf nachzubilden?? Der Ablauf ist natürlich
quatsch...
@CM... der Echte!!!
>Vor allem an dich Falk mal nen großen Dank, du hast mir diese Woche>schon sehr viel weitergeholfen!!!
Keine Ursache.
>while(1)>{> P0=0x02; //Anweisung: es soll gelesen werde
Ist das nicht ein Schreibzugriff?
> //kurze Pause> Temp=P0; //lesen vom Bus> if(Temp==0xFF)> {> P0=0x03 //Anweisung: jetzt wird geschrieben> //kurze Pause> P0=0x22 //das ist ne Fehlermeldung an einen anderen Busteilnehmer> }>}>Kann man irgendwie generell sagen, wieviele Zustände eine State Machine>bräuchte, um diesen Ablauf nachzubilden?? Der Ablauf ist natürlich>quatsch...
Das ist einfach, jede C-Anweisung wird in einen State abgebildet. Die
Pausen (die man in C mit ne Schleife machen würde) kann man auch in ner
State Machine einfach als Schleife (Zähler) umsetzen.
MFG
Falk
Ok, ich will nicht sagen, dass ich das verstehe, aber ich beginne die
Sache zu verstehen!
Das bedeutet dann aber auch, dass ich im Prinzip sowas wie Funktionen
eigentlich nicht wirklich abbilden kann, oder??? Je mehr Code, desto
mehr Zustände für die StateMachine und umso komplizierter wird das
ganze... oder kann ich z.B. für eine jede Funktion eine StateMachine
schreiben und dann sozusagen ein main() Programm auch als eine
STateMachine welche die anderen "aufruft" wenn gewissen Bedingungen
erfüllt sind???
@CM
>Das bedeutet dann aber auch, dass ich im Prinzip sowas wie Funktionen>eigentlich nicht wirklich abbilden kann, oder??? Je mehr Code, desto
Doch, man kann. Die Frage ist, mit welchem Aufwand und in wie weit das
ganze dann noch lesber, geschweige denn wartbar ist.
>mehr Zustände für die StateMachine und umso komplizierter wird das>ganze... oder kann ich z.B. für eine jede Funktion eine StateMachine>schreiben und dann sozusagen ein main() Programm auch als eine>STateMachine welche die anderen "aufruft" wenn gewissen Bedingungen>erfüllt sind???
Das geht auch.
MFG
Falk
Es gibt ein spezifiziertes Subset von SystemC, welches synthesefähig
sein soll. Inwieweit das schon von den Toolherstellern umgesetzt wurde
ist mir nicht bekannt. Siehe:
http://www.systemc.org/
Hersteller von SystemC Synthesetools ist zB:
http://www.celoxica.com/
Hi
Also ich sowas auch schon während eines Praktikums gemacht, da ging es
drum nen Rechenalgorithmus von C in VHDL umzusetzen. Meiner Meinung nach
hat es keinen Sinn einen C-Code direkt in VHDL umzusetzen (also mit
einer grossen Statemachine, die einfach den C-Code wiederspiegelt). Den
so wird die sequenzielle Abarbeitung von Prozessoren in einen
Logibaustein "gepresst" und die Vorteile der Logik gehen verloren.
Besser ist es die eigentlich Funktion des C-codes in VHDL neu zu
schreiben, da dies dann sehr viel effektiver bearbeitet werden kann.
Der Punkt ist nur: ich hab keinen Rechenalorithmus umzusetzen sondern
die Kommunikation zwischen einem FPGA und einem Peripherie IC. Es ist
also irgendwie schon was sequentielles....
Gut wenn es um sowas geht musst du es natürlich sequentiell mit
Statemachine machen. Aber ich würde es auch auf jeden Fall nochmal
selbst in VHDL schreiben und nicht mit so einen Konverter einfach
umwandeln. Das wird sicherlich nicht sehr effizient umgesetzt. Und so
schwierig ist VHDL nun auch nicht, wenn man mal die Funktionsweise der
ganzen Sache durchschaut hat. Und das musst du sowieso wenn du mit FPGAs
zu tun hast.