VHDL define el rango como rango previamente definido + desplazamiento

0

¿Hay alguna forma en VHDL para definir un rango como un rango previamente definido más algún desplazamiento? A continuación se muestra un ejemplo de lo que me gustaría hacer, pero no puedo encontrar la manera correcta de hacerlo. En este ejemplo, el din / dout de FIFO es de 47 a 0.

constant X_DEPTH        :   integer := 8;
constant Y_DEPTH        :   integer := 8;
-- Expected range 7 downto 0
subtype X_MAX_RANGE is natural range (X_DEPTH-1 downto 0);
-- Expected range 15 downto 8
subtype X_MIN_RANGE is natural range X_MAX_RANGE + X_DEPTH;
-- Expected range 23 downto 16
subtype Y_MAX_RANGE is natural range X_MIN_RANGE + Y_DEPTH;
-- Expected range 31 downto 24
subtype Y_MIN_RANGE is natural range Y_MAX_RANGE + Y_DEPTH;
-- Remaining bits (Expected 47 downto 32)
subtype REMAINDER is natural range 47 downto ???; -- Y_MIN_RANGE max + 1
signal dummy1,dummy2    :   std_logic_vector(REMAINDER);

begin

    FIFO_inst : entity work.FIFO
    PORT MAP
    (
        clk     => CLK,
        srst    => RESET,
        din(REMAINDER)          => dummy1,
        din(Y_MIN_RANGE)        => y_min,
        din(Y_MAX_RANGE)        => y_max,
        din(X_MIN_RANGE)        => x_min,
        din(X_MAX_RANGE)        => x_max,
        wr_en   => wr_en,
        rd_en   => rd_en,
        dout(REMAINDER)         => dummy2,
        dout(Y_MIN_RANGE)       => y_min_out,
        dout(Y_MAX_RANGE)       => y_max_out,
        dout(X_MIN_RANGE)       => x_min_out,
        dout(X_MAX_RANGE)       => x_max_out,
        full    => full,
        empty   => empty,
        valid   => valid
    );
    
pregunta ks0ze

2 respuestas

0

Puedes usar los atributos como 'derecha', 'izquierda', 'bajo' y 'alto' para generar un rango de otro:

Por ejemplo:

  subtype X_MIN_RANGE is natural range X_MAX_RANGE'low TO X_MAX_RANGE'high + X_DEPTH;

Para operaciones más elaboradas, también puede definir funciones (con parámetros enteros) que se evaluarán durante la síntesis siempre que las entradas sean constantes:

FUNCTION tweak(v : natural) RETURN natural IS
BEGIN
  RETURN 2*v + X_DEPTH;
END FUNCTION;

subtype Y_MAX_RANGE is natural range X_MIN_RANGE'low TO tweak(X_MIN_RANGE'high);

Por desgracia, VHDL no es lo suficientemente "funcional" para permitir devolver tipos o rangos generados desde las funciones.

    
respondido por el TEMLIB
0

Quiero dejar esto perfectamente claro, así que lo mantendré corto. VHDL describe el hardware, por lo que lo que está pidiendo es una pieza de hardware para ejecutar los valores anteriores. Estos valores almacenados de los que hablas son memoria. Por lo tanto, para hacer lo que quiera, sugeriría un pestillo, en el que, en función de una condición, en algún lugar, engancha un valor para que actúe como un valor almacenado y luego elimine la salida de la memoria enganchada.

    
respondido por el mcmiln

Lea otras preguntas en las etiquetas