Forum: FPGA, VHDL & Co. VHDL Instanziierung


von Thomas D. (Gast)


Angehängte Dateien:

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;

: Bearbeitet durch Moderator
von Vancouver (Gast)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Thomas D. schrieb:
> Bin über jeden Ratschlag dankbar.
Dann gleich den ersten: bitte Formatierung verwenden.

Thomas D. schrieb:
> MR: in std_logic
Da passen doch die Datentypen und Vektorbreiten nicht so richtig zum 
Bild...

von Thomas D. (Gast)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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...

von Thomas W. (donka)


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
...

von Thomas D. (Gast)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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...

von Thomas D. (Gast)


Angehängte Dateien:

Lesenswert?

@Thomas W. anbei der VHDL Code. Wahrscheinlich platziere ich es nur 
falsch.

Danke für die Hilfe!

von Thomas W. (donka)


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.

von Vancouver (Gast)


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
...

von Thomas D. (Gast)


Lesenswert?

Ich danke Euch für eure Hilfen. Ich werde erst die nächsten Tage 
ausprobieren und werde mich bei Erfolg/Misserfolg melden :)

danke!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Thomas D. schrieb:
> anbei der VHDL Code
Belasse die Dateiendung doch einfach bei *.vhd oder *.vhdl. Dann gibts 
Syntaxhighlighting gratis...

von Thomas D. (Gast)


Angehängte Dateien:

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

: Bearbeitet durch Admin
von Thomas D. (Gast)


Lesenswert?

Jetzt hab ichs glaube ich, ich werde nachher mal die Lösung hochladen!
Wenn es denn die Lösung ist :)

von Thomas D. (Gast)


Angehängte Dateien:

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.

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.