Programación en VHDL/Apéndices/Síntesis

← Apéndices Síntesis Apéndices/Instalación y uso de GHDL →


La síntesis de un circuito consiste en abstraer la descripción del circuito hasta conseguir un diseño puramente estructural. Cualquier descripción VHDL es sintetizable, independiente del nivel de abstracción, evidentemente no será el diseño más apropiado puesto que la velocidad que se requiere no se cumplirá, pero su funcionalidad si corresponderá a lo descrito.

Hoy en día las herramientas de síntesis realizan la síntesis de forma eficiente, pero aún no se encuentran tan avanzadas para realizar la síntesis a partír de una descripción de alto nivel, puesto que la optimización es pésima.

Restricciones y Consejos

editar

En esta sección se verá como interpreta algunas instrucciones en VHDL las herramientas de síntesis. Muchas herramientas de síntesis realizan mal la síntesis de ciertas partes, por consiguiente el diseñador debe facilitar estas partes.

Es posible que el comportamiento que se obtiene en la simulación sea la misma que en la síntesis, puesto que en un circuito real existen retrasos o incluso el comportamiento puede variar. Además dependiendo de la herramienta de síntesis utilizada se obtedrán unos resultados u otros.

  • Evitar cláusulas temporales y esperas. El uso de retrasos esta prohibido, puesto que el propio sintetizador ignorará estos retrasos. Al igual que las esperas mediante el comando WAIT (no las listas de sensibilidad mediante dicha palabra).
  • Identificadores de puertas claros.
  • Uso de funciones y módulos. La división del código ayuda a la síntesis del código. Además de la posible reutilización.
  • Cuidado con las listas sensibles. Incluir las señales pertinentes para poder activar el proceso oportuno.
  • Permitir discrepancia. Es posible asignaciones dl tipo s <= NOT s.
  • Inicialización de variables y señales. Normalmente la síntesis no toma en cuenta ninguna inicialización, a menos que se disponga de un reset o algo parecido.
  • Señales de reloj. Sólo se permite una señal de reloj por proceso, indicándola de la siguiente manera: clk='1' and clk'event.
  • Asignaciones únicas.
  • Niveles lógicos. No se admiten todos los valores de una señal, como puede ser el don't care.
  • Evitar IF's anidados. Como máximo tres niveles, pero lo mejor es utilizar bloques CASE.

Construcciones básicas

editar

Existen dos formas de describir la lógica de un diseño, éstas son combinacional o secuencial.

Descripción de la lógica combinacional

editar

Si la salida del circuito depende de una o varias entradas en ese mismo instante, es decir que lo sucedido anteriormente no afecta a la salida, se podrá describir como lógica combinacional.

Una señal la cual se le está asignando un valor no debe intervenir en dicha asignación en caso de la ejecución concurrente. Ejemplo:


     -- Combinacional
     a <= b WHEN t = '1' ELSE c;
     d <= b AND a;
     -- Secuencial
     a <= b WHEN t = '1' ELSE a;
     d <= b AND d;

En caso de la ejecución serie debe asegurarse que las señales de activación de un proceso se encuentran en la lista de sensibilidad. También se deben contemplar todos los casos posibles cuando existen instrucciones condicionales, en caso de que no se contemple alguna condicción se tratara de un latch, por lo tanto se trata de un elemento de memoria. Ejemplo:


     -- Combinacional
     PROCESS (b,c,d,e)
     BEGIN
       IF b = '1' THEN
         d <= c;
       ELSE
         d <= '0';
       END IF;
       a <= d OR e;
     END PROCESS;

     -- Secuencial
     PROCESS (b,c,d,e)
     BEGIN
       IF b = '1' THEN
         d <= c;
       END IF;
       a <= d OR e;
     END PROCESS;

Descripción de la lógica secuencial

editar

Si la salida del diseño implementado depende de la entrada actual y del estado anterior o de las entradas que sucedieron, se deberá realizar una descripción secuencial.

  • Descripción de cerrojos. Un cerrojo mantiene la salida a un valor cuando una señal de entrada la activa. Es posible realizarlo de forma concurrente y serie.
Serie: Existen varias opciones.
No se consideran todas las opciones.

     PROCESS (b,en)
     BEGIN
       IF en = '1' THEN
         a <= b;
       END IF;
     END PROCESS;

No se especifican todas las señales en la lista de sensibilidad. La mayoría de los sintetizadores incluyen todas las señales que intervienen en el proceso de aignación o consulta.

     PROCESS (b)
     BEGIN
       a <= c OR b;
     END PROCESS;

Concurrente: Cuando una señal interviene en la asignación de sí misma.

     a <= b AND c WHEN t = '1' ELSE a;

  • Descripción de señales de reloj. Una señal de reloj se obtiene en el instante de un flanco de subida o bajada de una señal, en VHDL sólo es posible una de ambas formas, es decir o mediante la subida o la bajada, pero no ambas. Únicamente es posible un único reloj por proceso, y a la hora de detectar dicho evento no debe haber un ELSE, ni tampoco negar el evento con un NOT.

     clk = '0' AND clk'event 
     clk = '1' AND clk'event

Cabe resaltar que existen expresiones equivalentes para estas descripciones de señales de reloj.


     -- clk = '0' AND clk'event 
     falling_edge(clk)
     -- clk = '1' AND clk'event
     rising_edge(clk)

  • Decripción de registros. Son como latches, pero la salida se activa en uno de los flancos.

     PROCESS (clk, rst)
     BEGIN
       IF rst = '1' THEN
         a <= '0'
       ELSIF clk = '1' AND clk'event THEN
         a <= b;
       END IF;
     END PROCESS;

Máquinas de estados

editar

Lo más común a la hora de diseñar un circuito, es realizar su descripción mediante una máquina de estados. Una maquina de estados se compone de dos partes, una que calcula el siguiente estado dependiendo de las entradas y del estado actual, y otra que calcula la salida.

Existen dos tipos de máquinas de estados, una las de Mealy, que son muy generales y su salida depende del estado actual y las entradas, y la otra las de Moore, que son un subconjunto de las anteriores, ya que la salida sólo depende del estado actual.

A continuación se muestra la elaboración de una máquina de estados síncrona.


     ENTITY maq_est IS
  
       PORT (
         clk : IN  std_logic;
         rst : IN  std_logic;
         a   : IN  std_logic_vector(3 downto 0);
         b   : IN  std_logic;
         c   : OUT std_logic_vector(3 downto 0));

     END maq_est;

     ARCHITECTURE syn OF maq_est IS
       TYPE Type_state IS (stIDLE, stWAIT, stOPER);
       SIGNAL state, next_state : Type_state;
     BEGIN  -- syn

     pSeq: PROCESS (clk, rst)
     BEGIN  -- process pSeq
       IF rst = '1' THEN                   
         state <= stIDLE;
       ELSIF clk'event AND clk = '1' THEN  
         state <= next_state;
       END IF;
     END PROCESS pSeq;

     pCom: PROCESS (state, a, b)
     BEGIN  -- process pCom
       next_state <= state;

       c <= (OTHERS => '0');

       CASE state IS
         WHEN stIDLE =>
           IF b = '1' AND a = "1111" THEN
             next_state <= stOPER;
           ELSIF b = '1' THEN
             next_state <= stWAIT;
           END IF;

         WHEN stWAIT =>
           IF a = "1111" THEN
             next_state <= stOPER;
           END IF;

         WHEN stOPER =>
           c <= "1010";
           IF b = '0' THEN
             next_state <= stIDLE;
           END IF;
        
          WHEN OTHERS => null;
        END CASE;
      END PROCESS pCom;

    END syn;

Lógica programable

editar

Qué es un PLD (Dispositivo de Lógica Programable)

Un dispositivo lógico programable es un circuito integrado, formado por una matriz de puertas lógicas y flip-flops, que proporcionan una solucion al diseño de forma análogas, a las soluciones de suma de productos, productos de sumas y multiplexores. La estructura básica de una PLD permite realizar cualquier tipo de circuito conbinacional basándose en una matriz formada por puertas AND, seguida de una matriz de puertas OR. Tres son los tipos más estendidos de PLD's, la PROM, PLA, y la PAL.

• PROM (Programmable Read Only Memory): Este tipo de dispositivo se basa en la utilización de una matriz AND fija, seguida de una matriz OR programable. La matriz programable esta formada por líneas distribuidas en filas y columnas en las cuales los puntos de cruce quedaran fijos por unos diodos en serie con unos fusibles que serán los encargados de aislar las uniones donde no se requiera la funcion lógica. La fase de programación se realiza haciendo circular una corriente capaz de fundir el fusible en aquellas uniones donde no se desee continuidad. Por otra parte, para cada combinacion de las señales de entrada, el codificador activa una única fila y a su vez activa aquella columna a las que esta todavía unida a travéz del diodo.

• PLA (Programmable Logic Array): Parecido en la dispositivo a la PROM, difiere de esta, en que aquí en la PLD , ambas matrices, la de puertas And, así como la de puertas Or es programable, por lo que nos vemos habilitados a incrementar el número de entradas disponibles, sin aumentar el tamaño de la matriz. Esta estructura permite una mejor utilización de los recursos disponibles en el circuito integrado, de tal forma que se genera el mínimo numero de términos necesarios para generar una función lógica .

• PAL (Programmable array Logic): Una PAL es diferente de una PROM a causa de que tiene una red Y programable y una red O fija. Con un programador Prom podemos obtener los productos fundamentales deseados quemando los eslabones y luego conseguir la suma lógica de dichos productos mediante las conexiones fijas de salida.

• FPGA (Field Programmable Gate Array): Una FPGA es la ultima tecnologia de dispositivos programables. Se puede reprogramar y las ultimas veriones lo permiten de forma dinamica. Implementan modulos programables, memorias, flip-flops e interconexiones. Lo que permite la mayor flexibilidad en este tipo de despositivos. Se suele utilizar para equipos que se puedan reprogramar y como dispositivos para realizar los TEST de equipos que parasar a fabricarse en ASICs.

← Apéndices Síntesis Apéndices/Instalación y uso de GHDL →