Question

Qu'est-ce qui se passe ici? Pourquoi est-ce que je reçois un « incompatibilité de type argument de l'opérateur », et que puis-je faire pour y remédier?

--
-- 32-bit counter with enable and async reset
--
architecture synthesis1 of counter_32bit is    
signal nextvalue : std_logic_vector ( 31 downto 0 );    
begin

  --
  -- combo
  --
  nextvalue <= value + 1; -- here

  --
  -- sequential
  --
  ff:process( clk, rst )
  begin

    if( rst = '1' ) then
      value <= 0; -- and here...
    elsif( clk'event and ( clk ='1' ) ) then
      if( ena = '1' ) then
         value <= nextvalue;
      end if;
    end if;

  end process ff;    

end synthesis1;

Merci

Était-ce utile?

La solution

vous ne pouvez pas augmenter std_logic directement, vous devez le convertir en et le résultat unsigned retour à l'aide du package std_logic_vector numeric_std.

use ieee.numeric_std.all
...
nextvalue <= std_logic_vector( unsigned(value) + 1 );

Voir Comment ne pas effectuer std_logic_vector addition à l'aide IEEE.NUMERIC_STD par exemple.

Autres conseils

Essayez ce code:

use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
...
nextvalue <= value + "1";

Dans mon cas, cette solution est fonctionne!

Une autre façon est de surcharger le « + » dans ce cas, vous pouvez écrire:

function "+" ( a : std_logic_vector; b : integer ) return std_logic_vector is
    variable result : unsigned(a'range);
begin
    result := unsigned( a ) + 1 ;
    return std_logic_vector( result ) ;
end function ;

créer un package et inclure cette fonction dans ce paquet et cela fera l'affaire. Une chose faire inclure le paquet de numeric_std ieee car il contient les fonctions de conversion.

En plus de ce que les réponses déjà fournies, vous pouvez réécrire le code, définissant comme ayant nextvalue type de données unsigned (ci-dessous). Notez l'utilisation de pour effacer le nextvalue <= to_unsigned(0, 32); contre, et l'utilisation de pour déclencher rising_edge(clk) d'un front montant.

-- 32-bit counter with enable and async reset
architecture synthesis1 of counter_32bit is    
    signal nextvalue : unsigned ( 31 downto 0 );    
begin

    ff:process( clk, rst )
    begin

        if( rst = '1' ) then
            nextvalue <= to_unsigned(0, 32); -- reset the count
        elsif rising_edge(clk) then
            if( ena = '1' ) then
                nextvalue <= nextvalue + 1;  -- increment the count
            end if;
        end if;

    end process ff;

    -- Concurrent assignment statement
    value <= std_logic_vector(nextvalue);

end synthesis1;

Cette forme d'affectation concurrente semble être la méthode préférée de mise à jour un compteur de ce que j'ai trouvé dans les livres et en ligne.

En outre, si vous continuez à utiliser le type pour std_logic_vector nextvalue <= (others => '0');, la méthode préférée pour la compensation, il semble être plutôt que nextvalue <= 0; <=>.

En un mot, std_logic_vector est juste que, un vecteur de bits. Cela ne signifie rien par lui-même de sorte que vous ne pouvez pas attendre VHDL à assumer sémantiquement qu'une opération d'augmentation va travailler. Les autres postes ici sur la conversion à un non signé devrait faire l'affaire.

Cela permettra également de travailler:

nextvalue <= value + '1'; 

Ne pas savoir si vous êtes vraiment bien versé en VHDL. La syntaxe suivante ist logicaly correcte si vous utilisez paquet std_logic_arith

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top