2011-10-28 4 views
7

Recientemente comencé a utilizar registros para las definiciones de mis puertos, especialmente si deseo agrupar señales que pertenecen a una determinada interfaz. Sin embargo, el problema que estoy enfrentando aquí es que no puedo pasar, digamos el ancho de un std_logic_vector, a la entidad por medio de un genérico. Así que, básicamente, lo que quiero hacer es la siguiente:Pasar genéricos a tipos de puerto de registro

library ieee; 
use ieee.std_logic_1164.all; 
use work.math_pkg.all; 

package fifo_pkg is 

    type fifo_in_type is record 
    data_in : std_logic_vector(DATA_WIDTH_??- 1 downto 0); 
    rd  : std_logic; 
    wr  : std_logic; 
    end record; 

    type fifo_out_type is record 
    data_out : std_logic_vector(DATA_WIDTH_?? - 1 downto 0); 
    empty : std_logic; 
    full  : std_logic; 
    end record; 

    component fifo is 
    generic 
     (
     MIN_DEPTH : integer; 
     DATA_WIDTH : integer 
     ); 
    port 
     (
     clk : in std_logic; 
     res_n : in std_logic; 
     i  : in fifo_in_type; 
     o  : out fifo_out_type 
     ); 
    end component fifo; 

end fifo_pkg; 

así que la solución ideal sería cuando puedo utilizar el mismo genérico en mi expediente como lo hice en la entidad. (Entonces DATA_WIDTH es igual que DATA_WIDTH_ ??). Sé que esto debería funcionar de alguna manera con vhdl 2008, sin embargo mi quartus II 11sp1 no es compatible con los genéricos en los registros.

¿Existe una forma elegante de lograr ese tipo de "aprobación genérica" ​​que se puede sintetizar? Sé que uno podría simplemente almacenar una constante en el paquete, pero luego no puedo usar el mismo paquete fifo para crear instancias de varias fifo con diferentes anchos.

Un millón de gracias, T

Respuesta

8

Se puede utilizar genéricos tipo con Quartus?

A continuación te dejamos el tipo completamente sin especificar, de manera que se puede crear un FIFO de integers o cualquier otro tipo de datos:

package fifo_pkg is 
    generic (type element_type); 

    type fifo_in_type is record 
    data_in : element_type; 
    rd  : std_logic; 
    wr  : std_logic; 
    end record; 

    type fifo_out_type is record 
    data_out : element_type; 
    empty : std_logic; 
    full  : std_logic; 
    end record; 

    component fifo is 
    generic 
     (
     MIN_DEPTH : integer; 
     DATA_WIDTH : integer 
     ); 
    port 
     (
     clk : in std_logic; 
     res_n : in std_logic; 
     i  : in fifo_in_type; 
     o  : out fifo_out_type 
     ); 
    end component fifo; 

end fifo_pkg; 

Entonces, cuando usted quiere usarlo:

package wide_fifo_pkg is new fifo_pkg 
    generic map (type => std_logic_vector(31 downto 0)); 

y entonces usted puede utilizar fifo_in_type y fifo_out_type:

signal i : fifo_in_type; 

Si tiene más de un FIFO en una unidad de diseño puede crear varias versiones del paquete y usar el prefijo de paquete para obtener el tipo correcto:

package narrow_fifo_pkg is new fifo_pkg 
    generic map (type => std_logic_vector(3 downto 0)); 

signal i32 : wide_fifo_pkg.fifo_in_type; 
signal i4 : narrow_fifo_pkg.fifo_in_type; 

Otra VHDL opción de 2008: se puede tener una sin restricciones de tipo de registro:

type fifo_in_type is record 
    data_in : std_logic_vector; 
    rd  : std_logic; 
    wr  : std_logic; 
    end record; 

que luego se puede crear subtype s de para sus diversos usos:

subtype fifo1_data_type is fifo_in_type(data_in(31 downto 0)); 
subtype fifo2_data_type is fifo_in_type(data_in(15 downto 0)); 

No tengo idea si Quartus admite cualquiera de esas opciones, ¡por favor háganoslo saber!

+0

Hola Martin, Gracias por las sugerencias, ambos son bonitos y elegantes. Sin embargo, esto no funciona en Quartus versión 11.0 sp1. Parece que el quartus solo admite un subconjunto muy limitado de vhdl 2008 hasta el momento. ¿Alguna otra idea para hacer esto? Me pregunto si eso funcionaría con Synplify ... Gracias, T – user1017739

+0

Es una pena (sobre Quartus), pero no del todo inesperada. El archivo de ayuda Synplify implica que no conoce los registros con matrices * sin restricciones y * tipos genéricos. –

+0

sí, eso es un poco decepcionante :( – user1017739