2013-07-03 6 views

Antwort

19

Wenn der 8-Bit-Wert interpretiert wird, als (2-Komplement) unterzeichnete, dann ist die allgemeinen und Standard VHDL-Umwandlungsverfahren sind die IEEE numeric_std Bibliothek zu verwenden:

library ieee; 
use ieee.numeric_std.all; 

architecture sim of tb is 
    signal slv_8 : std_logic_vector(8 - 1 downto 0); 
    signal slv_16 : std_logic_vector(16 - 1 downto 0); 
begin 
    slv_16 <= std_logic_vector(resize(signed(slv_8), slv_16'length)); 
end architecture; 

So wird zuerst der std_logic_vector umgewandelt Bei einem vorzeichenbehafteten Wert wird die Größenänderung angewendet, wodurch der vorzeichenbehaftete Wert erweitert wird. Das Ergebnis wird schließlich zurück in std_logic_vector konvertiert.

Die Konvertierung ist ziemlich lang, hat aber den Vorteil, dass sie allgemein ist und auch dann funktioniert, wenn die Ziellänge später geändert wird.

Das Attribut ‚Länge gibt einfach die Länge des slv_16 std_logic_vector, also 16.

Für unsigned Darstellung anstelle von signierten, kann es statt signed, also mit diesem Code unsigned erfolgen:

slv_16 <= std_logic_vector(resize(unsigned(slv_8), slv_16'length)); 
+0

Ich habe versucht, die Größe von 16 auf 8 Bits wie folgt zu ändern: resized_var1: = std_logic_vector (resize (unsigned (Kp) * unsigned (integration1)), 8); Ich erhielt einen Fehler wie: "Typkonvertierung (zu std_logic_vector) kann keinen Aggregatoperanden haben." Warum funktioniert es nicht? –

+0

Da die, 8 sollte innerhalb der Parens für resize() und nicht std_logic_vector() sein. –

4
architecture RTL of test is 
    signal s8: std_logic_vector(7 downto 0); 
    signal s16: std_logic_vector(15 downto 0); 
begin 
    s16 <= X"00" & s8; 
end; 
+0

Was ist ‚X‘ in Zeile 5 bedeuten? –

+2

Das 'x' steht für "hexadezimal". So ist x "00" im Grunde "00000000" binär. – Passepartout

+0

Wenn ich "11111111" in "1111111111111111" umwandeln möchte: –

2

der Vollständigkeit halber noch eine weitere Möglichkeit, die gelegentlich nützlich ist:

-- Clear all the slv_16 bits first and then copy in the bits you need. 
process (slv_8) 
begin 
    slv_16 <= (others => '0'); 
    slv_16(7 downto 0) <= slv_8; 
end process; 

habe ich nicht Ich musste dies für Vektoren tun, an die ich mich erinnern kann, aber ich hatte das unter komplexeren Umständen nötig: Das Kopieren von nur ein paar relevanten Signalen in eine größere, komplexere Aufzeichnung war einmal.

+1

Und Zeichenerweiterung ist mit der ersten assign als 'slv_16 <= (others => slv_8 (7));' –

+0

Das ist funktional korrekt, aber ich würde argumentieren, wenn Sie Zeichen-Erweiterung wollen, sollten Sie richtige numerische Typen verwenden (dh ' signiert ") und benutze dann die' resize' Funktion - wie du es in deiner Antwort vorgeschlagen hast :) –

1

Diese übernimmt die Umwandlung ohne die Breiten der Nullen, wenn entweder std_logic_vector Änderungen zu bearbeiten:

architecture RTL of test is 
    signal s8: std_logic_vector(7 downto 0); 
    signal s16: std_logic_vector(15 downto 0) := (others => '0'); 
begin 
    s16(s8'range) <= s8; 
end;