web-dev-qa-db-fra.com

Comment convertir 8 bits en 16 bits en VHDL?

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.

13
Panpetch Pinrao

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));
28
Morten Zilmer
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;
6
Philippe

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.

2
Martin Thompson

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;
1
Guest