A continuación se muestra un código VHDL de un generador de paridad par / impar para un bus de ancho dado.
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;
Cuando compilo el código en Synopsys Synplify Pro, aparece un error en la siguiente línea:
sum := sum + unsigned( abus(i) );
error: @CD715: Cast of incompatible types
En esta línea, estoy calculando una suma corriente (de tipo sin signo) de todas las líneas de bits del bus. Como el bus es de tipo std_logic_vector, lo estoy convirtiendo en un tipo sin firma antes de usar el operador agregar para calcular la suma.
El error desaparece si elimino la conversión explícita. Estoy confundido en cuanto a por qué esto es una conversión incompatible porque, como sé, std_logic_vector se debe convertir explícitamente en un tipo sin signo utilizando una palabra clave sin signo. ¿Alguien puede decirme qué está mal en mi código vhdl?