jueves, 7 de febrero de 2013

Operadores de Reducción Lógica - Operadores 'Unarios'

Introducción

En versiones anteriores de VHDL, los operadores lógicos and, or, nand, nor, xor and xnor eran definidos solo como operadores boleanos, es decir, se necesitaban dos operandos para realizar la respectiva función lógica boleana. Para casos en que los operandos eran arreglos y se necesitaba un simple valor escalar como resultado, se escribía un loop para aplicar el operando lógico a los elementos del arreglo.
VHDL-2008 extiende la definición de operandos lógicos para permitir que sean usados como operadores 'UNARIOS' (unary operands). Veremos a continuación cuales son los operandos unarios definidos en VHDL-2008 y como se usan. 

Repaso Operadores Booleanos

De acuerdo a la defincion del estandard de VHDL hay tres difrentes familias de operadores booleanos. Estos operadores estan definidos para tipo bit y boolean, y sus derivados, como asi tambien para los arreglos de estos tipos. 

1- Operador booleanos básico: realizan la operación lógica booleana entre cada bit de los operandos (bitwise logic), y produce como resultado un arreglo del mismo tamaño que los operandos. 


2- Operador booleano selectivo (operador unario): realiza la operación lógica booleana entre un simple bit y cada elemento del operando. El resultado es del mismo tamaño que el del operando. 


3- Operador booleano reducido: definido en VHDL-2008. Realiza la operación lógica booleana entre todos los elementos del arreglo, produciendo como resultado un simple bit. 


Cuáles son y Cómo se usan: Operadores Unarios

Los operadores unarios se usan específicamente en arreglos, y se aplican a cada elemento del arreglo para producir un escalar como resultado (en realidad también se pueden aplicar a arreglos de un elemento, pero en realidad no tiene mucho sentido). 
A continuación algunos ejemplos de uso y resultado de operadores unarios: 

and"0110" = '0' and '1' and '1' and '0' = '0'
or "0110" = '0' or  '1' or  '1' or  '0' = '1'
xor"0110" = '0' xor '1' xor '1' xor '0' = '0'

Los operandos de reducción nand, nor, xnor, son la negación de los operandos and, or y xor respectivamente. Por lo que: 

nand"0110" = not ( '0' and '1' and '1' and '0') = not '0' = '1'
nor "0110" = not ( '0' or  '1' or  '1' or  '0') = not '1' = '0'
nxor"0110" = not ( '0' xor '1' xor '1' xor '0') = not '0' = '1'

Los operandos de reducción tienen la misma precedencia que el operador unario not. En caso de ausencia de paréntesis estos operadores son evaluados antes de los operadores binarios. Así por ejemplo esta expresión

and Z xor B

Se evalúa primero el operando de reducción and, es decir la operación and Z, y luego se aplica el operador binario xor entre el resultado de la operación and Z y B.

Un caso típico de ventaja de uso del operador unario es por ejemplo en calculo de paridad de un vector. En versiones anteriores el código era escrito mas o menos de la siguiente forma:

parity <= data(7) xor data(6) xor data(5) xor data(4) xor
          data(3) xor data(2) xor data(1) xor data(0);

Usando el operador unario, se puede escribir sencillamente como:

parity <= xor data;

No hay comentarios:

Publicar un comentario