¿Cómo definir una entidad VHDL con dos arquitecturas?

1

Actualmente tengo una entidad 'sumador' con dos arquitecturas: (1) RippleCarryAdder (2) CarryLookAheadAdder.

Pongo todas las definiciones en un solo archivo VHDL de la siguiente manera:

entity adder is
generic (N: integer := 16);
  Port ( Cin : in  STD_LOGIC;
      x : in  std_logic_vector (N - 1 downto 0);
      y : in  std_logic_vector (N - 1 downto 0);
      s : out  std_logic_vector (N - 1 downto 0);
      Cout : out  STD_LOGIC);
end adder;

architecture RippleCarryAdder of adder is
begin
  ...
end RippleCarryAdder;

architecture CarryLookAheadAdder of adder is
begin
  ...
end CarryLookAheadAdder 

Al utilizar ISE 14.7 Xilinx puedo ver que la herramienta tiene dificultades para distinguir correctamente dos arquitecturas asociadas a la entidad "sumador". Solo reconoce la última arquitectura especificada en el archivo (en este caso, 'CarryLookAheadAdder').

Supongo que hay algo con el dominio de archivo, o tal vez algunas reglas que rigen la declaración de arquitectura que no conozco. Es extraño que la documentación de VHDL no haya hablado sobre arquitectura múltiple y estructura de archivos. ¿Debo usar dos archivos y copiar la declaración de entidad en ambos? ¿Puede apuntar a una página que analice adecuadamente el formato de múltiples arquitecturas admitido por Xilinx ISE? (por ejemplo, la palabra clave de configuración no es compatible y tengo que recurrir a otro formato para enlazar arquitecturas).

    
pregunta Ehsan

2 respuestas

2
  1. Para usar múltiples arquitecturas en una sola entidad, la estructura que está buscando (creo) es configuraciones . Nunca podría hacer caras o colas de configuraciones, y el uso es arcano como mejor puedo decir. Mucha suerte si lo intentas.
  2. La manera a medias de hacerlo sería utilizar una declaración if genera con un parámetro genérico que selecciona qué instanciación utilizar. Esto requiere tener entidades separadas para cada arquitectura, y una tercera entidad para actuar como un contenedor alrededor de la declaración de generación.
  3. La forma realmente perezosa sería simplemente crear una instancia directa de su HalfAdder y RippleCarryAdder como módulos separados, e ignorar el dolor de cabeza por completo.

Nunca he intentado nada de esto, y no he usado ISE en años. No sé si es compatible con configuraciones funky, y honestamente no me sorprendería si no lo hiciera. Como todos los demás decían, sugeriría actualizar a Vivado

    
respondido por el Drew
0

Ok, creo que obtuve la respuesta correcta:

Podemos poner 'entidad' en un archivo separado y 'arquitectura1' en otro archivo, y 'arquitectura2' nuevamente en otro archivo. Así que acabaremos teniendo 3 archivos separados. Aquí el orden de compilación sí importa. Primero se debe compilar el archivo que contiene la definición de 'entidad', y luego las arquitecturas. Xilinx ISE tiene una opción que le permite establecer el orden de compilación manualmente. También podemos poner los tres en un solo archivo, la entidad es lo primero y luego las arquitecturas.

ISE 8.1i hasta 14.7 no admite correctamente arquitecturas y configuraciones ADECUADAS. Las únicas configuraciones que he acertado son:

  1. Vivado v2015.4 de 64 bits (Es curioso que hayan necesitado 10 años para admitir las funciones básicas de VHDL)
  2. GHDL con GTKWave: esta configuración también admite perfectamente múltiples arquitecturas, ¡incluso mejor que las herramientas Xilinx! El único inconveniente fue que obtuve el error de 'tamaño de pila limitado' en Windows. Cambié a la versión de Linux y funcionó bien.
respondido por el Ehsan

Lea otras preguntas en las etiquetas