Você está na página 1de 6

Grado en Ingeniera de Tecnologas de Telecomunicacin

3er Curso

Sistemas Electrnicos Digitales

PRACTICA n 8
Diseo de subsistemas aritmticos. Sntesis sobre dispositivos
FPGA. Sntesis estructural a partir de la descripcin VHDL a
nivel RTL de la estructura. Sntesis a partir de la descripcin
RTL del algoritmo
Objetivos:
Descripcin y sntesis de subsistemas aritmticos mediante VHDL.
Diseo combinacional. Cdigo VHDL a nivel RT para generacin
estructural. Realizacin sobre FPGA. Subsistemas aritmticos
secuenciales. Cdigo VHDL a nivel RT para sntesis del algoritmo de
cmputo e implementacin mediante un procesador dedicado FPGA.
Herramientas CAD: Quartus II.
Instrumentacin: --.
Material fungible o de laboratorio: --.
Parte 1: Diseo y sntesis de un multiplicador combinacional para dos nmeros sin signo utilizando
una descripcin VHDL. Uso de la sentencia VHDL generate y sntesis sobre un dispositivo
FPGA utilizando su lgica interna estndar.

1 de 6

Grado en Ingeniera de Tecnologas de Telecomunicacin

3er Curso

Sistemas Electrnicos Digitales


Figura 1
El esquema de la figura 1 muestra una posible estructura para un multiplicador para dos nmeros
sin signo de M bits. La estructura utiliza nicamente full-adders y puertas AND. Se pretende
realizar una descripcin VHDL a nivel RT que represente la estructura circuital de figura 1. Para
ello se emplear la sentencia generate que simplifica la descripcin de las interconexiones entre los
elementos del circuito, al tiempo que permite generalizar el diseo para diferentes tamaos de los
nmeros a multiplicar.
Una posible descripcin del multiplicador se muestra en la figura 2.
library ieee;
use ieee.std_logic_1164.all;
entity Generate_multipl is
generic (M: integer:= 8);
port (
a, b : in std_logic_vector(M-1 downto 0);
p : out std_logic_vector(2*M-1 downto 0)
);
end Generate_multipl;
architecture simple of Generate_multipl is
type matrix_adders is array (0 to 2*M-2) of std_logic_vector(M downto 0);
signal a_por_b : matrix_adders;
signal s : matrix_adders;
signal c : matrix_adders;
signal c2 : std_logic_vector(2*M-1 downto M);

begin

gen_ands1: for k in 0 to M-1 generate
g1: for i in 0 to k generate
a_por_b(k)(i) <= B(i) and A(k-i);
end generate;
end generate;


























gen_ands2: for k in M to 2*M-2 generate


g2: for i in k-(M-1) to 2*M-2-(M-1) generate 2*M-2-(M-1) = M-1
a_por_b(k)(i) <= B(i) and A(k-i);
end generate;
end generate;
p(0) <= a_por_b(0)(0);
gen_adders: for k in 1 to 2*M-2 generate
g3: process(a_por_b(k))
begin
if (k < M) then
s(k)(0) <= a_por_b(k)(0);
c(k)(1) <= '0';
for i in 1 to k loop
c(k+1)(i+1) <= (a_por_b(k)(i) and s(k)(i-1)) or (a_por_b(k)(i) and c(k)(i)) or (c(k)(i) and s(k)(i-1));
s(k)(i) <= a_por_b(k)(i) xor s(k)(i-1) xor c(k)(i);
p(k) <= s(k)(i);
end loop;
else
s(k)(k-(M-1)) <= a_por_b(k)(k-(M-1));
c2(M) <= '0';
for i in (k-(M-1))+1 to 2*M-2-(M-1) + 1 loop
- 2*M-2-(M-1) + 1 = M-1 +1
if (i < 2*M-2-(M-1)+1) then
- 2*M-2-(M-1)+1 = M
c(k+1)(i+1) <= (a_por_b(k)(i) and s(k)(i-1)) or (a_por_b(k)(i) and c(k)(i)) or (c(k)(i) and s(k)(i-1));
s(k)(i) <= a_por_b(k)(i) xor s(k)(i-1) xor c(k)(i);
else
c2(k+1) <= (c2(k) and s(k)(i-1)) or (c2(k) and c(k)(i)) or (c(k)(i) and s(k)(i-1));
2 de 6

Grado en Ingeniera de Tecnologas de Telecomunicacin

3er Curso

Sistemas Electrnicos Digitales








s(k)(i) <= s(k)(i-1) xor c(k)(i) xor c2(k);


end if;
p(k) <= s(k)(i);
end loop;

end if;
p(2*M-1) <= c2(2*M-1);
end process;
end generate;
end simple;

Figura 2
a) Utilizando Quartus II, sintetizar el multiplicador a partir de la descripcin VHDL de la figura
2.

Seleccionar el dispositivo FPGA Cyclone II EP2C35F672C6.
Compilar el diseo. Comprobar que el multiplicador en este caso se ha sintetizado utilizando
exclusivamente la circuitera de propsito general (ALUTs).
Para la compilacin y sntesis, seleccionar el chip FPGA Cyclone II EP2C35F672C6:

Assignments -> Settings: Settings Generador_multipl: Category -> Device: Family

Cyclone II: Target Device Specific Device selected in Available devices list.

Show in Available devices list Fastest. Available devices: EP2C35F672C6.
b) Simular el multiplicador sintetizado. Construir un fichero de formas de onda,
Generador_multipl.vwf. Comprobar que el multiplicador opera correctamente.
c) Generar automticamente un testbench, Generador_multipl.vht, para el multiplicador
sintetizado a partir de las seales de prueba aplicadas mediante el fichero de formas de onda.
Analizar el fichero Generador_multipl.vht.
Para generar el testbench:

Con la ventana de formas de onda activa: File -> Export: Seleccionar un nombre para

el fichero. Export.
Parte 2: Diseo de un multiplicador secuencial (basado en recodificacin). Sntesis sobre un
dispositivo FPGA de un Multiplicador de Booth Modificado para nmeros con signo (en
complemento a 2), utilizando una descripcin VHDL a nivel RT del algoritmo.
Se pretende implementar sobre un dispositivo FPGA un multiplicador de Booth modificado. En
lugar de utilizar una descripcin de tipo estructural basada en la descripcin de una Unidad de
Control y una Ruta de Datos y sus interconexiones, se pretende emplear una descripcin de tipo RT
del Algoritmo de Booth Modificado. El procedimiento requiere una serie de pasos cuyo nmero
depende del nmero de bits de los nmeros a multiplicar. Para la implementacin se pretende
describir mediante VHDL un paso del algoritmo, cuya ejecucin se realizar en un ciclo de reloj. La
ejecucin del paso se repetir tantas veces (tantos ciclos de reloj) como sea necesario hasta finalizar
el proceso de cmputo.
En la figura 3 se muestra una posible descripcin VHDL de un mdulo para la implementacin del
multiplicador. La descripcin de la entidad principal utiliza (a modo de ejemplo) el package de la
figura 4, que contiene algunas sencillas functions.
3 de 6

Grado en Ingeniera de Tecnologas de Telecomunicacin

3er Curso

Sistemas Electrnicos Digitales


El mdulo dispone de una seal new_mult que indica que se ha de iniciar una nueva multiplicacin
con los nmeros que se encuentren en ese momento en las entradas. Hasta que no se indique el
comienzo de una nueva multiplicacin, cualquier cambio en las entradas ser ignorado. Una vez
que el resultado obtenido sea el definitivo, si han transcurrido los ciclos necesarios, este
permanecer en las salidas hasta la siguiente activacin de la seal new_mult. Dispone de una
salida, result_valid que toma nivel alto una vez que se ha alcanzado el resultado final, volviendo a
nivel bajo cuando se vuelve a activar la seal new_mult.
a) Utilizando Quartus II, sintetizar el multiplicador a partir de la descripcin VHDL de las
figuras 2 y 3.
Seleccionar el dispositivo FPGA Cyclone II EP2C35F672C6. Compilar el diseo. Simular el
multiplicador sintetizado. Utilizar el fichero de formas de onda Alg_Booth_Mod.vwf.
Comprobar que el multiplicador opera correctamente. Se debe de tener en cuenta que el
nmero de ciclos de reloj requeridos para obtener el producto depende de tamao del
multiplicador. En la descripcin de la figura 3 se considera el mismo tamao para el
multiplicando y el multiplicador.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.paquete_Alg_Booth_Mod.all;
entity Alg_Booth_Mod is
generic (m : integer := 7);
port

(

clk : in std_logic;

new_mult
: in std_logic;

multiplicando : in std_logic_vector(m-1 downto 0);
multiplicador : in std_logic_vector(m-1 downto 0);

resultado : out std_logic_vector(2*m-1 downto 0);

result_valid : out std_logic

);
end Alg_Booth_Mod;

el nmero mximo de operaciones es (2*((m+1)/2)+1)/2

architecture algor of Alg_Booth_Mod is


signal result_prev : signed(2*m-1 downto 0);
signal paso : integer range 0 to (2*((m+1)/2)+1)/2;
begin
process (new_mult,clk)
variable mult1 : signed(2*((m+1)/2)-1 downto 0);
Multiplicando extendido 1 bit a la izda. (si es necesario)
variable c2mult1 : signed(2*((m+1)/2)-1 downto 0);
C2 del multiplicando extendido 1 bit a la izda. (si es necesario)
variable mult2 : signed(2*((m+1)/2)+11 downto 0);
Multiplicador ext. 1 bit a la izda. (si necesario) y 1 bit a la dcha.
variable code : unsigned(2 downto 0);
Cdigo de operacin
variable ext_2m : integer := 2*m-(2*((m+1)/2));
para extensin a 2*m (tamao del producto)
variable m1 : signed(2*m-1 downto 0);
Multiplicando extendido al tamao del producto
variable cm1 : signed(2*m-1 downto 0);
C2 del Multiplicando extendido al tamao del producto
variable max_pasos : integer := (2*((m+1)/2)+1)/2;
Mximo nmero de operaciones
variable ant_mas : signed(2*m-1 downto 0);
begin
if (clk'event and clk = '1') then
if (new_mult = '1') then
result_valid <= '0';

mult1(m-1 downto 0) := signed(multiplicando(m-1 downto 0));
mult1(2*((m+1)/2)-1) := multiplicando(m-1);

m1 := signed_a_signed_ext(mult1,ext_2m);



c2mult1(2*((m+1)/2)-1 downto 0) := twos_complement(mult1);

cm1 := signed_a_signed_ext(c2mult1,ext_2m);




mult2(m-1 downto 0) := signed(multiplicador(m-1 downto 0));
4 de 6

Grado en Ingeniera de Tecnologas de Telecomunicacin

3er Curso

Sistemas Electrnicos Digitales



mult2(2*((m+1)/2)-1) := multiplicador(m-1);
mult2(2*((m+1)/2)) := multiplicador(m-1); Extensin de 1 bit de signo a la izda. (en su caso)
mult2 := mult2 sll 1;


Aadido un '0' a la dcha.




result_prev <= (others => '0');

resultado <= (others => '0');

paso <= 0;

else

if (paso < max_pasos) then

if (paso = max_pasos-1) then

result_valid <= '1';

end if;


code(2 downto 0) := recodifica(unsigned(mult2(2 downto 0)));

mult2 := mult2 srl 2;

case code is

when "000" => ant_mas := result_prev;


00

resultado <= std_logic_vector(ant_mas);

when "001" => ant_mas := result_prev + (m1 sll 2*paso);
01

resultado <= std_logic_vector(ant_mas);

when "010" => ant_mas := result_prev + ((m1 sll 1) sll 2*paso);
02

resultado <= std_logic_vector(ant_mas);

when "011" => ant_mas := result_prev + ((cm1 sll 1) sll 2*paso); -02

resultado <= std_logic_vector(ant_mas);

when others => ant_mas := result_prev + (cm1 sll 2*paso);
-01

resultado <= std_logic_vector(ant_mas);

end case;

result_prev <= ant_mas;

paso <= paso+1;

end if;

end if;

end if;
end process;
end algor;

Figura 3
b) Repetir el apartado anterior modificando el tamao del multiplicado y del multiplicador de
impar (por ej. m=9) al subsiguiente par (por ej. m=10). Comprobar que el nmero de ciclos
requerido para obtener el producto es el esperado. Obtener la mxima frecuencia de
operacin.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
package paquete_Alg_Booth_Mod is
function signed_a_signed_ext (aux: signed; ext: integer) return signed;
function twos_complement (aux: signed) return signed;
function recodifica (aux: unsigned) return unsigned;
end paquete_Alg_Booth_Mod;
package body paquete_Alg_Booth_Mod is

function signed_a_signed_ext (aux: signed; ext: integer) return signed is
variable sig_sig : signed (aux'length+ext-1 downto 0);
begin
sig_sig(aux'length+ext-1 downto aux'length) := (others => aux(aux'length-1));
sig_sig(aux'length-1 downto 0) := aux;
return sig_sig;
end signed_a_signed_ext;

function twos_complement (aux: signed) return signed is
variable comp : signed (aux'length+11 downto 0);
variable compl : std_logic := '0';
begin
for j in 0 to aux'length-1 loop
if (compl = '0') then
5 de 6

Grado en Ingeniera de Tecnologas de Telecomunicacin

3er Curso

Sistemas Electrnicos Digitales


comp(j) := aux(j);
if (aux(j) = '1') then
compl := '1';
end if;
else
comp(j) := not(aux(j));
end if;
end loop;
return comp(aux'length-1 downto 0);
end twos_complement;

function recodifica (aux: unsigned) return unsigned is
variable recode : unsigned (2 downto 0);
begin
if (aux = "000") then
recode(2 downto 0) := "000";

00
elsif (aux = "001") then
recode(2 downto 0) := "001";

01
elsif (aux = "010") then
recode(2 downto 0) := "001";

01
elsif (aux = "011") then
recode(2 downto 0) := "010";

02
elsif (aux = "100") then
recode(2 downto 0) := "011";

-02
elsif (aux = "101") then
recode(2 downto 0) := "100";

-01
elsif (aux = "110") then
recode(2 downto 0) := "100";

-01
else
recode(2 downto 0) := "000";

00
end if;
return recode(2 downto 0);
end recodifica;

end paquete_Alg_Booth_Mod;

Figura 4
Parte 3: Sntesis sobre un dispositivo FPGA de un Multiplicador secuencial para nmeros con
signo, que emplee el procedimiento de cmputo del algoritmo de Booth Modificado, pero
que utilice un solo ciclo para la operacin de multiplicacin completa.
a) Mustrese una descripcin VHDL a nivel RT del algoritmo con las caractersticas citadas.
Multiplicando y multiplicador deben de tener el mismo nmero de bits. Utilizando Quartus
II, sintetizar el bloque diseado. Para la compilacin y sntesis, seleccinese el chip FPGA
Cyclone II EP2C35F672C6.
b) Simular el multiplicador sintetizado mediante Quartus II. Utilcese el fichero de formas de
onda Alg_Booth_Mod_un_ciclo.vwf. Verificar que el multiplicador opera correctamente y
que nicamente utiliza un ciclo de reloj para el cmputo. Obtener la mxima frecuencia de
operacin.

6 de 6

Você também pode gostar