Forum: FPGA, VHDL & Co. componet mit port varialbler breite


von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Ich will eine Component schreiben, die unterschiedliche Datenbreite auf 
einen Port haben soll. Da muss ich nicht die Kompenenten für jede 
Pinanzahl einzeln warten.


Ich hatte das mir wie folgt vorgestellt.


in generic will ich die Daten Breite angeben.
1
entity general_IO_16 is
2
  generic(
3
    breite : integer
4
5
    );
6
7
  port(
8
       .....
9
       --Hardwarepins 
10
       OUTPUTS  : out std_logic_vector( platzhalter)
11
       );
12
end;

von Duke Scarring (Gast)


Lesenswert?

Und worin liegt jetzt das Problem?!?

Ich würde es so schreiben:
1
entity general_IO_16 is
2
  generic
3
  (
4
    width : natural
5
  );
6
  port
7
  (
8
    ...
9
    --Hardwarepins
10
    OUTPUTS : out std_logic_vector( width-1 downto 0)
11
  );
12
end entity general_IO_16;

Wenn es komplexer wird, sollte man eine Typdefinition draus machen und 
in ein package auslagern.

Duke

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Das geht mit Vivado.
Ich hatte in Erinnerung, dass ich das schon mal vor längerer Zeit 
ausprobiert hatte. Und irgendwas hatte gemeckert. Ich glaube die breite 
des Vectors ist nicht definiert in der Componente.

Für solche Irrtümer ist zu Glück das Forum da.

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Ich dachte ich muss den Vector wie folgt definieren.
1
    OUTPUTS : out std_logic_vector( natural range <>);

wann wird diese Form überhaupt gebraucht?

von Duke Scarring (Gast)


Lesenswert?

René D. schrieb:
> wann wird diese Form überhaupt gebraucht?
Wenn der Breich (range) erst später festgelegt wird.
M.E. ist das eher bei Typdefinitionen sinnvoll:
1
type my_array_t is array( natural range <>) of signed( 15 downto 0);
2
...
3
signal measurement_values : my_array_t( 0 to 3);
4
...
Bei Portbeschreibungen habe ich es noch nicht verwendet.

Duke

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


Lesenswert?

René D. schrieb:
> wann wird diese Form überhaupt gebraucht?
Ganz am Anfang der numeric_std... ;-)

Bei Funktionen/Prozeduren ist sowas recht geschickt, weil dann die 
Wortbreite nicht explizit festgelegt sein muss. In der Funktion wird 
dann mit den entsprechenden Attributen auf dem Vektor gearbeitet. Hier 
z.B. die to_integer Funktion aus der numeric_std:
1
function TO_INTEGER(ARG: UNSIGNED) return NATURAL is
2
constant ARG_LEFT:INTEGER:= ARG'length-1;
3
alias XXARG:UNSIGNED(ARG_LEFT downto 0) is ARG;
4
variable XARG:UNSIGNED(ARG_LEFT downto 0); 
5
variable RESULT: NATURAL:= 0;
6
variable w : INTEGER:= 1;  -- weight factor
7
begin
8
  if (ARG'length<1) then
9
    assert NO_WARNING
10
    report "numeric_std.TO_INTEGER: null arg"
11
    severity warning;
12
    return 0;
13
  end if;
14
  XARG:= TO_01(XXARG);
15
  if (XARG(XARG'left)='X') then
16
    assert NO_WARNING
17
    report "numeric_std.TO_INTEGER: metavalue arg set to 0"
18
    severity warning;
19
    return 0;
20
  end if;
21
  for i in XARG'reverse_range loop
22
    if XARG (i) = '1' then  RESULT:= RESULT + w;
23
    end if;
24
    if (i /= XARG'left) then w := w + w;
25
    end if;
26
  end loop;
27
  return RESULT;
28
end TO_INTEGER;

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Duke Scarring schrieb:
> René D. schrieb:
>> wann wird diese Form überhaupt gebraucht?
> Wenn der Breich (range) erst später festgelegt wird.
> M.E. ist das eher bei Typdefinitionen sinnvoll:
>
1
> type my_array_t is array( natural range <>) of signed( 15 downto 0);
2
> ...
3
> signal measurement_values : my_array_t( 0 to 3);
4
> ...
5
>
> Bei Portbeschreibungen habe ich es noch nicht verwendet.
>
> Duke


Wenn dann wäre es nicht als Typ interessant sondern als signal bzw. 
Portbeschreibung,

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.