2016-08-09 15 views
0

Ich denke, dass dieser Fehler ein Ergebnis von GHDL nicht unterstützt VHDL 2008 ist. Der Fehler tritt in Zeile 27/28, wenn ff0 D ist der Wert von Vektor DIN zugeordnet . Was ist der richtige Weg, um den Vektor innerhalb einer Portmap zu indizieren?muss tatsächlich ein statischer Name sein - Indexierungsvektor in Portmap

Ich habe count_temp erstellt, um den Fehler zu umgehen, aber es hat nicht geholfen, und ich würde lieber nicht die zusätzliche Variable haben. Vielen Dank.

library ieee; 
    use ieee.std_logic_1164.all; 
    use ieee.numeric_std.all; 

entity conv_encoder is 
    generic (d_width : positive := 16); 
    port (
     clk : in std_logic; 
     din : in std_logic_vector(d_width-1 downto 0); 
     ff_set : in std_logic; 
     count : in std_logic_vector(5 downto 0); 
     dout : out std_logic_vector(d_width*2-1 downto 0)); 
end conv_encoder; 

architecture behavioral of conv_encoder is 
    component d_ff is 
    port (clk, ff_set, D : in std_logic; 
      Q : out std_logic); 
    end component; 
    signal a, b  : std_logic; 
    signal count_temp : integer range 0 to d_width; 
    begin 
    count_temp <= to_integer(unsigned(count)); 
    ff0 : d_ff 
     port map (clk => clk, 
       ff_set => ff_set, 
       D  => din(count_temp), 
       -- D  => din(to_integer(unsigned(count))), 
       Q  => a); 
    ff1 : d_ff 
     port map (clk => clk, 
       ff_set => ff_set, 
       D  => a, 
       Q  => b); 
    -- conv encoder is r=1/2 A=111 B=101 
    process (clk, ff_set) 
    begin 
    if (ff_set = '0') then 
     if (rising_edge(clk)) then 
     dout(count_temp*2) <= din(count_temp) xor a xor b; 
     dout(count_temp*2+1) <= din(count_temp) xor b; 
     end if; 
    end if; 
    end process; 
end behavioral; 

Fehler:

ghdl -a conv_encoder.vhd 
conv_encoder.vhd:28:30: actual must be a static name 
ghdl: compilation error 
+0

'ghdl -a --std = 08 myfile.vhd' (und die gleiche Flagge zur Ausarbeitung liefern). Aktuelle ghdl-Releases (ab 0.33) unterstützen ziemlich viele (nicht alle) von VHDL-2008. Aber das ist nicht dein Problem, wie Jeff hervorhebt. –

+0

IEEE Std 1076-2008 6.5.5.3 para 6 * Wenn der tatsächliche Teil eines gegebenen Assoziationselements für einen formalen Port eines Blocks das reservierte Wort inertial gefolgt von einem Ausdruck ist oder ein Ausdruck, der nicht global statisch ist, dann Das angegebene Assoziationselement entspricht der Assoziation des Ports mit einem anonymen Signal, das im deklarativen Bereich implizit deklariert wird und den Block unmittelbar umschließt. Das Signal hat den gleichen Subtyp wie der formale Port und ist das Ziel einer impliziten konkurrierenden Signalzuweisungsanweisung des Formulars anonymous <= E ... * ghdl unterstützt dies (noch) nicht. – user1155120

+0

ghdl-updates [RoadMap2008] (https://sourceforge.net/p/ghdl-updates/wiki/RoadMap2008/) VHDL 2008 neue Funktionen, 6. Deklarationen, ⸰ anonymes Signal in Port-Klausel. (Und das wird nicht als \ [Done \] angezeigt). – user1155120

Antwort

1

Dies ist kein VHD2008 Support-Problem in GHDL. Ihre zwei Versuche, dies zu lösen, sind konzeptionell einfach genug, aber wie der Fehler sagt, können Sie einen Port nicht mit etwas verbinden, das nicht statisch ist. Was dies in einfachem Englisch bedeutet, ist, dass Sie einen Port keiner kombinatorischen Logik zuordnen können. Selbst D => not din(0) wäre nicht erlaubt.

Was ich hier tun würde wäre, einen Multiplexer einzuschließen. Dies kann so einfach sein wie:

signal selected_din : std_logic; 

...

selected_din <= din(count_temp); 

Sie dann die Linie D => din(count_temp), mit D => selected_din, ersetzen würde.


Man könnte alternativ eine mux Funktion schreiben und Ihre Zeile sieht dann wie D => mux(din, count_temp),. Die Funktion würde ein Element in din basierend auf dem Wert count_temp zurückgeben.

Laut dem Kommentar von @ user1155120 wird diese "function" -Methode von Ihrem GHDL-Compiler zum Zeitpunkt des Schreibens nicht unterstützt.

+0

Danke für die Erklärung. – gutelfuldead

+0

@minersrevolt Kein Problem. Wenn die Antwort Ihr Problem löst, klicken Sie normalerweise auf das Häkchen links neben der Antwort, um es als korrekt zu markieren. –

+0

@ user1155120 Warum gilt das für dieses Szenario, wenn * formal von einem nicht eingeschränkten oder teilweise eingeschränkten zusammengesetzten Typ ist * scheint nicht auf dieses Szenario zu gelten, wo das formale einfach 'std_logic' ist? Sollte ich meine Antwort bearbeiten, um zu sagen, dass die "Funktion" -Methode in GHDL nicht funktioniert, ist das Ihr Punkt? –