Warum kann ich diesen `std_logic_vector` nicht erhöht
-
21-08-2019 - |
Frage
Was ist denn hier los? Warum erhalte ich einen ‚Operator Argument Typenkonflikt‘, und was kann ich tun, um das Problem beheben?
--
-- 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;
Danke
Lösung
Sie nicht std_logic direkt erhöhen können, müssen Sie es konvertieren unsigned
und das Ergebnis zurück std_logic_vector
Paket numeric_std
verwenden.
use ieee.numeric_std.all
...
nextvalue <= std_logic_vector( unsigned(value) + 1 );
Siehe So führen std_logic_vector Addition Mit IEEE.NUMERIC_STD zum Beispiel.
Andere Tipps
Versuchen Sie diesen Code ein:
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
...
nextvalue <= value + "1";
In meinem Fall ist diese Lösung funktioniert!
Eine weitere Möglichkeit ist die „+“ in diesem Fall zu überlasten können Sie schreiben:
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 ;
Erstellen Sie ein Paket und schließen Sie diese Funktion in diesem Paket, und dies wird den Trick. Eine weitere Sache tun, um das ieee numeric_std Paket enthalten, weil sie die Konvertierungsfunktionen enthalten.
Zusätzlich zu dem, was die Antworten bereits zur Verfügung gestellt, könnten Sie den Code neu schreiben, definieren nextvalue
als unsigned
Datentyp mit (unten). Beachten Sie die Verwendung von nextvalue <= to_unsigned(0, 32);
den Zähler zu löschen, und die Verwendung von rising_edge(clk)
einer steigenden Flanke auszulösen.
-- 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;
Diese Form der gleichzeitigen Zuordnung scheint von der bevorzugten Methode, um einen Zähler zu aktualisieren, was ich in Büchern gefunden und online.
Auch wenn Sie den std_logic_vector
Typen für nextvalue
, die bevorzugte Methode für das Clearing es weiterhin verwenden scheint eher zu sein nextvalue <= (others => '0');
als nur nextvalue <= 0;
.
Auf den Punkt gebracht, ist std_logic_vector nur, dass ein Vektor von Bits. Es bedeutet nichts von selbst, so dass Sie nicht vhdl erwarten können semantisch anzunehmen, dass ein Zuwachs Betrieb auf, es wird funktionieren. Die anderen Beiträge hier über sie zu einem unsigned Umwandlung sollte es tun.
Dies wird auch funktionieren:
nextvalue <= value + '1';
Sie wissen nicht, ob Sie wirklich gut in VHDL versiert sind. Die folgende Syntax ist logisch korrekt, wenn Sie std_logic_arith Paket verwenden