Me preguntaba por qué VHDL tiene un tipo de datos booleano. ¿Cuándo no se corta '0' o '1'? ¿El booleano se implementa de manera diferente?
Me preguntaba por qué VHDL tiene un tipo de datos booleano. ¿Cuándo no se corta '0' o '1'? ¿El booleano se implementa de manera diferente?
Hay muchas maneras de responder a su pregunta, pero lo más importante que debe recordar es que la VHDL fue desarrollada por un comité del Departamento de Defensa de los EE. UU. y, por lo tanto, no debemos esperar cosas como la lógica o la razón, lo cual es irónico porque nosotros estamos hablando de lógica.
VHDL es un lenguaje "fuertemente tipado" . Normalmente, en un lenguaje fuertemente tipado, hay muchos tipos de datos diferentes que son similares entre sí, pero que difieren solo en el uso. Por ejemplo, podría usar un tipo de datos entero, SLV o enumerado para una variable de máquina de estado. Pero para la mayoría de las situaciones, solo una enumeración funciona "de manera óptima".
Este método ayuda a evitar que el programador introduzca errores, mientras le 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 (uno-caliente, binario, etc.). Si la variable de estado se implementara como un entero o SLV, el compilador no tendría esa capacidad. Además, con un número entero o una SLV, podría fácilmente asignar inadvertidamente estados no válidos a la variable de estado, creando errores que pueden ser difíciles de diagnosticar.
Lo mismo es cierto para Boolean, aunque es más difícil ver el beneficio. Obliga al escritor a ser explícito donde, sin una fuerte tipificación de datos, el código sería menos "obvio". Esencialmente, es más difícil equivocarse con Boolean.
El efecto secundario de los tipos de datos sólidos es que algunas cosas son más "complicadas" en VHDL. Es el precio que pagamos.
Pero para responder directamente a tus preguntas ...
"¿Cuándo 0/1 no lo corta?" Técnicamente, 0/1 funcionaría. El principal problema con 0/1 es que no le dice qué estado es "verdadero". ¿Es esa señal activa baja o activa alta? No puedes confundirte con el Booleano VERDADERO / FALSO. Pero en todos los demás casos, 0/1 estaría perfectamente bien. Boolean está ahí, no por razones técnicas, sino por razones de programación logística.
"¿Se implementa Boolean de manera diferente?" Realmente no. La lógica generada no es diferente a la alternativa bien escrita. Nuevamente, es principalmente para evitar que el programador haga algo estúpido sin darse cuenta.
También debo señalar que cuando se analizan los lenguajes de programación fuertemente en contra y los que están mal escritos, las cosas degeneran rápidamente en un debate filosófico, y los matices de este debate no se pueden entender completamente a menos que haya escrito un montón de código (1+ millones de líneas de código). Otra cosa que se pasa por alto con frecuencia es que hay niveles de datos tipificados de forma fuerte y débil. Yo describiría C y ser débilmente tipado, y C ++ como fuertemente tipado, aunque las tablas en Wikipedia muestran casi todos los idiomas como fuertemente tipados.
Es una cuestión de gusto ser honesto.
En el LRM de 1993 hay una nota relacionada con BOOLEAN
en la página 36 que indica que
el tipo BOOLEAN se puede usar para modelar lógica activa alta o baja activa según las funciones de conversión particulares elegidas desde y hacia el tipo BIT
La implicación es que BOOLEAN
debe usarse para describir la funcionalidad y convertirse a un "nivel lógico" más adelante.
Se hace por claridad
Estoy seguro de que en todos los casos que uses un booleano, podrías usar un '0/1'. Personalmente (cuando se usan variables bien nombradas), creo que solo hace que el código más limpio / más descriptivo escriba algo como:
signal OutputEnabled : boolean;
y luego refiérase como
if ( not(OutputEnabled) ) then
Output <= 'Z';
else
Output <= Input;
end if;
en lugar de
signal OutputEnabled : std_logic;
y luego refiérase como
if ( OutputEnabled /= '1' ) then
Output <= 'Z';
else
Output <= Input;
end if;
Un gran uso para los booleanos es abstraer señales activas-bajas para que no tenga que revisar el código en busca de todos los lugares en los que hago una comparación si tengo que cambiar la polaridad.
Nuevo para VHDL-2008
Curiosamente, el nuevo estándar VHDL 2008 realiza conversiones implícitas de condiciones en booleano para usted sin ningún tipo de casting, por lo que podría escribir:
signal OutputEnabled : std_logic;
y luego refiérase como
if ( not(OutputEnabled) ) then
Muy buena inclusión en mi opinión!
El tipo booleano es para variables donde 0/1 es para señales . No sé específicamente la diferencia entre señales y variables, pero creo que las variables solo se pueden usar internamente y no se pueden enrutar a pines externos, pero tener variables le permite realizar tareas de alto nivel para las que los bits no son suficientes.
Lea otras preguntas en las etiquetas vhdl