2016-06-10 7 views
0

Ich habe eine einfache Zustandsmaschine in VHDL geschrieben. Die Größe jedes Vektors und jeder Variablen wird durch eine generische Konstante "n" bestimmt. Die Idee ist: Wenn ich "n" ändere, möchte ich sofort in der Lage sein zu synthetisieren. Teil des Designs ist ein Vektor in "1 of N" -Code.Generischer Vektor in VHDL, mit Position der Zuweisung, bestimmt durch Variable

Ports & Signale Definitionen:

tester: out std_logic_vector(n-1 downto 0); -- port 
signal I: integer range 0 to n-1:=0; -- signal 

Was ich habe:

process(I) 
begin 
    if I=0 then 
     tester<="0001"; 
     elsif I=1 then 
     tester<="0010"; 
     elsif I=2 then 
     tester<="0100"; 
     else 
     tester<="1000"; 
    end if; 
end process; 

Dies funktioniert natürlich nur für n = 4. Was ich will:

process(I) 
begin 
    tester<=(I=>'1', others=>'0'); 
end process; 

Diese Synthese nicht jedoch wegen „Wahl ist nicht konstant“ -Fehler. Ich werde durch einen der Zustände geändert und es kann in jedem Muster geändert werden, daher das Problem.

Antwort

2

Stattdessen können Sie tun:

process(I) 
begin 
    tester <= (others => '0'); 
    tester(I) <= '1'; 
end process; 
+0

funktioniert perfekt! Vielen Dank. Ich fühle mich irgendwie dumm, versuche das nicht früher auszuprobieren. Aus Neugier - warum funktioniert diese Syntax, und der andere "Tester <=(I=> '1', andere => '0');" nicht? – Palkah

+0

Index muss konstant sein, wahrscheinlich zur Vereinfachung; zum Beispiel, wie man behandelt, wenn man tut (a => '1', b => '0', ...) ', und a und b sind manchmal gleich; dann sollte Priorität definiert werden. Das Schreiben als sequentielle Anweisungen behandelt das Problem der Priorität unter Verwendung anders definierter Konstruktionen. –