Forum: FPGA, VHDL & Co. Zuweisung von Shared Variablen


von DuArte (Gast)


Lesenswert?

Hi,

habe folgenden Code mit VHDL-2008 in Modelsim kompiliert und simuliert.
Wider meiner Erwartung ist der Ausgangsport Q undefiniert.

Kann mir jemand sagen, wieso Q nicht die Werte von vec widerspiegelt?

Grüße, DuArte


1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4
5
6
entity test_shared is
7
port( Q : out std_logic_vector(3 downto 0) );
8
end test_shared;
9
10
11
architecture xyz of test_shared is
12
13
signal clock : std_logic;
14
signal cnt : unsigned(1 downto 0) := "00";
15
shared variable vec : std_logic_vector(3 downto 0);
16
17
begin
18
19
Q <= vec;
20
21
Clk: process
22
begin
23
  clock <= '1'; wait for 10 ns;
24
  clock <= '0'; wait for 10 ns;
25
end process;
26
27
28
Count: block
29
begin
30
  cnt <= cnt + 1 when rising_edge(clock);
31
end block;
32
33
34
Share1: process
35
begin
36
  wait until clock='1';
37
  
38
  if cnt="00" then
39
    vec := "ZZZZ";
40
  end if;
41
end process;
42
43
44
45
Share2: process
46
begin
47
  wait until clock='1';
48
  
49
  if cnt/="00" then
50
    vec := "1111";
51
  end if;
52
end process;
53
54
55
56
end xyz;

von Duke Scarring (Gast)


Lesenswert?

vec ist eine Variable und die hat kein Events. Q wird aber erst bei 
einem 'event vom Simulator aktualisiert.

Was willst Du denn eigentlich machen? Dein Code sieht recht 'akademisch' 
(um nicht zu sagen praxisfern) aus.

Duke

von Christian R. (supachris)


Lesenswert?

Soll das synthetisiert werden können? Die einzige mir bekannte Anwendung 
einer shared Variable ist die VHDL Beschreibung eines true dual ported 
RAM, der dann (Bei Xilinx) im BlockRAM gebildet wird. Da braucht man die 
shared Variable für die beiden Schreibzugriffe. Aber da muss man recht 
viel beachten, unter anderem die Reihenfolge der Zugriffe, da kommt 
nämlich verschiedes raus (read first, write first...).

von DuArte (Gast)


Lesenswert?

Hi,

nein, es ist kein akademisches Stück. Es soll für ein Testbench-Modell 
verwendet werden, bei dem tatsächlich Shared-Variablen auf einen 
Ausgangsport gemappt werden sollen.

>>vec ist eine Variable und die hat kein Events
Woher hast du diese Erkenntnis?


VG, DuArte

von Duke Scarring (Gast)


Lesenswert?

DuArte schrieb:
>>>vec ist eine Variable und die hat kein Events
> Woher hast du diese Erkenntnis?
Äh. Aus meiner VHDL-Grundlagenvorlesung vor x Jahren?!

Du kannst aber auch z.B. hier schauen:
http://www.nt-nv.fh-koeln.de/Labor/VhdlEasy/Kap3/k3.html#A1
1
* Variablen können während des Programmlaufs beliebig oft 
2
  neue Werte zugewiesen werden.
3
4
* Signale sind Variablen, die mit einer Ereignisliste kommunizieren,
5
  in der die sog. Transaktionen verwaltet werden.

DuArte schrieb:
> Es soll für ein Testbench-Modell
> verwendet werden, bei dem tatsächlich Shared-Variablen auf einen
> Ausgangsport gemappt werden sollen.
Dann bau einen Multiplexer in Deine Testbench ein.

Duke

von DuArte (Gast)


Lesenswert?

Hallo Duke,

auf der FH-Köln-Seite steht, dass Signale mit einer Ereignisliste 
kommunizieren. Es steht dort nicht, dass Variablen nicht mit einer 
Ereignisliste kommunizieren. Also wie kommst du darauf?


VG, DuArte

von DuArte (Gast)


Lesenswert?

Habe mal im Ashenden gesucht, aber noch nichts gefunden ...

von Duke Scarring (Gast)


Lesenswert?

Ich hab mal im LRM gesucht, aber auch nichts gefunden...

von DuArte (Gast)


Lesenswert?

Hallo Duke,


habe mal folgenden Test in Modelsim unternommen:
1
if variable_xy'event then
2
...

führt zur Fehlermeldung
1
Attribute "event" requires a static signal prefix.


Du hast also Recht. Danke für diese neue Erkenntnis, das war mir 
überhaupt nicht bewusst gewesen.

VG, DuArte

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.