Comparadores en VHDL VHDL tiene operadores de comparación 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 tamaño y estructura, y los operandos se comparan componente a componente. Los otros operadores de comparación, >, <, >= 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 más 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 más 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 más a la izquierda de elementos distintos es el orden del array. Si los arrays son de distinta longitud y todos los elementos del más corto coinciden con los elementos correspondientes del más largo, se considera menor el más corto. El resultado de todo esto es que los operadores de comparación 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 comparación aritmética válida, lo que se puede conseguir extendiendo el array más corto con ceros por la izquierda. Diseño lógico EUP ULPGC Jose Torres 1 de 2 El siguiente programa VHDL produce todas las salidas de comparación 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; Diseño lógico EUP ULPGC Jose Torres 2 de 2