Zuweisung von Shared Variablen

Gast #2893982
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;
Gast #2902796
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
#2902832
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...).
Gast #2905681
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
Gast #2905743
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
Gast #2905789
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
Gast #2905851
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren