Ich entwickle einen allgemeinen Bildverarbeitungskern für FPGAs und ASICs. Die Idee ist, ihn mit einem Standardprozessor zu verbinden. Eines der Probleme, die ich habe, ist, wie man ihn "programmiert". Lassen Sie mich erklären: Der Kern hat einen Befehlsdecoder für meine "benutzerdefinierten" Erweiterungen. Zum Beispiel:
vector_addition $vector[0], $vector[1], $vector[2] // (z.B. v2 = v0+v1)
und viele weitere ähnliche Operationen. Dieser Befehl wird vom Prozessor über den Bus an den Kern gesendet, wobei der Prozessor für Schleifen, nicht-vektorisierte Operationen usw. verwendet wird, wie zum Beispiel:
for (i=0; i<15;i++) // auf dem Prozessor auszuführen
vector_add(v0, v1, v2) // auf meinem benutzerdefinierten Kern auszuführen
Das Programm ist in C/C++ geschrieben. Der Kern benötigt nur den Befehl selbst, in Maschinencode
- opcode = vector_add = 0x12h
- register_src_1 = v0 = 0x00h
- register_src_2 = v1 = 0x01h
-
register_dst = v2 = 0x02h
maschinencode = opcore | v0 | v1 | v2 = 0x7606E600h
(oder was auch immer, einfach eine Verkettung verschiedener Felder, um die Anweisung im Binärformat zu erstellen)
Nach dem Senden über den Bus an den Kern kann der Kern alle Daten aus dem Speicher über dedizierte Busse anfordern und alles ohne Verwendung des Prozessors handhaben. Die große Frage ist: wie kann ich die vorherige Anweisung in ihre hexadezimale Darstellung übersetzen? (das Senden über den Bus ist kein Problem). Einige Möglichkeiten, die mir einfallen, sind:
- Interpretierten Code ausführen (Übersetzung in Maschinencode zur Laufzeit im Prozessor) --> sehr langsam, selbst bei Verwendung einer Art Inline-Makro
- Die benutzerdefinierten Abschnitte mit einem externen benutzerdefinierten Compiler kompilieren, die Binärdatei aus dem externen Speicher laden und mit einer eindeutigen Anweisung an den Kern übertragen --> schwer zu lesender/verstehender Quellcode, schlechte SDK-Integration, zu viele Abschnitte, wenn der Code sehr segmentiert ist
- JIT-Kompilierung --> zu komplex nur für diese Aufgabe?
- Den Compiler erweitern --> ein Alptraum!
- Einen benutzerdefinierten Prozessor an den benutzerdefinierten Kern anschließen, um alles zu handhaben: Schleifen, Zeiger, Speicherzuweisung, Variablen... --> zu viel Arbeit
Das Problem betrifft Software/Compiler, aber für diejenigen, die über tiefgehendes Wissen zu diesem Thema verfügen, handelt es sich um ein SoC in einem FPGA, wobei der Hauptprozessor ein MicroBlaze ist und der IP-Kern AXI4-Busse verwendet.
Ich hoffe, ich habe es richtig erklärt... Vielen Dank im Voraus!