VHDL Instanziierung

Gast #5026424
Lesenswert?

Hallo Leute,

ich habe folgenden Code und dazu den Schaltplan im Anhang "vhdl_RW.PNG", 
will aber den Schaltplan wie es im Anhang "vhdl_RW_1.PNG".
Habe einige Sachen ausprobiert, aber ohne Erfolg. Ich will quasi den 
Block bis zu 32 mal verfielfachen können. Die Ports EN und DATA sollen 
bei allen gleich sein, die restlichen aber nur dem jeweiligen Block 
zugeordnet.

Block 1: EN, DATA, MR1, MW1, SR1, SR1
Block 2: EN, DATA, MR2, MW2, SR2, SR2
Block n: EN, DATA, MRn, MWn, SRn, SRn etc.

Eingänge und Ausgänge MR, MW, SR, SW sollen dabei jeweils [31:0] breit 
sein.

Ist das überhaupt in der Art und Weise möglich? Bin über jeden Ratschlag 
dankbar.

Gruß
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3

4

5

6
entity top is
7
 
8
    Generic     (
9
                width : integer := 2
10
                );
11
 
12
    Port        ( 
13
                EN : in STD_LOGIC_VECTOR(width-1 downto 0);
14
                DATA : in STD_LOGIC_VECTOR(width-1 downto 0);
15
                MR : in STD_LOGIC_VECTOR(width-1 downto 0);
16
                MW : in STD_LOGIC_VECTOR(width-1 downto 0);
17
                SR : out STD_LOGIC_VECTOR(width-1 downto 0);
18
                SW : out STD_LOGIC_VECTOR(width-1 downto 0)
19
                );          
20
end top;
21

22

23
architecture STRUCTURE of top is
24

25
    component ADDREN_READ_WRITE is
26
    
27
    port        (   
28
                EN:                in std_logic;
29
                DATA:                in std_logic;
30
                MR:        in std_logic;
31
                MW:       in std_logic;
32
                SR:         out std_logic;
33
                SW:        out std_logic
34
                
35
                
36
                );
37
    end component ADDREN_READ_WRITE;
38

39

40
begin
41

42
GEN:
43
for i in width-1 downto 0 generate
44

45
    proc_rw: component ADDREN_READ_WRITE
46
    
47
    port map    (
48
                EN => EN(i), 
49
                DATA => DATA(i), 
50
                MR => MR(i),  
51
                MW => MW(i),
52
                SR => SR(i),
53
                SW => SW(i)
54
                );
55
end generate;
56

57
end STRUCTURE;
58

59

60
library IEEE;
61
use IEEE.STD_LOGIC_1164.ALL;
62

63
entity ADDREN_READ_WRITE is
64

65
    port        (   
66
                EN: in std_logic;
67
                DATA: in std_logic;
68
                MR: in std_logic;
69
                MW: in std_logic;
70
                SR: out std_logic;
71
                SW: out std_logic
72
                );
73
    end;
74
    
75
architecture behavior of ADDREN_READ_WRITE is
76
begin
77

78
    SR <= (DATA and (not EN)) or (MR and EN);
79
    SW <= (DATA and (not EN)) or (MW and EN);
80

81
end behavior;
Angehängte Dateien:
Gast #5026446
Lesenswert?

Du könntest für die Mr/w und Sr/w-Ports in einem Package einen Typ 
deklarieren, z.B.

1
 type STD_LOGIC_MATRIX32 is array (natural range <>) of std_logic_vector(31 downto 0);
2

3

4

5
port      (
6
                EN : in STD_LOGIC_VECTOR(width-1 downto 0);
7
                DATA : in STD_LOGIC_VECTOR(width-1 downto 0);
8
                MR : in STD_LOGIC_MATRIX32(width-1 downto 0);
9
                MW : in STD_LOGIC_MATRIX32(width-1 downto 0);
10
....
Must aber mal nachlesen, wie man Signalarrays richtig deklariert und 
indiziert, ich habs nicht im Kopf.
Gast #5027097
Lesenswert?

Ja das mit der Formatierung stimmt :) sorry dafür.
wichtig ist nur, dass irgendwie das 2.Bild entsteht. Da stimmen bei 
meinen Anfänger sein bestimmt noch Einige Sachen nicht.

Cool wäre, wenn ich halt ein so ein Block erstellen und den bis zu 32 
mal instanziieren könnte, aber eben, dass bei allem Blöcken der EN und 
DATA Port gleichgeschaltet werden, aber die MR, MW, SR, SW Ports für 
alle Blöcke mit einer Breite von [31:0] separat sind. Ich kam nur bis 
dahin, dass ich die Blöcke nach Belieben vervielfachen konnte, nur aber 
waren auch die MR, MW, SR und SW Ports auch mit allen Blöcken 
gleichzeitig verbunden und das soll nicht sein.
Moderator (Firma: Titel) Persönliche Seite #5027147
Lesenswert?

Thomas D. schrieb:
> Ich kam nur bis dahin, dass ich die Blöcke nach Belieben vervielfachen
> konnte, nur aber waren auch die MR, MW, SR und SW Ports auch mit allen
> Blöcken gleichzeitig verbunden und das soll nicht sein.
Mein Vorschlag: verdrahte einfach mal ein paar dieser Komponenten 
"manuell" ohne generate Schleife.
Und wenn du dann nach 5 oder 6 oder 17 verdrahteten Komponenten die 
Gemeinsamkeiten und das Fortlaufende siehst, dann ist es einfach, eine 
Schleife daraus zu bilden...
#5027196
Lesenswert?

Entweder du benutzt Aliases
1
signal MR   : std_logic_vector(1023 downto 0);
2
alias MR1   : std_logic_vector(31 downto 0) is MR(31 downto 0); 
3
alias MR2   : std_logic_vector(31 downto 0) is MR(63 downto 32); 
4
...
5

6
for i in width-1 downto 0 generate
7
    port map (
8
        MR  => MR(i*32+31 downto i*32),
9
...

Oder Arrays mit einem selbstdefinierten Datentyp
1
type slv32_t is array (natural range <>) of std_logic_vector(31 downto 0);
2
signal MR   : slv32_t(1 to 32);
3
...
4

5
for i in 1 to 32 generate
6
    port map (
7
        MR  => MR(i),
8
...

optional falls es unbedingt MR1, MR2 ... usw. heißen muss:
1
alias MR1 is MR(1);
2
alias MR2 is MR(2);
3
...
Gast #5027295
Lesenswert?

Hi danke für Eure antworten:

also wenn ich Arrays mit einem selbstdefinierten Datentyp verwende, 
erscheint bei mir folgender Fehler:

"mr is already declared in this region"

Und wenn ich es wie ganz oben mit den Aliases ausprobiere, sagt der mir, 
dass MR kein std_logic ist.
Moderator (Firma: Titel) Persönliche Seite #5027389
Lesenswert?

Thomas D. schrieb:
> also wenn ich Arrays mit einem selbstdefinierten Datentyp verwende,
> erscheint bei mir folgender Fehler:
> "mr is already declared in this region"
Das kommt vermutlich darauf an, wie du das machst. Lass doch mal 
sehen. Am Besten hängst du einfach VHDL Dateien an, die das Problem in 
einem Dreizeiler zusammenfassen...
#5027774
Lesenswert?

Thomas D. schrieb:
> @Thomas W. anbei der VHDL Code. Wahrscheinlich platziere ich es nur
> falsch.
>
> Danke für die Hilfe!

Du wolltest doch eine Beschreibung für Bild 2. Deine Top entity in der 
Datei bezieht sich aber auf Bild 1. Dort ist MR schon definiert. 
Deswegen die Fehlermeldung. Laut Bild 2 gibt es aber kein Signal MR 
sondern nur MR1 und MR2 als 32bit Vectoren. Soll wohl letztlich bis MR32 
gehen wenn ich dein Problem richtig verstehe.
Gast #5028477
Lesenswert?

Thomas D. schrieb:
> "mr is already declared in this region"

Du musst den Typ in einem eigenen VHDL-Package deklarieren. Dieses 
bindest Du mit 'use' in Deinen code ein, genau wie die anderen packages 
(z.B. ieee.irgendwas). Damit ist dieser Typ definiert und Du kannst ihn 
in der Portdeklaration der Entity benutzen wie einen normalen Signaltyp

1
package busreg_pkg is
2

3
type STD_LOGIC_MATRIX32 is array (natural range <>) of std_logic_vector(31 downto 0);
4

5
end busreg_pkg;
6

7

8
....
9

10
use work.busreg_pkg.all;
11

12
...
Gast #5031930
Lesenswert?

Einen Package habe ich nun erstellt und erfolgreich in meine eigentliche 
top vhdl datei eingebunden, aber bekomme jetzt Fehlermeldungen bezüglich 
des Datentypen wie im Screenshot (Anhang) zu sehen ist. Ich wüsste jetzt 
auch nicht wie und was ich alles im Quelltext umändern müsste, damit es 
passt.

ganz unen bei der Signalzuweisung wird es am Ende dann gar nicht mehr 
passen?

SR <= (DATA and (not EN)) or (MR and EN);

Das eine ist std_logic/vector das andere ein Array. Damit wird er 
sicherlich auch nicht klarkommen.

Werde es weiter ausprobieren.
Ich wünsche Euch noch einen angenehmen Feiertag
Angehängte Dateien:
Gast #5032935
Lesenswert?

Noch nicht ganz die Lösung :)
Wenn man sich den Anhang "elaborated_design.png" anschaut, geht das 
schon in die richtige Richtung. Allerdings sollte ich erwähnt haben, 
dass ich letztlich aus dem Ganzen einen IP-Package für Vivado Projekte 
erstellen wollte und da meckert der, weil nur std_logic oder nur 
std_logic_vector Datentypen erlaubt sind. Selbstdefinierte Typen kennt 
er nicht oder man kann es einpflegen, weiss an der Stelle aber nicht wie 
das gehen sollte.

Nochmal genauer zu meinem Problem: Ich will ein IP-Core erstellen (siehe 
instanziierung.png) die an eine bestimmte Anzahl an Modulen angebunden 
werden kann. Wenn nur ein Modul daran angeschlossen wird, soll nur EN, 
DATA1, MR1, MR2, SR1, SW1 als Ports erscheinen. Cool wäre, wenn man das 
IP-Core direkt in Vivado durch einen Doppelklick konfigurieren könnte. 
Z.B. will man nun 2 Module ans IP-Core hängen, dann solle die 
Möglichkeit bestehen "2" auszuwählen und der IP-Core ändert bzw. ergänzt 
seine Ports zu
EN, DATA1, MR1, MR2, SR1, SW1,
DATA2, MR2, MW2, SR2, SW2.

EN sollte bei allen gleich bleiben und alle Signale haben jeweils 32bit.
Angehängte Dateien:

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