std_logic_vector in vorzeichenlose Konvertierung, die einen inkompatiblen Fehler auslöst

Unten ist ein VHDL-Code eines Generators für gerade/ungerade Parität für einen Bus mit einer bestimmten Breite.

library ieee;
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all;
use ieee.math_real.all;

entity paritygen is
    generic( WIDTH : positive := 8 );                          -- Bus width
    port   ( abus  : in std_logic_vector( WIDTH-1 downto 0 ); -- n-bit Bus
             even  : out std_logic;                           -- Even parity bit
             odd   : out std_logic );                         -- Odd parity bit 
end paritygen;

architecture behavioral of paritygen is
begin    
    process( abus )
        variable sum  : unsigned( natural( ceil( log2( real( WIDTH + 1 ) ) ) ) - 1 downto 0 );
        variable remdr: unsigned( natural( ceil( log2( real( WIDTH + 1 ) ) ) ) - 1 downto 0 );
    begin
        sum   := (others => '0');
        remdr := (others => '0'); 

        for i in abus'range loop
           sum := sum + unsigned( abus(i) );
        end loop;

        remdr := sum MOD 2;

        if ( remdr = 0 ) then
            even <= '1';
        else
            even <= '0';
        end if;
        odd  <= not even;
    end process;    
end behavioral;

Wenn ich den Code in Synopsys Synplify Pro kompiliere, erhalte ich eine Fehlermeldung in der folgenden Zeile:

sum := sum + unsigned( abus(i) );
error: @CD715: Cast of incompatible types

In dieser Zeile berechne ich eine laufende Summe (vom vorzeichenlosen Typ) aller Bitleitungen des Busses. Da der Bus vom Typ std_logic_vector ist, wandele ich ihn in einen vorzeichenlosen Typ um, bevor ich den Add-Operator verwende, um die Summe zu berechnen.

Der Fehler verschwindet, wenn ich das explizite Casting entferne. Ich bin verwirrt darüber, warum dies ein inkompatibles Casting ist, da std_logic_vector meines Wissens explizit mit dem Schlüsselwort unsigned in einen unsigned-Typ gecastet werden sollte. Kann mir jemand sagen, was in meinem VHDL-Code falsch ist?

hast du es mal mit versucht ... + unsigned( abus(i downto i) ). Ich habe dies nicht mit meinem Synthesetool überprüft, aber es ist möglich, dass abus(i)ein Wert vom Typ zurückgegeben wird std_logicund nicht std_logic_vector. Es ist jedoch seltsam, dass der Code ohne Typumwandlung gut synthetisiert wird ...
@damage: Ich glaube auch, dass das Problem beim Rückgabewert von abus(i) vom Typ std_logic liegt. Ich werde es mit der von dir genannten Syntax versuchen. Danke

Antworten (2)

Problem hierbei ist, dass abus(i) vom Typ std_logic und kein Vektor ist. Das Einfügen einer '0' hilft beim Erstellen eines Vektors, der in unsigned umgewandelt werden kann:

sum := sum + unsigned( '0' & abus(i) );

Hier ist ein hilfreicher numeric_std Spickzettel: http://www.lothar-miller.de/s9y/categories/16-Numeric_Std

Ich bin mir auf Anhieb nicht sicher, aber müssen Sie nicht to_integer() herumwerfen? Z.B,

sum := sum + to_integer(unsigned( abus(i) ));