Forum: FPGA, VHDL & Co. pointeroperation mittels access in VHDL


von René D. (Firma: www.dossmatik.de) (dose)


Angehängte Dateien:

Lesenswert?

Ich erzähle erstmal mein Endziel und dann die Details.

Ich habe ein array auf das ich ein Pointer haben will. Diesen Pointer 
will ich über die VHPI Schnittstelle nach Außen in einen C Coprozess 
übergeben, um mit C Pointer Operationen das Ramblockfile zu 
manipuileren. Etwas trickreich.

Ich brauche einen Call bei Referenz um den gleichen Speicherbereich im 
VDHL Simulator und im C Programm zu nutzen.


Ich habe erstmal ein reines VHDL Problem. VHDL lässt die Zuweisung 
desRAM_blocks auf den Pointer nicht zu. Hier gibt es bestimmt ein Cast.

1
 ram_proc: process
2
 variable pointer :ram_byte_ptr;
3
 begin
4
   ram_byte_ptr:= RAM_BLOCK0;  --wie muss diese Zuweisung richtig heißen??
5
   wait; 
6
 end process;

von Sigi (Gast)


Lesenswert?

Ich bin mir nicht sicher, aber ich glaube, dass dein
CAST nicht möglich sein wird, da du ja dann deine
Daten mittels ACCESS-Sematik auch zerstören kannst
(also Zugriff auf Nicht-Access-Variablen).

Einfacher Vorschlag: Erzeuge doch einfach einen
Datenblock dynamisch mittels <new...> und kopiere
deine Daten einfach in diesen Block. Dann an
die VHPI-Schnittstelle weiterreichen und dannach
ggf. zerstören.

von Achim S. (Gast)


Lesenswert?

Hallo Rene,

auf http://vhdl.renerta.com/source/vhd00001.htm habe ich folgende 
Hinweise gefunden (weil mich die Sache mit access jetzt selbst 
interessiert hat):

    Application of access types is restricted to variables: only 
variables can be of an access value. Also, only variables can be 
designated by an access value.

du versuchst access auf ein Signal (RAM_BLOCK0) anzuwenden, nicht auf 
eine Variable.

    Although access types are very useful for modeling potentially large 
structures, like memories or FIFOs, they are not supported by synthesis 
tools.

Willst du irgendwas synthetisierbares erstellen?

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

> Willst du irgendwas synthetisierbares erstellen?


Ja es soll ein Teil fitbar sein.
Der RAM Block ist vorhanden.

Aber nicht alles, der access pointer muss nicht fitbar sein.


Der RAM_Block ist real vorhanden und ich will mit einer C-Funktion 
verschiedene RAM Muster einschleusen und das Ergebnis der Simulation 
abgreifen.


Ist Datenblock dynamisch mittels <new...> fitbar?

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

>     Application of access types is restricted to variables: only
> variables can be of an access value. Also, only variables can be
> designated by an access value.
>
> du versuchst access auf ein Signal (RAM_BLOCK0) anzuwenden, nicht auf
> eine Variable.


Meinst wenn der RAM Block eine variable wäre könnte es klappen?


access ist ja schon eine variable?

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Den Vorteil den ich mir erhoffe, ich will den RAM modifizieren und das 
ohne einem Bussystem durch alles Instanzen mit Handshake für lesen und 
schreiben.

Das Handshake wäre sowieso schwierig. Da nur der VHDL thread events 
anschieben kann. Es würde auf ein pollen hinauslaufen.

von Achim S. (Gast)


Lesenswert?

René D. schrieb:
> Meinst wenn der RAM Block eine variable wäre könnte es klappen?

Ja, so hätte ich es interpretiert:

only variables can be of an access value  -> ram_byte_ptr muss Variable 
sein
only variables can be designated by ... -> RAM_BLOCK0 muss Variable sein

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Achim S. schrieb:
> René D. schrieb:
>> Meinst wenn der RAM Block eine variable wäre könnte es klappen?
>
> Ja, so hätte ich es interpretiert:
>
> only variables can be of an access value  -> ram_byte_ptr muss Variable
> sein
> only variables can be designated by ... -> RAM_BLOCK0 muss Variable sein

reicht leider nicht


memory.vhd:43:4: type "ram_byte_ptr" not allowed in an expression
ghdl: compilation error


1
begin
2
3
 ram_proc: process
4
 variable pointer :ram_byte_ptr;
5
 
6
 variable RAM_BLOCK0:ram_byte:=(
7
X"3c",X"27",X"3c",X"24",X"3c",X"24",X"3c",X"27",X"3c",X"27",X"0c",X"00",X"08",X"00",X"00",X"00",
8
X"27",X"af",X"03",X"3c",X"34",X"af",X"8f",X"8c",X"30",X"30",X"14",X"00",X"3c",X"34",X"90",X"a3",
9
X"ff",X"ff",X"ff",X"ff",X"ff",X"ff",X"ff",X"ff",X"ff",X"ff",X"00",X"00",X"00",X"80",X"00",X"00",
10
X"00",X"00",X"00",X"00",X"00",X"00",X"00",others=>X"00");
11
12
13
 begin
14
   ram_byte_ptr:= RAM_BLOCK0;   --Zeile 43
15
   wait; 
16
 end process;

von Achim S. (Gast)


Lesenswert?

na ja, die Zuweisung müsste auch nicht an den Typ (ram_byte_ptr:=... ) 
sondern an die Variable (pointer:=...) gehen. Aber das klappt natürlich 
auch nicht, denn es fehlt sozusagen noch der "Adressoperator" für 
RAM_BLOCK0.

Alle Codebeispiele, die ich jetzt finden konnte, arbeiten mit new. 
Bleibt also wohl nur der Vorschlag von Sigi:

Sigi schrieb:

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Das geht durch.
1
 ram_proc: process
2
 variable pointer :ram_byte_ptr;
3
 
4
 variable ram_1: ram_byte_ptr:= new ram_byte'(
5
X"3c",X"27",X"3c",X"24",X"3c",X"24",X"3c",X"27",X"3c",X"27",X"0c",X"00",X"08",X"00",X"00",X"00",
6
X"27",X"af",X"03",X"3c",X"34",X"af",X"8f",X"8c",X"30",X"30",X"14",X"00",X"3c",X"34",X"90",X"a3",
7
X"ff",X"ff",X"ff",X"ff",X"ff",X"ff",X"ff",X"ff",X"ff",X"ff",X"00",X"00",X"00",X"80",X"00",X"00",
8
X"00",X"00",X"00",X"00",X"00",X"00",X"00",others=>X"00");
9
10
11
 begin
12
  
13
   wait; 
14
 end process;

Leider behindern die Beschränkung der variable das andere Prozesse 
darauf zugreifen können. Das würde meinen Code, den ich testen will zu 
sehr zerstören.

von Sigi (Gast)


Lesenswert?

Das kann durch "shared Variables" umgangen werden.
Funktioniert zumindestens auch unter Xilinx ISim,
und das ist ja nicht der Inbegriff an Fortschritt.
(Beispiel habe ich jetzt gerade nicht zur Hand,
hab's aber schon erfolgreich eingesetzt)

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

ich ziele auf GHDL

aber das shared variable und ohne access könnte eine Lösung sein.

Brauche mehr info.

Wie weit ist das Scope einer shared variable?
Innerhalb des Files oder des gesamten Projektes?


Könnte die shared varialbe auch in der c-cosimulation auch gültig sein?
Dann könnte ich von außen darauf zugreifen.

von Sigi (Gast)


Lesenswert?

Soweit mir bekannt sind SharedVars in Komponenten
(Zugriff nur von Prozessen innerhalb einer Komponente)
als auch in Packages (Zugriff von allen Prozessen
des zugeh. Models) zugelassen. Schau einfach mal
in eines von Peter Ashenden's Bücher nach.

von Sigi (Gast)


Lesenswert?

C-Cosimulation: wird leider noch nicht von Xilinx's ISE
unterstützt, keine Ahnung. Und bei QuartusII kenne ich
mich nicht ausreichend aus, GHDL noch weniger.

von Mr. Zulu (Gast)


Lesenswert?

Was macht denn diese VHPI Schnittstelle genau? Oder was soll sie in 
Deinem Fall tun?

von Strubi (Gast)


Angehängte Dateien:

Lesenswert?

Moin,

das Problem bei der Instanzierung eines Array innerhalb GHDL ist, den 
Zugriff von C sauber zu wrappen, da muss man tief in den GHDL-Interna 
herumstochern.
Es ist einfacher, ein RAM einfach zu emulieren. Habe eine Datei als 
Beispiel angehängt (aus der ghdlex Co-Simulation Library zu GHDL).
D.h. der C-Seite gehört eigentlich der RAM-Buffer, und VHDL greift drauf 
zu. Das ist deutlich einfacher zu handeln.
ghdlex exportiert das RAM auch per netpp aufs Netzwerk, per Python 
schreibt man dann relativ simpel:
1
d = netpp.connect("TCP:localhost")
2
3
r = d.sync() # Synchronize with target
4
5
# We need to get the attribute manually,
6
# because it has a non-pythonish namespace id:
7
ram0 = getattr(r, ":simboard:ram0:")
8
9
b = ram0.get() # read out RAM buffer

Grüsse,

- Strubi

von Strubi (Gast)


Lesenswert?

Übrigens, noch vergessen:

Ich habe gerade die letzten Tage die Erkenntnis erlangt, dass GHDL es 
gar nicht mag, wenn ein fremder Thread per VPI (nicht VHPI) Daten 
manipuliert.
Heisst, es ist nicht thread-safe.
Deswegen widersetzt sich GHDL auch dem gut gemeinten Ansinnen, 
Datenblöcke nach aussen im "Slave"-Modus zu exportieren. Also: GHDL will 
immer der Master sein. Datenaustausch zwischen Threads (welche ghdlex 
nutzt), gehen nur über FIFOs oder andere emulierte entities mit sauberen 
Mutexen und Handshake zwischen den Threads.
Sonst passiert das, was man auch aus zwei unterschiedlichen Clock 
domains mit nicht atomischen Änderungen von Bitvectoren (also nix gray 
coded) kennt.

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Mr. Zulu schrieb:
> Was macht denn diese VHPI Schnittstelle genau? Oder was soll sie in
> Deinem Fall tun?

Einen Server starten.
Das geht auch schon.
Nun muss der Server Funtionalitäten bekommen. Darunter fallen auch Daten 
im VHDL-Simulations thread zu ändern.

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.