Pourquoi ne puis-je augmenter ce `std_logic_vector`
-
21-08-2019 - |
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
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