2016-04-30 9 views
2

Ich habe einige Probleme mit der conv_std_logic_vector Funktion in Quartus. Ich verwende die Funktion, um eine Integer-Variable in eine std_logic_vector zu konvertieren. Wenn i den Code zu kompilieren, Quartus zeigt die folgende Fehlermeldung:VHDL: conv_std_logic_vector Parameter Fehler

Error (10344): Fehler VHDL-Expression bei counter_Wbits.vhd (32): expression hat 3 Elemente, sondern muss 4 Elemente hat.

Ich habe diese Funktion im Internet gesucht und die Leute benutzen immer 2 Parameter, was passiert?

LIBRARY IEEE; 
USE IEEE.std_logic_1164.ALL; 
USE IEEE.std_logic_unsigned.ALL; 
use IEEE.std_logic_arith.ALL; 

ENTITY counter_Wbits IS 
    GENERIC(W : NATURAL := 4); 
    PORT (portae : IN BIT;-- data input 
     portas : IN BIT;-- data input 
     clk : IN BIT; -- clock 
     clrn: IN BIT; -- clear 
     ena : IN BIT; -- enable 
     q : BUFFER STD_LOGIC_VECTOR(W-1 DOWNTO 0));-- data output 
END counter_Wbits; 

ARCHITECTURE arch_1 OF counter_Wbits IS 
BEGIN 
    PROCESS(clk,clrn) 
    variable cont : integer range 0 to 15; 
    BEGIN 
    IF (clrn='0') THEN 
     q <= (OTHERS => '0'); 
    ELSIF (clk'EVENT AND clk='1') THEN 
     IF (ena='1') THEN 
     IF(portae='1') THEN 
      cont := cont+1; 
     ELSIF (portas='1') THEN 
      cont := cont-1; 
     END IF; 
     END IF; 
    END IF; 
    q <= conv_std_logic_vector(cont, W-1); -- LINE 32 
    END PROCESS; 
END arch_1; 
+0

W = 4 also W-1 = 3. Sie können nicht passen (Bereich 0 bis 15) in 3 Bits, was genau die Fehlermeldung an erster Stelle ist. (Beachten Sie auch, wenn Sie diese Entity mit einem anderen Wert des Generics instanziieren, wird es gebrochen. Fix das auch) –

+0

Danke Mann, ich dachte, das war ein Parameterfehler! Es funktioniert jetzt! –

+1

Ich bin ständig überrascht von der Anzahl der Beispiele auf SO, die 'std_logic_arith' verwenden. 'Die numeric_std'-Bibliothek ist seit mehr als einem Jahrzehnt verfügbar, und unser interner Kodierungsstandard hat es seit 2002 benötigt. Jeder Synthesizer, der mir seit 2002 einfällt, hat ihn unterstützt. Wer unterrichtet dieses Zeug? – PlayDough

Antwort

2

Der letzte Parameter der Funktion conv_std_logic_vector definiert die Länge der zurückgegebenen std_logic_vector aus dieser Funktion. Wenn Sie hier W-1 angeben, fordern Sie an, dass die Funktion einen 3-Bit-Vektor zurückgibt. Aber das Zielsignal q hat 4 Bits, nummeriert von W-1 downto 0. Darüber beklagt sich die Fehlermeldung.

Sie können dies beheben, indem Sie nur W als letzten Parameter übergeben. Ein besserer Weg ist, auf denen die Länge des Zielsignals angeben statt q'length mit:

q <= conv_std_logic_vector(cont, q'length); 

Auf diese Weise wird die Funktion Ergebnis immer die richtige Länge hat.

Es ist kein Problem als solches, wenn der mögliche Bereich des ersten Arguments größer ist als das, was durch die Anzahl der Bits im zweiten Argument dargestellt werden kann. Natürlich wird Abschneiden auftreten.


Bitte verwenden Sie nicht, die Nicht-Standard-std_logic_arith und std_logic_unsigned Pakete von Synopsys mehr. Probleme werden auftreten, wenn Sie signierte und nicht signierte Nummern in derselben Entität später verwenden müssen. Verwenden Sie die Standard-ieee.numeric_std Paket statt:

LIBRARY IEEE; 
USE IEEE.std_logic_1164.ALL; 
use IEEE.numeric_std.all; -- CHANGED THIS 

ENTITY counter_Wbits IS 
    GENERIC(W : NATURAL := 4); 
    PORT (portae : IN BIT;-- data input 
     portas : IN BIT;-- data input 
     clk : IN BIT; -- clock 
     clrn: IN BIT; -- clear 
     ena : IN BIT; -- enable 
     q : BUFFER STD_LOGIC_VECTOR(W-1 DOWNTO 0));-- data output 
END counter_Wbits; 

ARCHITECTURE arch_1 OF counter_Wbits IS 
BEGIN 
    PROCESS(clk,clrn) 
    variable cont : integer range 0 to 31; 
    BEGIN 
    IF (clrn='0') THEN 
     q <= (OTHERS => '0'); 
    ELSIF (clk'EVENT AND clk='1') THEN 
     IF (ena='1') THEN 
     IF(portae='1') THEN 
      cont := cont+1; 
     ELSIF (portas='1') THEN 
      cont := cont-1; 
     END IF; 
     END IF; 
    END IF; 
    q <= std_logic_vector(to_unsigned(cont, q'length)); -- CHANGED THIS 
    END PROCESS; 
END arch_1; 

Die Umwandlung integer-std_logic_vector erfordert nun zwei Schritte. Zuerst müssen Sie es in einen unsigned der Länge q'length wie im zweiten Argument von to_unsigned angegeben konvertieren. Ein unsigned ist auch ein Vektor von std_logic Elemente, aber die jeweiligen Funktionen bedroht diese "Bitsequenz" als vorzeichenlose Zahl. Der zweite (äußere) Schritt ist eine Typumwandlung zu std_logic_vector.