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