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 | );
|