Ich habe ein Problem mit folgendem Code. In einer Hauptentity (ent) wird
eine variable Anzahl (number) einer component (com) instanziiert, jede
Instanz (inst) bekommt dabei einen generic (options) mit Optionen
übergeben. Soweit kein Problem - ich wollte nun folgende, mir elegant
erscheinende, Lösung verwenden:
1 | entity ent is
|
2 | generic(
|
3 | number : integer range 1 to 31 := 2;
|
4 | main_options: std_logic_vector(number*4-1 downto 0) := x"48"
|
5 | );
|
6 |
|
7 | [...]
|
8 |
|
9 | component com is
|
10 | generic(
|
11 | options: std_logic_vector(3 downto 0);
|
12 |
|
13 | [...]
|
14 |
|
15 | gen: for i in 0 to number-1 generate
|
16 | inst : com
|
17 | generic map(
|
18 | options => main_options(i*4+3 downto i*4),
|
19 |
|
20 | [...]
|
Die Xilinxtools fuse und isim (Ise 8.1) erzeugen bei der Simulation
jedoch unterschiedliche Fehler, options erhält z.B. den Wert "uuu0" oder
auch ein error, 41 wäre kein gültiger Wert für einen std_logic(!). Das
ganze riecht für mich verdächtig nach einem internen Buffer-Overflow.
Das Problem tritt auf, sobald ich in der Zuweisung von options eine wie
auch immer geartete range verwende.
Nehme ich allerdings statt dem std_logic_vector einen integer und hole
mir die jeweils gebrauchten Werte mit arithmetischen Mitteln
(main_options /16**i mod 16), so funktioniert es einwandfrei für bis zu
8 components, danach reicht natürlich die Größe des integers nicht mehr
aus.
Kann jemand dieses Problem bestätigen oder hat eine Idee, wie man das
sonst elegant und benutzerfreundlich zuweisen könnte?