¿Por qué no puedo conectar una señal std_logic_vector a un puerto de tipo firmado o sin firmar?

0

El numeric_std.vhdl dice esto:

  type UNSIGNED is array (NATURAL range <>) of STD_LOGIC;
  type SIGNED is array (NATURAL range <>) of STD_LOGIC;

¿Esto significa que los no firmados y firmados tienen std_logic como sus subtipos?

¿Por qué entonces es que cuando tengo una entidad con un puerto de tipo firmado o sin firmar y conecto un std_logic_vector (3 downto 0) a él, obtengo un error?

por ejemplo

component dummy is
port(
    a: in std_logic_vector(3 downto 0);
    b: in signed(3 downto 0);
    c: in unsigned(3 downto 0);
    d: out std_logic
);
end component;

Si transfiero un puerto de std_logic_vector a b o c obtengo errores:

Signal "b" is type ieee.std_logic_1164.STD_LOGIC_VECTOR; expecting type ieee.NUMERIC_STD.SIGNED.

¿Por qué?

    
pregunta quantum231

1 respuesta

3

Aunque en su ejemplo, unsigned y signed son matrices del mismo tipo de elemento std_logic , esto no es lo mismo que un subtipo. Un subtipo es cuando un tipo es un subconjunto limitado de otro tipo, por ejemplo:

subtype my_type is std_logic_vector(3 downto 0);
subtype eight_bit_int is integer range 0 to 255;

Una característica de un subtipo es que se puede convertir automáticamente desde y hacia el tipo principal, por lo que puedo hacer:

signal a : std_logic_vector(3 downto 0);
signal b : my_type;
signal c : integer;
signal d : eight_bit_int_type;

...

-- These should both work fine
b <= a;
c <= d;

Si desea conectar diferentes tipos en un mapa de puertos, es posible que tenga que usar conversiones de tipo o conversiones de tipo, o ambas. Usando tu entidad de ejemplo, podrías escribir algo como esto:

signal a_actual : std_logic_vector(3 downto 0);
signal b_actual : std_logic_vector(3 downto 0);
signal c_actual : std_logic_vector(3 downto 0);
signal d_actual : std_logic;

...

-- Converting from std_logic_vector to signed or unsigned only requires a cast 
dummy_inst : dummy
port map(
    a => a_actual,
    b => std_logic_vector(b_actual),
    c => std_logic_vector(c_actual),
    d => actual
);

Si quisiera conectar una entrada, por ejemplo, b a un entero, tendría que usar una conversión de tipo y una conversión, y la línea se vería así:

b => std_logic_vector(to_signed(b_integer, 4)), -- 4 is the length of the port
    
respondido por el scary_jeff

Lea otras preguntas en las etiquetas