La compilación de un multiplexor simple de 2 entradas con GHDL falla

1

Empecé a leer "The Designer's Guide to VHDL" por P. J. Ashenden, pero ya estoy atascado después del ejercicio 9, aquí está mi código:

entity mul2 is
port ( a, b, sel : in bit;
       z : out bit );
end entity mul2;

architecture behav of mul2 is
begin

multiplex : process is
begin
    if sel then
        z <= a;
    else
        z <= b;
    end if;
end process multiplex;

end architecture behav;

Cuando invoco GHDL con

ghdl -a mul2.vhdl

Recibo el siguiente error:

mul2.vhdl:11:19: can't match port "sel" with type boolean
mul2.vhdl:2:21: (location of port "sel")

Estoy un poco confundido, porque en el libro hay un ejemplo que muestra un puerto de bits que se usa en una sentencia if de la misma manera que lo hago en mi código, pero ese ejemplo no se compilará también Ejemplo 1.2, si tiene el libro a la mano).

Creo que este es un problema con GHDL que no implementa el estándar correctamente. ¿Alguien tiene una idea de lo que está mal aquí?

    
pregunta georgjz

3 respuestas

2

El problema está en la declaración if .

A diferencia de C, en VHDL, no hay un atajo que evalúe cualquier valor distinto de cero como verdadero y el resto como falso. VHDL es mucho más estricto aquí.

Aquí está el código fijo:

entity mul2 is
port ( a, b, sel : in bit;
       z : out bit );
end entity mul2;

architecture behav of mul2 is
begin

multiplex : process is
begin
    if sel = '1' then  --- see, if you do a proper compare it works
        z <= a;
    else
        z <= b;
    end if;
end process multiplex;

end architecture behav;
    
respondido por el Nils Pipenbrinck
2

Esto no es proporcionar información adicional para la respuesta de TEMLIB sin mutilarla. La información no cabrá en un comentario.

IEEE Std 1076-2008 9.2.9 Operador de condición, párrafo 4:

  

El operador de condición aplicado implícitamente, si corresponde, es el operador predefinido para el tipo BIT o un operador sobrecargado, determinado de la siguiente manera. Si, sin resolución de sobrecarga (ver 12.5), la expresión es de tipo BOOLEAN definida en el paquete ESTÁNDAR, o si, asumiendo que una regla requiere que la expresión sea de tipo BOOLEANA definida en el paquete ESTÁNDAR, la resolución de sobrecarga puede determinar al menos una interpretación de cada constituyente del contexto completo más interno que incluye la expresión, entonces el operador de condición no se aplica. De lo contrario, el operador de condición se aplica implícitamente y el tipo de expresión con la aplicación implícita se definirá como BOOLEAN en el paquete ESTÁNDAR.

El tipo BOOLEAN tiene el operador implementado en el paquete estándar:

  

ghdl --disp-standard --std = 08 | grep \? \?
-- function "??" (<anonymous>: bit) return boolean;

También se implementó en la revisión -2008 del paquete std_logic_1164:

  

function "??" (l : STD_ULOGIC) return BOOLEAN;

Que sirve para cualquier tipo de matriz o subtipo definido con elementos STD_ULOGIC. (Los tipos de arreglos ufixed, sfixed, float, signed, unsigned, std_ulogic_vector y std_logic_vector usan elementos std_ulogic y están declarados en paquetes IEEE).

No hay otros tipos con el operador de condición predefinido en la revisión de la norma -2008.

El estándar -2008 también introduce operadores relacionales coincidentes (Ver 9.2.3 Operadores relacionales.

Hay un inconveniente. Casi todas las herramientas VHDL tienen que tener habilitado el modo de compatibilidad -2008, y todas las nuevas funciones no son compatibles con todas las herramientas (presumiblemente todavía no, solo han pasado ocho años ).

Las construcciones que debe usar generalmente están dictadas por toda la cadena de herramientas (especialmente las herramientas de síntesis), así como por las preocupaciones de portabilidad.

Encontrará en las funciones compatibles de Xilinx en la Guía del usuario 901 Guía del usuario de Vivado Design Suite Síntesis Capítulo 5 Soporte de idiomas VHDL-2008. Por lo general, se ofrecerán otros proveedores con soporte de funciones.

Podrías notar La Guía del diseñador para VHDL , Peter Ashenden, 2d ed., 2002 que el tema del ejercicio del cual la pregunta está tomada Precede el lanzamiento del estándar -2008 por más de seis años.

Capítulo 1 Ejercicio 8, Libro página 26:

  

Escriba una declaración de entidad y un cuerpo de arquitectura de comportamiento para un multiplexor de dos entradas con puertos de entrada a , b y sel y una salida puerto de z . Si la entrada sel es '0', el valor de a se debe copiar en z , de lo contrario, el valor de b debe copiarse a z . Escriba un banco de pruebas para el modelo de multiplexor y pruébelo usando un simulador VHDL ".

Sugeriría poner todos los atajos en práctica inmediatamente:

entity mul2 is
port ( a, b, sel: bit;
       z : out bit );
end;

architecture foo of mul2 is
begin
    Z <= a when sel else b;
end;

no sirve al aprendiz de VHDL, sino que comprende la sintaxis, la semántica y el sistema de tipos, y no comprende los límites de la cadena de herramientas que está utilizando. Si no entiende VHDL, trabajar de manera suficiente para solucionar las limitaciones de la cadena de herramientas puede ser mucho más difícil.

Además de un operador de condición aplicado implícitamente, la expresión de condición podría aplicarse explícitamente: ?? sel .

    
respondido por el user8352
1

El uso directo de std_logic o bit como booleano en las declaraciones IF es una novedad introducida en la edición 2008 de VHDL.

Como valor predeterminado, GHDL admite el idioma definido en la edición de 1993 del estándar (que se usa más ampliamente), puede seleccionar la edición de 2008 a través de una opción de línea de comando:

--std=08
    
respondido por el TEMLIB

Lea otras preguntas en las etiquetas