0 definiciones de operador "*" coinciden aquí para el tipo firmado (numeric_std, VHDL)

2

Estoy escribiendo un paquete para agregar funciones y tipos de soporte para crear un filtro FIR. En la función mult , estoy tratando de multiplicar dos tipos firmados, que deberían ser compatibles en la biblioteca IEEE.numeric_std . El error que estoy recibiendo (usando el IDE de Libero) es:

0 definitions of operator "*" match here

Aquí está el código:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;

package fir_pkg is
    constant taps : integer := 8;
    constant bit_width : integer := 8;
    type fract is array(bit_width-1 downto 0) of std_logic;
    type fract2 is array((2*bit_width)-1 downto 0) of std_logic;
    type fract_sequence is array(taps-1 downto 0) of fract;
    type fract2_sequence is array(taps-1 downto 0) of fract2;
    function mult(a,b: fract_sequence) return fract2_sequence;
end package fir_pkg;

package body fir_pkg is

    function mult(a,b: fract_sequence) return fract2_sequence is
        variable a_s, b_s:signed(bit_width-1 downto 0);
        variable seq: fract2_sequence;
    begin
        for i in a'range loop
            a_s := signed(a(i));
            b_s := signed(b(i));
            seq(i) := a_s * b_s;
        end loop;
        return seq;
    end mult;

end fir_pkg;
    
pregunta Prabhpreet

3 respuestas

3

Muéstrame por qué no puedes crear los subtipos fract y fract2 de std_logic_vector:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;

package fir_pkg is
    constant taps : integer := 8;
    constant bit_width : integer := 8;

    subtype fract is std_logic_vector (bit_width-1 downto 0);
    -- type fract is array(bit_width-1 downto 0) of std_logic;
    -- type fract2 is array((2*bit_width)-1 downto 0) of std_logic;
    subtype fract2 is std_logic_vector(2*bit_width-1 downto 0);

    type fract_sequence is array(taps-1 downto 0) of fract;
    type fract2_sequence is array(taps-1 downto 0) of fract2;
    function mult(a,b: fract_sequence) return fract2_sequence;
end package fir_pkg;

package body fir_pkg is

    function mult(a,b: fract_sequence) return fract2_sequence is
        variable a_s, b_s:signed(bit_width-1 downto 0);
        variable seq: fract2_sequence;
    begin
        for i in a'range loop
            a_s := signed(a(i));
            b_s := signed(b(i));
            seq(i) := std_logic_vector(a_s * b_s);
        end loop;
        return seq;
    end mult;

end fir_pkg;
    
respondido por el user8352
1

fract2 no es compatible con signed , por lo que no se puede encontrar una función multiplicadora con el tipo de retorno correcto.

Cambie la definición de fract y fract2 a esto:

subtype fract is signed(bit_width-1 downto 0);
subtype fract2 is signed((2*bit_width)-1 downto 0);
    
respondido por el Philippe
0

El problema fue que se esperaba que el resultado del producto fuera signed pero en su lugar era fract2 (tipo personalizado definido aquí).

Por lo tanto, necesitamos crear una función para convertir el tipo. La conversión de tipos se explica aquí .

El código para la función de conversión aquí:

function conv_fract2(a:signed) return fract2 is
    variable var:fract2;
begin
    assert a'length = bit_width;
    for i in a'range loop
        var(i) := a(i);
    end loop;
    return var;
end conv_fract2;
    
respondido por el Prabhpreet

Lea otras preguntas en las etiquetas