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

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top