Me preguntaba por qué VHDL tiene un tipo de datos booleano. ¿Cuándo '0' o '1' no es suficiente? ¿Se implementan los booleanos de forma diferente?
Respuestas
¿Demasiados anuncios?Para ser sinceros, es una cuestión de gustos.
En el LRM de 1993 hay una nota relacionada con BOOLEAN
en la página 36, que establece que
El tipo BOOLEAN puede utilizarse para modelar una lógica activa alta o activa baja, dependiendo de las funciones de conversión elegidas para y desde el tipo BIT.
La implicación es que BOOLEAN
debe utilizarse para describir la funcionalidad y convertirse posteriormente en un "nivel lógico".
Hay muchas formas de responder a tu pregunta, pero lo más importante es recordar que VHDL fue desarrollado por un comité del Departamento de Defensa de EE.UU. y, por tanto, no debemos esperar cosas como la lógica o la razón, lo cual es irónico porque estamos hablando de lógica.
VHDL es un "fuertemente tipado" idioma. Normalmente, en un lenguaje fuertemente tipado hay muchos tipos de datos diferentes que son similares entre sí, pero sólo difieren en el uso. Por ejemplo, podrías usar un entero, SLV, o un tipo de dato enumerado para una variable de máquina de estado. Pero para la mayoría de las situaciones sólo un enum funciona "óptimamente".
Este método ayuda a evitar que el programador introduzca errores, al tiempo que da al compilador la mayor libertad para crear código/lógica optimizados. Con una variable de estado, el compilador puede elegir la codificación de estado más óptima (one-hot, binary, etc.). Si la variable de estado se implementara como un entero o SLV, el compilador no tendría esa capacidad. Además, con un entero o SLV podrías fácilmente asignar inadvertidamente estados inválidos a la variable de estado, creando errores que pueden ser difíciles de diagnosticar.
Lo mismo ocurre con Boolean, aunque es más difícil ver las ventajas. Obliga al escritor a ser explícito cuando, sin una tipificación de datos fuerte, el código sería menos "obvio". Esencialmente, es más difícil cometer un error con Boolean.
El efecto secundario de los tipos de datos fuertes es que algunas cosas son más "palabrosas" en VHDL. Es el precio que hay que pagar.
Pero para responder directamente a sus preguntas...
"¿Cuándo no funciona el 0/1?" Técnicamente, 0/1 funcionaría. El principal problema del 0/1 es que no te dice qué estado es "verdadero". ¿Es esa señal activa baja, o activa alta? No se puede confundir con el booleano TRUE/FALSE. Pero en todos los demás casos, 0/1 estaría perfectamente bien. Boolean está ahí, no por razones técnicas, sino por razones logísticas de programación.
"¿Se implementa la booleana de forma diferente?" La verdad es que no. La lógica generada no es diferente de la alternativa bien escrita. De nuevo, está ahí principalmente para evitar que el programador haga algo estúpido sin darse cuenta.
También debo señalar que cuando se habla de lenguajes de programación fuertemente tipados frente a lenguajes débilmente tipados, las cosas degeneran rápidamente en un debate filosófico, y los matices de este debate no se pueden entender del todo a menos que se haya escrito mucho código (más de un millón de líneas de código). Otra cosa que a menudo se pasa por alto es que hay niveles de datos fuertemente y débilmente tipados. Yo describiría C como débilmente tipado, y C++ como fuertemente tipado, aunque las tablas de Wikipedia muestran casi todos los lenguajes como fuertemente tipados.
Se hace por claridad
Estoy seguro de que en todos los casos en los que utilices un booleano, podrías utilizar un '0/1'. Personalmente (cuando se utilizan variables con nombres adecuados) creo que sólo hace que el código más limpio / más descriptivo para escribir algo como:
signal OutputEnabled : boolean;
y más tarde refernce como
if ( not(OutputEnabled) ) then
Output <= 'Z';
else
Output <= Input;
end if;
en lugar de
signal OutputEnabled : std_logic;
y más tarde refernce como
if ( OutputEnabled /= '1' ) then
Output <= 'Z';
else
Output <= Input;
end if;
Un gran uso para los booleanos es abstraer señales activo-bajo para que no tenga que cavar a través del código en busca de cada lugar que hago una comparación si tengo que cambiar la polaridad.
Novedad para VHDL-2008
Curiosamente, el nuevo estándar VHDL 2008 realiza conversiones implícitas de condiciones en booleanos sin ningún tipo de casting, por lo que se podría escribir:
signal OutputEnabled : std_logic;
y más tarde refernce como
if ( not(OutputEnabled) ) then
En mi opinión, una buena inclusión.
El tipo booleano sirve para variables donde 0/1 es para señales . No conozco específicamente la diferencia entre señales y variables, pero creo que las variables sólo se pueden utilizar internamente y no enrutadas a pines externos, pero tener variables te permite realizar tareas de alto nivel para las que los bits no son suficientes.