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

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

Puse todas las definiciones en un solo archivo VHDL como se muestra a continuación:

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 

Usando 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 del archivo, o tal vez algunas reglas que rigen la declaración de arquitectura de las que no estoy al tanto. Es extraño que la documentación de VHDL no hable sobre múltiples arquitecturas y estructuras de archivos. ¿Debo usar dos archivos y copiar la declaración de entidad en ambos? ¿Puede señalar una página que analice adecuadamente el formato de múltiples arquitecturas compatible con Xilinx ISE? (por ejemplo, la palabra clave de configuración no es compatible y tengo que recurrir a otro formato para enlazar arquitecturas).

Esto bien puede ser una limitación de Xilinx. Un enfoque que debería funcionar (pero Xilinx ha tenido problemas para admitir algo tan básico como las bibliotecas de VHDL en el pasado, así que puede que no) es colocar la entidad y las arquitecturas en archivos separados (3 archivos). Luego, puede crear una instancia directamente como Adder1 : entity work.my_ent(my_arch1) generic map () port map ();De lo contrario, podría ser el momento de aprender las configuraciones.
¿Cuál es la alternativa Xilinx? ¿Puedo usar otro compilador VHDL y seguir programando Xilinx FPGA?
Primero averigüe si ES un problema. Dependiendo de los FPGA, Xilinx ofrece Vivado así como ISE, y para algunas familias de FPGA puede seleccionar entre el analizador antiguo (con errores) y el nuevo (con diferentes errores) dentro de ISE (a través de la opción "usar nuevo analizador"). Si todo lo demás falla, Synplicity vende una versión dirigida a Xilinx, por lo que puede probar un conjunto diferente de errores.
"Probando diferentes conjuntos de errores". Me hace reir. jaja gracias
¿Intentaste usar configuraciones?
La unidad de configuraciones en Xilinix ISE no es compatible, al menos no funciona para mí. Pero al menos logré vincular las arquitecturas a la entidad usando esto: "para AdderNormal: sumador use entidad basic.adder(RippleCarryAdder); para AdderLookAHead: sumador use entidad basic.adder(CarryLookAheadAdder);" Pero luego la GUI se vuelve muy desordenada: en ISE 8.1i, la GUI no actualiza correctamente el nombre de la arquitectura. Esto se solucionó en IDE 14.7, pero luego bloquea la primera arquitectura y no puedo hacer doble clic en ella para abrir el archivo VHDL asociado. Supongo que ambos tienen errores. Todavía no he probado Vivado.
¡Ojalá estuviera siendo cínico cuando dije eso! ISE8 es MUY viejo para este tipo de trabajo. Tomó hasta ISE12 o 13 antes de que ISE admitiera bibliotecas VHDL correctamente e incluso entonces, la GUI tomó algunas versiones más para ponerse al día. En los viejos tiempos, podía enviar casos de prueba mínimos a través del sistema Webcase y Xilinx los aceptaba. Mi registro fue de 8 casos web abiertos simultáneamente, 5 de ellos resultaron en errores corregidos en revisiones posteriores (principalmente en ISIM, pero uno o dos en ISE). Como usuario académico, es posible que aún tenga un canal para hacerlo.

Respuestas (2)

  1. Para usar múltiples arquitecturas en una sola entidad, la estructura que está buscando (creo) es las configuraciones . Nunca pude hacer cara o cruz de las configuraciones, y el uso es arcano en lo mejor que puedo decir. Mucha suerte si lo intentas.
  2. La forma a medias de hacerlo sería usar una declaración de generación if con un parámetro genérico que seleccione qué instanciación usar. Esto requiere tener entidades separadas para cada arquitectura y una tercera entidad que actúe como un envoltorio alrededor de la declaración de generación.
  3. La forma realmente perezosa sería simplemente instanciar directamente 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 admite configuraciones originales y, sinceramente, no me sorprendería si no lo hiciera. Como todos los demás decían, sugeriría actualizar a Vivado

Ok, creo que tengo la respuesta correcta:

Podemos poner 'entidad' en un archivo separado y 'arquitectura1' en otro archivo, y 'arquitectura2' nuevamente en otro archivo. Entonces terminaremos 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 viene primero y las arquitecturas siguen.

ISE 8.1i hasta 14.7 no admite correctamente múltiples arquitecturas y configuraciones CORRECTAMENTE. Las únicas configuraciones que acerté son:

  1. Vivado v2015.4 de 64 bits (es curioso que necesitaran 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 de 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.
¿Qué versión de ghdl? ghdl solía tener una --stack-size=nnnnopción, ahora obsoleta. Si ya está usando ghdl-0.34dev, considere informar esto (deje en claro que es un problema de la versión de Windows) con testcase en github.com/tgingold/ghdl/issues
Para GHDL, usé un instalador llamado: "ghdl-installer-0.29.1.exe", así que supongo que mi versión era antigua y todavía tenía este error de tamaño de pila. Mi GHDL en Linux está en la versión 0.33 y no tiene ese problema de tamaño de pila.