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

Process(a, b, c)
begin

y <= '0';
if (a = '1') then y <= c;
elsif (b = '1') then y <= not (c);
end if;

end process;

Process(a, b, c)
begin

if (a = '1') then y <= c;
elsif (b = '1') then y <= not (c);
end if;

end process;


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 -- Reloj

if 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)

Anterior
Volver a inicio curso
Volver a inicio capítulo
Siguiente


WcN - Joan Oliver. Diseño de circuitos digitales con VHDL: Síntesis