Empecé a leer "The Designer's Guide to VHDL" de PJ 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
Obtuve 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 declaración if de la misma manera que lo hago en mi código, pero ese ejemplo no se compilará tan bien (ejemplo 1.2, si tienes el libro a 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í?
El problema está en el if
enunciado.
A diferencia de C, en VHDL no hay ningún 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;
Esto no proporciona información adicional para la respuesta de TEMLIB sin mutilarlo. La información no cabe 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 lo hay, 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 STANDARD, o si, asumiendo una regla que requiere que la expresión sea de tipo BOOLEAN definida en el paquete STANDARD, la resolución de sobrecarga puede determinar al menos una interpretación de cada componente del contexto completo más interno, incluida la expresión, no se aplica el operador de condición. De lo contrario, el operador de condición se aplica implícitamente y el tipo de expresión con la aplicación implícita será BOOLEAN definido en el paquete STANDARD.
El tipo BOOLEAN tiene el operador implementado en el paquete estándar:
ghdl --disp-estándar --std=08 | grep\?\?
-- function "??" (<anonymous>: bit) return boolean;
También está implementado en la revisión -2008 del paquete std_logic_1164:
function "??" (l : STD_ULOGIC) return BOOLEAN;
Que sirve para cualquier tipo de matriz o subtipos definidos con elementos STD_ULOGIC. (Los tipos de matriz ufixed, sfixed, float, firmed, unsigned, std_ulogic_vector y std_logic_vector utilizan elementos std_ulogic y se declaran en paquetes IEEE).
No hay otros tipos con el operador de condición predefinido en la revisión -2008 del estándar.
El estándar -2008 también introduce operadores relacionales coincidentes (consulte 9.2.3 Operadores relacionales.
Hay un inconveniente. Casi todas las herramientas VHDL deben tener habilitado el modo de compatibilidad -2008, y todas las funciones nuevas no son compatibles con todas las herramientas (presuntamente todavía no, solo han pasado ocho años ).
Las construcciones que debe usar generalmente están dictadas por toda su cadena de herramientas (especialmente las herramientas de síntesis), así como por las preocupaciones de portabilidad.
Encontrará las funciones admitidas de Xilinx en la Guía del usuario 901 Vivado Design Suite Guía del usuario Síntesis Capítulo 5 VHDL-2008 Soporte de idiomas. Por lo general, otros proveedores ofrecerán soporte de características.
Podría notar en The Designer's Guide to VHDL , Peter Ashenden, 2d ed., 2002 que el tema del ejercicio de donde se toma la pregunta precede al 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 un puerto de salida de z . Si la entrada sel es '0', el valor de a debe copiarse en z ; de lo contrario, el valor de b debe copiarse en z . Escriba un banco de pruebas para el modelo de multiplexor y pruébelo usando un simulador VHDL".
Sugiero poner en práctica todos los atajos de inmediato:
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 además de comprender la sintaxis, la semántica y el sistema de tipos ni comprender los límites de la cadena de herramientas que está utilizando. Si no comprende lo suficiente el VHDL, solucionar las deficiencias 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
.
El uso directo de std_logic o bit como valores booleanos en declaraciones IF es una novedad introducida en la edición 2008 de VHDL.
De manera predeterminada, GHDL admite el idioma definido en la edición de 1993 del estándar (que es más ampliamente utilizado), puede seleccionar la edición de 2008 a través de una opción de línea de comando:
--std=08
usuario8352
type boolean is (false, true);
Son valores de enumeración de tipo booleano.usuario8352
koala