std_logic_vector a conversión no firmada al lanzar un error incompatible

2

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?

    
pregunta nurabha

2 respuestas

1

El problema aquí es que abus (i) es de tipo std_logic y no vector. Insertar un '0' ayuda a crear un vector que se puede convertir a unsigned:

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

Aquí hay una hoja de trucos numeric_std útil: enlace

    
respondido por el Marc
0

No estoy seguro de la parte superior de mi cabeza, ¿pero no necesitas lanzar a_integer () alrededor? Por ejemplo,

sum := sum + to_integer(unsigned( abus(i) ));
    
respondido por el JustJeff

Lea otras preguntas en las etiquetas