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?
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) ));
andrsmlr
... + unsigned( abus(i downto i) )
. Ich habe dies nicht mit meinem Synthesetool überprüft, aber es ist möglich, dassabus(i)
ein Wert vom Typ zurückgegeben wirdstd_logic
und nichtstd_logic_vector
. Es ist jedoch seltsam, dass der Code ohne Typumwandlung gut synthetisiert wird ...nurabha