Ejemplo de síntesis: ALU

Una buena técnica para síntesis de sistemas digitales es la reutilización de las funciones más costosas en área, siempre que se utilicen de a una por vez. Por ejemplo el diseño de una UAL (Unidad Aritmético-Lógica) cuyas entradas son 2 parámetros (A y B), el código de operación (OP), y el acarreo de entrada (CI). Esta unidad realiza 4 operaciones: A -CI, A +CI, A +B +CI, y A -B -CI.
 
Se presentan dos implementaciones basadas en un proceso denominado calculo, y se construye con sentencias if y case. Se debe notar que las variables temp1, temp2 y result son de n+1 bits para permitir definir el valor de acarreo de salida. La señal de salida se denomina SAL.

 
architecture PRIMERA of UAL is
begin
    calculo : process (a, b,ci, op)
        begin
        case op is
            when "00" => --- A - CI
                    temp1 := ‘0’ & unsigned(A);
                    if (ci = ‘1’) then result := temp1 - 1;
                                    else result := temp1; end if;
            when "01" => --- A + CI
                    temp1 := ‘0’ & unsigned(A);
                    if (ci = ‘1’) then result := temp1 + 1;
                                      else result := temp1; end if;
            when "10" => --- A - B - CI
                    temp1 := ‘0’ & unsigned(A);
                    temp2 := ‘0’ & unsigned(B);
                    if (ci = ‘1’) then result := temp1 - temp2 -1;
                                     else result := temp1 - temp2; end if;
            when "11" => --- A + B + CI
                    temp1 := ‘0’ & unsigned(A);
                    temp2 := ‘0’ & unsigned(B);
                    if (ci = ‘1’) then result := temp1 + temp2 +1;
                                     else result := temp1 + temp2; end if;
            end case;
            sal <= result(n -1 downto 0);
        end process;
end PRIMERA
 
Ambas especificaciones realizan las mismas operaciones, la diferencia de estilo de codificación VHDL hace que la síntesis de la SEGUNDA sea el 60% del tamaño de la PRIMERA. Esto se produce, debido a que la sintesis de la PRIMERA genera 2 sumadores y 2 restadores, mientras que la SEGUNDA se realiza utilizando solo un restador y un sumador.
 
architecture SEGUNDA of UAL is
begin
    calculo : process (a, b,ci, op)
        begin
        if op(0) = ‘1’ then --- Operaciones SUMA
            case op(1) is
                when ‘0’ =>
                    temp1 := ‘0’ & unsigned(A);
                    temp2 := ‘0’ & zero;
                when ‘1’ =>
                    temp1 := ‘0’ & unsigned(A);
                    temp2 := ‘0’ & unsigned(B);
            end case;
            result := temp1 + temp2 + ci;
        else --- Operaciones RESTA
            case op(1) is
                when ‘0’ =>
                    temp1 := ‘0’ & unsigned(A);
                    temp2 := ‘0’ & zero;
                when ‘1’ =>
                    temp1 := ‘0’ & unsigned(A);
                    temp2 := ‘0’ & unsigned(B);
            end case;
            result := temp1 - temp2 - ci;
        end if;
        sal <= result(n -1 downto 0);
    end process;
end SEGUNDA
 



Rerencia: Chang K. C., "Digital Design and Modeling with VHDL and Synthesis", IEEE Society Press, los Alamitos, CA, USA. 1997.