2017-12-05 4 views
0

Ich möchte binäre std_logic_vector von Integer innerhalb der generieren.VHDL: Wie konvertiert man einen Iterator von generate block in std_logic_vector?

Zum Beispiel

0 -> 0000

1 -> 0001

2 -> 0010

...

15 -> 1111

Ich könnte 16 if-else-Anweisungen für jede ganze Zahl schreiben, aber ich mag diese Idee nicht. (Was passiert, wenn ich werde viel mehr als 16 Integer-Zahlen?)

Ich habe versucht, zwei Methoden zu verwenden, aber keiner von ihnen arbeitet: Adresse und Hit sind beide std_logic_vector

G_1 : for i in 0 to 15 generate 
    address <= conv_std_logic_vector(i, 4) when hit(i) = '1'; 
end generate G_1; 

G_2 : for i in 0 to 15 generate 
    address <= std_logic_vector(to_unsigned(i, 4)) when hit(i) = '1'; 
end generate G_2; 

Auch bemerkte ich, dass, wenn ich Nummer anstelle von i verwende, es funktioniert. (Beispiel: Ich bekomme "0101", wenn ich conv_std_logic_vector (5, 4) verwende)

Was mache ich falsch? Gibt es eine Möglichkeit, es mit vhdl zu tun?

Antwort

2

Für einen Anfang, nicht use ieee.std_logic_arith.all. Stattdessen, use ieee.numeric_std.all, und loswerden jede böse conv_integer Funktionen; Der bevorzugte Stil besteht darin, Typen wie unsigned zu verwenden und diese dann wie in Ihrem zweiten Codebeispiel zu konvertieren oder zu konvertieren.

Umzug in der Schleife auf, die Sie verwenden generate Schleife:

G_1 : for i in 0 to 15 generate 
    address <= conv_std_logic_vector(i, 4) when hit(i) = '1'; 
end generate G_1; 

Diese 16 Zeilen der Form erzeugen:

address <= conv_std_logic_vector(0, 4) when hit(0) = '1'; 
address <= conv_std_logic_vector(1, 4) when hit(1) = '1'; 
address <= conv_std_logic_vector(2, 4) when hit(2) = '1'; 

usw. Da jede gleichzeitige Zuordnung seinen eigenen Prozess folgert, Ihr Entwurf wird mehrere Treiber für das Signal address haben, was in einem Synthese-fähigen Design nicht erlaubt ist.

Es scheint, als ob das Ziel ist, address nach dem niedrigsten Satz ('1') Bit in der hit Vektor. Dies wird als Prioritätscodierer bezeichnet. So etwas wie dies wäre besser:

process (hit) 
begin 
    for i in 0 to 15 loop 
    address <= (others => '0'); -- Default assignment, any later assignment takes priority 
    if (hit(i) = '1') then 
     address <= std_logic_vector(to_unsigned(i, address`length)); 
     exit; 
    end if; 
    end loop; 
end process; 

Da address scheint eine nicht signierte Zahl darzustellen, Sie Typen unsigned für dieses Signal verwenden könnten, und eine Art Guss speichern.

+0

Vielen Dank! Es funktioniert ziemlich gut) –

+0

Und wenn Sie VHDL 2008 oder später verwenden, können Sie sogar 'u_unsigned' (nicht aufgelöst) anstelle von' unsigned' (aufgelöst) verwenden. Auf diese Weise erhalten Sie in mehreren Laufwerkssituationen einen Fehler. –

Verwandte Themen