En el modelado de la lógica digital
Lógica combincacional
Cuando se utiliza lógica combinacional algunas descripciones pueden
llevar a codifiaciones más complejas.
Por ejemplo, y en casos raros, la descripción de un multiplexor mediante
una estructura condicional (when...else, por ejemplo) en vez de usar
la asignación simple de señales (como with...select)
puede ser considerada por la herramienta de síntesis como un codificador
de prioridad
Algo, ya más grave, puede ocurrir cuando en un process la lógica no engloba todas las posibles combinaciones de la variable. Entonces el sintetizador infiere un latch. También se infiere un latch cuando una variable es leída previa asignación de la misma
Ejemplo
A continuación se muestra la descripción de un circuito combinacional implementada en un proceso
En el código de la izquierda, a la entrada del proceso se inicializa la salida (y <= '0') y, dentro de la instrucción if, se modifica el valor, tal como lo indican las asignaciones a las entradas (a y b)
En el código de la derecha, por el contrario, no se ha inicializado la salida y, dentro de la condición if, no están consideradas todas las posibles combinaciones de las entradas (no se dice nada sobre la combinación a=0 y b=0). Por consiguiente, en este caso la salida se mantiene. Esto es, se induce un latch
Lógica combinacional | Se genera latch |
|
|
![]() |
![]() |
Lógica secuencial
La lógica secuencial usada normalmente es la síncrona
En circuitos síncronos gobernados por flanco de reloj las señales de reloj deben ser del tipo bit o std_ulogic (o un subtipo como std_logic)
En una descripción de un circuito secuencial, la instrucción if referente a la señal de reloj debe describirse después de todas las asignaciones asíncronas
-- Ejemplo
if nrst='0' then count:="0000"; -- Condición asíncrona
elsif clk'event and ck='1' then -- Relojif load='1' then count := data;
else count <= count + 1;
end if;end if;
Cuando se utilice la instrucción wait, la sentencia wait que contiene la expresión de flanco de reloj debe ser la primera en el process
Cuando se implementen máquinas de estado finito se sugiere realizar la implementación utilizando la estructura de dos procesos
Restricciones de modelado
Las constantes genéricas declaradas deben ser del
tipo entero
La síntesis no considera variables temporales. Por consiguiente declaraciones del tipo inertial o transport son ignoradas por los sintetizadores
Se recomienda utilizar una arquitectura para cada entity (deriva de restricciones de configuración). Cuando para una entidad existan distintas arquitecturas, por defecto se suele considerar la analizada más recientemente
Declaraciones de ficheros, alias o atributos (excepto el atributo string tipo codificacion ) son ignoradas por la síntesis
En subprogramas
No está permitido utilizar cláusulas wait
Las variables declaradas en subprogramas deben ser estáticas
Cualquier recursividad aplicada a un subprograma debe tener determinado el número de recursiones
No se admiten todas las sentencias secuenciales. Por ejemplo, mientras se admiten declaraciones for loop, no están admitidas instrucciones while loop o loop sin iteración predeterminada
Los atributos 'base, 'left, ... sólo están admitidos en arrays unidimensionales
Algunos de los operadores (como mod, rem) tienen uso restringido (que habrá de consultarse)