Forum: FPGA, VHDL & Co. Zuweisung abhängig von Generic


von Fred (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe mal wieder eine Tool-Frage, diesmal bekomme ich meinen Code mit 
dem Active HDL 3.5 nicht kompiliert. Nachfolgend habe ich den Code mal 
abstrahiert, um den Fehler zu reproduzieren.
Wenn ich die nachfolgenden Componente mit dem generic
gComponentIndex = 0 kompiliere, erhalte ich die Fehlermeldung
1
# ELAB2: Fatal Error: ELAB2_0013 MyComponent.vhd (22): Index -16 is out of range (15 downto 0) of "oVector".
gComponentIndex = 1 führt entsprechend zu
1
# ELAB2: Fatal Error: ELAB2_0013 MyComponent.vhd (22): Index -15 is out of range (15 downto 0) of "oVector"..
und gComponentIndex = 16 zu
1
# ELAB2: Fatal Error: ELAB2_0013 MyComponent.vhd (22): Index 16 is out of range (15 downto 0) of "oVector".
etc.

Schuld sind also die beiden Zuweisungen auf oVector.
Seltsamer Weise machen die Zuweisungen auf oBit keine Probleme, obwohl 
das Prinzip gleich ist, nur dass die der Index rechts von der Zuweisung 
berechnet wird.
Die Synthese kommt mit dem Code gut zurechet.
1
library IEEE;
2
 use IEEE.std_logic_1164.all;
3
 use ieee.numeric_std.all;
4
5
entity myComponent is
6
    generic (
7
        gComponentIndex : integer range 0 to 31
8
    );
9
    port
10
    (
11
        iSysRst : in  std_logic;
12
        iSysClk : in  std_logic;
13
        iBit    : in  std_logic;
14
        iVector : in  std_logic_vector( 15 downto 0);
15
        oBit    : out std_logic;
16
        oVector : out std_logic_vector( 15 downto 0)
17
    );
18
end myComponent;
19
20
architecture RTL of myComponent is
21
begin
22
    plMyProcess : process (iSysRst, iSysClk)
23
    begin
24
        if rising_edge(iSysClk) then
25
26
            if gComponentIndex < 16 then
27
                oVector(gComponentIndex) <= iBit;
28
            end if;
29
30
            if (gComponentIndex > 16) and (gComponentIndex < 32) then
31
                oVector(gComponentIndex - 16) <= iBit;
32
            end if;
33
34
            if gComponentIndex < 16 then
35
                oBit  <= iVector(gComponentIndex);
36
            end if;
37
38
            if gComponentIndex >= 16 and gComponentIndex < 32 then
39
                oBit  <= iVector(gComponentIndex - 16);
40
            end if;
41
...
Zum technischen Hintergrund:
Ich habe mehrere Componenten mit jeweils einem interne Adressdecoder. 
Dieser ist für alle gleich, soll aber abhängig vom Componenten Index nur 
auf bestimmte Adressen reagieren. Teilweise soll auch nur ein Bit des 
einen oder anderen Datenregisters gelesen oder gesetzt werden. Alle 
Ausgänge der Adressdecoder werden abschließend miteinander verodert.

Habt Ihr eine Idee, wie ich das Problem lösen kann, dass die Simulation 
es schluckt? Wie kann ich einzelne Zuweisungen in einem getakteten 
Prozess abhängig von einem Generic "ausklammern"?

von Fred (Gast)


Lesenswert?

Ich könnte natürlich einen Dummy Vector einfügen, der die Maximale Länge 
hat und dann später nur die unteren Bits nach aussen geben, aber so 
richtig schön kömmt mir das auch nicht vor und führt wohl zu weiteren 
Synthese Warnings... Aber immerhin besser, als auf die Simulation 
verzichten zu müssen.
1
architecture RTL of myComponent is
2
    signal sVector : std_logic_vector(31 downto 0);
3
begin
4
    oVector <= sVector(oVector'range);
5
    
6
    plMyProcess : process (iSysRst, iSysClk)
7
    begin
8
        if rising_edge(iSysClk) then
9
10
            if gComponentIndex < 16 then
11
                sVector(gComponentIndex) <= iBit;
12
            end if;
13
14
            if (gComponentIndex > 16) and (gComponentIndex < 32) then
15
                sVector(gComponentIndex - 16) <= iBit;
16
            end if;

von VHDL-Polizei (Gast)


Lesenswert?

Würden die nichtbenötigten Funktionen in den Fällen der Nichtverwendung 
durch andere Komponenten / Situationen nicht wegsynthetisiert und liefen 
ins Leere?

Ansonsten würde ich eine dynamische Maske anlegen.

von Fred (Gast)


Lesenswert?

Die "nicht benötigten" if clauses werden wegsynthetisiert, wie ich es 
mir wünsche. Lediglich die Simulation hat ein Problem damit.

Was meinst Du mit Dynamischer Maske?

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.