J'ai un signal d'entrée du convertisseur ADC qui est de 8 bits (std_logic_vector(7 downto 0)
). Je dois les convertir en un signal 16 bits (std_logic_vector(15 downto 0
)) pour le traitement du signal 16 bits vers le système 16 bits.
Si la valeur 8 bits est interprétée comme signée (complément à 2), la méthode de conversion VHDL générale et standard consiste à utiliser la bibliothèque IEEE numeric_std:
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;
Donc, d'abord, std_logic_vector est converti en valeur signée, puis le redimensionnement est appliqué, ce qui signifiera étendre la valeur signée, et le résultat est finalement reconverti en std_logic_vector.
La conversion est assez longue, mais présente l'avantage d'être générale et fonctionne même si la longueur cible est modifiée ultérieurement.
La longueur de l'attribut renvoie simplement la longueur du slv_16 std_logic_vector, donc 16.
Pour une représentation non signée au lieu de signée, cela peut être fait en utilisant unsigned
au lieu de signed
, donc avec ce code:
slv_16 <= std_logic_vector(resize(unsigned(slv_8), slv_16'length));
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;
Pour être complet, encore une autre façon qui est parfois utile:
-- 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;
Je n'ai pas eu à faire cela pour des vecteurs dont je me souviens, mais j'en ai eu besoin dans des circonstances plus complexes: copier seulement quelques signaux pertinents dans un enregistrement plus grand et plus complexe était une fois.
Cela gère la conversion sans avoir à modifier les largeurs des zéros si std_logic_vector change:
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;