Forum: FPGA, VHDL & Co. GENERIC: lieber natural oder std_logic_vector(log2(range)-1 downto 0)


von Dave W. (davewebb8211)


Lesenswert?

Hallo,

ich schreibe gerade einige Module, die ich generisch halten und mit 
GENERIC parametrisieren möchte.
Mein Frage bezieht sich darauf, ob ich Signale mit veränderlichem 
Wertebereich lieber als
* Natural oder als
* std_logic_vector machen soll und sich um die Länge des Vektors von 
Hand mit log2 o.Ä. selbst kümmern soll.

Bei Natural kann man den Wertebereich ja genau angeben. Aber irgendwann 
ergibt es sich dann doch, dass ich es in ein std_logic_vector umwandeln 
muss, weil ich z.B. ein RAM ansteuern muss (und die 
herstellerspezifischen Komponenten nunmal std_logic_vector erwarten).

Ist es also sinnvoll
* ein Signal als natural zu implementieren und eine Umwandlung auf ein 
std_logic_vector(log2(range)-1 downto 0) ganz spät zu machen, oder 
direkt von Anfang an
* einen std_logic_vector(width-1 downto 0) zu nehmen und jeweils width 
per generic map weiter zu geben.

Auch wenn es keinen Königsweg gibt würde ich mich über eine 
Stilempfehlung freuen.

Danke und schöene Grüße

Dave

--

Also: hier mal als Beispiel:
1
entity e is
2
  generic (
3
    chars_max  : natural
4
  )
5
  port (
6
    char : IN natural range 0 to chars_max
7
  )
8
end e;

dann im ARCHITECTURE aber etwas umgewandle im Stil von
1
variable char_i : integer;
2
char_i <= char;
3
address_i <= std_logic_vector(to_unsigned(char_i, address_i'length));

ODER
1
entity e is
2
  generic  (
3
    chars_width : natural  
4
  )
5
  port (
6
    char : IN STD_LOGIC_VECTOR (chars_width-1 DOWNTO 0)
7
  );
8
end e;
9
10
E_INST: e
11
  generic map (
12
    chars_max   => ld2(chars_max-1)
13
  )
14
  port map (
15
    char     => char
16
  );

von Rick Dangerus (Gast)


Lesenswert?

Das hängt u.a. von Deinem Umfeld und Deiner "Fachrichtung" ab. 
Hardwerker werden die Bitbreite bevorzugen und Softwerker den 
Wertebereich. Wenn Du mit anderen zusammenarbeitest oder fremde IP 
verwenden willst, bist Du mit std_logic_vector auf der sicheren Seite.

Ich verwende gerne unsigned/signed aus numeric_std. Damit braucht man 
nur einen cast zu std_logic_vector oder zu integer/natural und man kann 
damit rechen.
Der Nachteil: es gibt Probleme, wenn Ports zusammengeschaltet werden 
sollen und die andere IP unsigned aus ieee.std_logic_unsigned (sollte 
besser synopsys_logic_unsigned heißen) verwendet.

Rick

von Dave W. (davewebb8211)


Lesenswert?

Danke Rick fuer Deine Meinung.
Gut zu hoeren, dass es keine all zu grossen Fallstricke zu geben 
scheint.

Ich werde mal innerhalb meiner Module bei natural bleiben, da die 
Beschreibung damit `strenger' und genauer definiert wird. Das gefaellt 
mir besser, auch wenn's akademischer ist.
Schnittstellen nach aussen werde ich dann evtl. std_logic_vector machen, 
damit andere den Kram leichter zusammentackern koennen.

Danke und schoene Gruesse

Dave

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.