mikrocontroller.net

Forum: FPGA, VHDL & Co. VHDL Instanziierung


Autor: Thomas D. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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ß
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;



entity top is
 
    Generic     (
                width : integer := 2
                );
 
    Port        ( 
                EN : in STD_LOGIC_VECTOR(width-1 downto 0);
                DATA : in STD_LOGIC_VECTOR(width-1 downto 0);
                MR : in STD_LOGIC_VECTOR(width-1 downto 0);
                MW : in STD_LOGIC_VECTOR(width-1 downto 0);
                SR : out STD_LOGIC_VECTOR(width-1 downto 0);
                SW : out STD_LOGIC_VECTOR(width-1 downto 0)
                );          
end top;


architecture STRUCTURE of top is

    component ADDREN_READ_WRITE is
    
    port        (   
                EN:                in std_logic;
                DATA:                in std_logic;
                MR:        in std_logic;
                MW:       in std_logic;
                SR:         out std_logic;
                SW:        out std_logic
                
                
                );
    end component ADDREN_READ_WRITE;


begin

GEN:
for i in width-1 downto 0 generate

    proc_rw: component ADDREN_READ_WRITE
    
    port map    (
                EN => EN(i), 
                DATA => DATA(i), 
                MR => MR(i),  
                MW => MW(i),
                SR => SR(i),
                SW => SW(i)
                );
end generate;

end STRUCTURE;


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity ADDREN_READ_WRITE is

    port        (   
                EN: in std_logic;
                DATA: in std_logic;
                MR: in std_logic;
                MW: in std_logic;
                SR: out std_logic;
                SW: out std_logic
                );
    end;
    
architecture behavior of ADDREN_READ_WRITE is
begin

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

end behavior;

: Bearbeitet durch Moderator
Autor: Vancouver (Gast)
Datum:

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

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



port      (
                EN : in STD_LOGIC_VECTOR(width-1 downto 0);
                DATA : in STD_LOGIC_VECTOR(width-1 downto 0);
                MR : in STD_LOGIC_MATRIX32(width-1 downto 0);
                MW : in STD_LOGIC_MATRIX32(width-1 downto 0);
....
Must aber mal nachlesen, wie man Signalarrays richtig deklariert und 
indiziert, ich habs nicht im Kopf.

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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...

Autor: Thomas D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Thomas W. (donka)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Entweder du benutzt Aliases
signal MR   : std_logic_vector(1023 downto 0);
alias MR1   : std_logic_vector(31 downto 0) is MR(31 downto 0); 
alias MR2   : std_logic_vector(31 downto 0) is MR(63 downto 32); 
...

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

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

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

optional falls es unbedingt MR1, MR2 ... usw. heißen muss:
alias MR1 is MR(1);
alias MR2 is MR(2);
...

Autor: Thomas D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Thomas D. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Thomas W. anbei der VHDL Code. Wahrscheinlich platziere ich es nur 
falsch.

Danke für die Hilfe!

Autor: Thomas W. (donka)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Vancouver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

package busreg_pkg is

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

end busreg_pkg;


....

use work.busreg_pkg.all;

...



Autor: Thomas D. (Gast)
Datum:

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

danke!

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Thomas D. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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
Autor: Thomas D. (Gast)
Datum:

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

Autor: Thomas D. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.