VHDL tiene operadores de comparacin para todos los tipos
predefinidos. Igualdad (=) y desigualdad (/=) se aplican a todos los tipos; para los arrays y los tipo record, los operandos deben tener el mismo tamao y estructura, y los operandos se comparan componente a componente. Los otros operadores de comparacin, >, <, >= y <=, se aplican solo a tipos enteros, tipos enumerados (como STD_LOGIC) y arrays unidimensionales de tipos enumerados o enteros. El orden entero de menor a mayor es el orden natural, de menos infinito a ms infinito, y los tipos enumerados usan el orden en el que los elementos del tipo fueron definidos, desde el primero al ltimo. El orden de los tipos array se define iterativamente, empezando con el elemento ms a la izquierda en cada array. Los arrays siempre se comparan de izquierda a derecha, independientemente del orden del rango de su ndice (to o downto). El orden del par ms a la izquierda de elementos distintos es el orden del array. Si los arrays son de distinta longitud y todos los elementos del ms corto coinciden con los elementos correspondientes del ms largo, se considera menor el ms corto. El resultado de todo esto es que los operadores de comparacin predefinidos comparan arrays de igual longitud de tipo BIT_VECTOR Y STD_LOGIC_VECTOR como si representaran enteros sin signo. Si los arrays tienen distintas longitudes, entonces los operadores no producen una comparacin aritmtica vlida, lo que se puede conseguir extendiendo el array ms corto con ceros por la izquierda.
Diseo lgico EUP ULPGC
Jose Torres
1 de 2
El siguiente programa VHDL produce todas las salidas de comparacin
para comparar enteros sin signo de 8 bits. Como los dos vectores de entrada A y B tienen igual longitud, el programa produce el resultado deseado: library IEEE; use IEEE.std_logic_1164.all; entity vcompare is port ( A, B: in STD_LOGIC_VECTOR (7 downto 0); EQ, NE, GT, GE, LT, LE: out STD_LOGIC ); end vcompare; architecture vcompare_arch of vcompare is begin process (A, B) begin EQ <= '0'; NE <= '0'; GT <= '0'; GE <= '0'; LT <= '0'; LE <= '0'; if A = B then EQ <= '1'; end if; if A /= B then NE <= '1'; end if; if A > B then GT <= '1'; end if; if A >= B then GE <= '1'; end if; if A < B then LT <= '1'; end if; if A <= B then LE <= '1'; end if; end process; end vcompare_arch;