Documentos de Académico
Documentos de Profesional
Documentos de Cultura
VHDLsintesis
VHDLsintesis
Síntesis: Definición
Proceso de traducción de un sistema descrito mediante una herramienta de captura de
diseño, y de optimización para la generación de un formato intermedio entre la
herramienta de captura y la de implementación hardware
Conversión del diseño a un nivel de estructuras capaces de ser
acomodadas en el dispositivo destino
Justificación:
Portabilidad Menor tiempo de diseño
Trabajo en grupo Diferentes descripciones (RTL, Comp., Estruct.)
PROBLEMA: SOLUCIÓN:
Software con características Descripciones “universales”
particulares
Metodología de diseño:
R e g i s tr o s R e g i s tr o s R e g i s tr o s
Lógica Lógica
combinacional combinacional Salidas
Entradas
Se admite el uso de cualquier operador predefinido (and, nand, or, nor, not, xor, xnor)
Uso de if..then..else en procesos: Agrupar en una sola sentencia todas las condiciones
siempre que sea posible
Number of ports : 10
if c="00" then d <= a; e <= b; Number of nets : 28
elsif b="00" then e <= a; d <= b; Number of instances : 22
else
e <= (others =>'0'); Total accumulated area :
d <= (others =>'0'); Number of IBUF : 6
end if; Number of OBUF : 4
Number of gates : 14
Number of ports : 10
Number of nets : 41
if c="00" then d <= a; e <= b; end if; Number of instances : 35
if b="00" then e <= a; d <= b; end if;
if c/="00" and b/="00" then Total accumulated area :
e <= (others =>'0'); Number of IBUF : 6
d <= (others =>'0'); Number of Latches : 2
end if; Number of OBUF : 4
Number of gates : 24
Es necesario conocer el tipo de descripción concreto a realizar para que se reconozca un elemento
secuencial
Es obligado el uso de procesos (excepto latches), y recomendable que incluyan lista de sensibilidad
entity latch is
Inferencia de Latches port (a, b: in std_logic;
d: out std_logic);
end latch;
architecture l_a of latch is
entity latch is begin
port (a, b: in std_logic; d <= a when b=’1’;
d: out std_logic); end l_a;
end latch;
architecture l_a of latch is
begin
process (a,b)
begin
if b=’1’ then d <= a; end if;
end process;
end l_a;
12 de septiembre de 2023 TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Lógica Secuencial
8.3 Síntesis de Lógica Secuencial: Inferencia de registros activos por flanco
Los dispositivos lógicos incluyen registros activos por flanco (generalmente de tipo D)
Existen varias formas de especificar la llegada de un flanco:
rising_edge(reloj)
if reloj’event and reloj=‘1’
Descripción genérica
if reloj’event and reloj=‘1’ and reloj’last_value=‘0’
entity registro is
port (d, reset, preset, reloj: in std_logic;
q: out std_logic);
end registro;
La sentencia if del reloj no debe estar anidada, se pueden incluir más if dentro de ella
Sólo se puede incluir una evaluación de flanco por proceso: varios relojes varios procesos
Aconsejable emplear módulos del fabricante (generadores automáticos, módulos IP, ...)
Puertas triestado
Necesaria la utilización del tipo std_logic ó std_ulogic que define el estado 'Z'
Basta con incluir una condición en la que uno de los resultados ('True' o 'False') deja la salida en alta
impedancia
entity hab is
port( entrada1,
architecture hab_b
entrada2,
of hab is
oe1, oe2 : in std_logic;
begin salida : out std_logic );
end;
process (entrada, oe) begin
architecture
if (oe = ’1’)hab_a
then of
salida
hab is<= entrada;
begin salida <= ’Z’;
else
salida
end if;<= entrada1 when oe1 = '1' else 'Z' ;
salida
end process;
<= entrada2 when oe2 = '1' else 'Z' ;
end hab_b;
hab_a;
12 de septiembre de 2023 TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Módulos Específicos
8.4 Módulos funcionales específicos: Puertos bidireccionales
entity bidir is
port ( bid : inout std_logic ;
a, b, c, oe : in std_logic;
salida : out std_logic);
end bidir ;
architecture bidir_a of bidir is
signal interna1, interna2 : std_logic ;
begin
bid <= interna1 when oe = '1' else 'Z';
interna2 <= bid;
Máquinas de estados
Es necesaria una descripción específica con definición de un tipo enumerado
Hay que hacer una división de la descripción en dos procesos distintos:
1. Cambio síncrono de estado
2. Evaluación de condiciones para dirigirse a un estado
12 de septiembre de 2023 TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Módulos Específicos
8.4 entity
Módulos funcionales específicos: bebidade
Máquinas isestados
port (reloj, reset, veinte, diez : in std_logic ;
when B => preparada, servir, devolucion, when F => out std_logic);
moneda:
Ejemplo: servir end<=bebida
'1'; ; moneda <= '1';
estado_sig
Preparado <= A; bebida_a of bebida is
architecture Monedas if (veinte = '1') then
Preparado Monedas when C =>
type estados is (A, B, C, D, F, I); estado_sig <= I;
Dispensador moneda <= '1';
de bebidas. 40c€.
signal estado_actual, estado_sig : estados ;
Dispensador de bebidas. 40c€.
Inserción
elsif (diez = '1') then
Sólo admite if (veinte
monedas
Inserción
begin de=10c€
'1') then
y 20c€ Monedas
Sólo admite monedas de 10c€ y 20c€ Monedas estado_sig <= B;
estado_sig
cambiaest: <= process
F; (reloj, reset) is begin
elsif (diezBebida
= '1') Retorno
then else
Bebida Retorno
servida if (reset
Monedas='1') then estado_actual <= A;
estado_sig <= F;
servida Monedas
estado_sig <=elsif D; (rising_edge(reloj)) then
else end if;
estado_actual <= estado_sig;
estado_sig <=end C; if;
end if; end process cambiaest; when I =>
asignaest: process (veinte, diez, estado_actual) devolucion <=is'1';
begin
when D => preparada <= '0'; servir <= '1';
moneda <= '1'; servir <= '0'; estado_sig <= A;
if (veinte = '1') then
devolucion <= '0'; end case;
estado_sig <=moneda B; <= '0'; end process asignaest;
elsif (diez = '1') case then
estado_actual is
estado_sig <= F; end bebida_a;
when A =>
else preparada <= '1';
estado_sig <= D; if (veinte = '1') then
end if; estado_sig <= D;
type estados is (A, B, C, D, F, I,elsif V, W); (diez = '1') then
signal estado_actual, estado_sig : estados ; estado_sig <= C;
else
attribute ENUM_ENCODING : STRING; estado_sig <= A;
attribute ENUM_ENCODING of estadosend if; is ”000 001 010 011 100 101 110 111”;
: type
12 de septiembre de 2023 TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Módulos Específicos
8.4 Módulos funcionales específicos: Memorias
package ROMS is Memoria ROM
Si el tamaño de la memoria es reducido, ésta constant ANCHO_ROM: INTEGER := 5;
puede implementarse mediante recursos subtype ROM_WORD is BIT_VECTOR (1 to ANCHO_ROM);
lógicos comunes (funciones lógicas y registros) subtype ROM_RANGE is INTEGER range 0 to 7;
type ROM_TABLE is array (0 to 7) of ROM_WORD;
constant ROM : ROM_TABLE := (
("10101"), -- contenido de la ROM
Habitualmente, existen en hardware ("10000"),
estructuras regulares que las implementan y ("11101"),
donde se sintetizan si la descripción VHDL es ("11111"),
("10000"),
apropiada ("10101"),
("00011"),
("11000"));
end ROMS;
use work.ROMS.all;
entity ROM5x8 is
port( ADDR: in ROM_RANGE;
DATA: out ROM_WORD);
end ROM5x8;
u1(n) Filtro
adaptativo
u0(n)
12 de septiembre de 2023 TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Aplicación
8.5 Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
y ( n ) d ( n ) e( n )
w (n 1) w u (n) y (n)
i i i
Siendo la constante de adaptación :
2 1 M 1 2
E (u ui
2
0 M= núm etapas del filtro (M=2) )
M E (u )
2
M i 0
d(n)
Filtro
u0(n) LMS
y(n)
hmul
FSM
u1(n)
hsum
hres Fin
C1
Clock
C2
Clock Reset C4
Reset Hab_ext C5
Hab_ext fin
Propuesta:
0,1 0
0 w0
u0
+
2 MUX 1
1 MUX w1
*
u1 DMUX
C2 2
-
C1
0 hmult C5 y
w0 Accumulador
hsum
1
d(n)
w1 MUX
0
2
Acc hrest
y 1
w0 MUX
C2 Multiplicador 2
w1
C4 Sumador-Restador
Características: 1. Pipeline: Son necesarias cinco etapas para obtener todos los resultados
2. Existen periodos de latencia, o bien la señal de reloj es más rápida que
el periodo de muestreo de las señales de entrada
3. Una máquina de estados debe controlar el acceso a las unidades de
cálculo
12 de septiembre de 2023 TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Aplicación
8.5 Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
package LMS_pkg is
constant beta_desp : integer:=9; -- 2**beta_desp=beta real
constant external_length : integer:=12;
constant internal_length : integer:=(2*external_length);
subtype external_vector is signed ((external_length-1) downto 0);
subtype internal_vector is signed ((internal_length-1) downto 0);
end LMS_pkg;
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
use WORK.LMS_pkg4.all;
entity LMS6_acc is
port (mult_result : in external_vector;
reset,reloj : in std_logic;
acc_salida : out external_vector);
end LMS6_acc;
Módulo Sumador-restador: Dependiendo del control suma dos valores, o suma y resta
suma_y_resta : process(reset,reloj)
variable suma1,salida,suma_def,weight1s,weight2s : external_vector;
variable resta1 : external_vector;
begin
if reset='0' then -- inicializacion de pesos y puesta a cero
salida_re <= (others => '0'); salida_def <= (others => '0');
weight1 <= (others => '0'); weight1s := (others => '0');
weight2 <= (others => '0'); weight2s := (others => '0');
elsif reloj'event and reloj='1' then
if hsum='1' then
if control4 = "00" then suma1 := weight1s;
elsif control4 = "01" then suma1 := weight2s;
elsif (control4 = "10") or (control4 = "11") then suma1 := acc1;
end if;
suma_def := suma1 + suma2;
if control5 = "00" then weight1s := suma_def;
weight1 <= suma_def;
elsif control5 = "01" then weight2s := suma_def;
weight2 <= suma_def;
elsif (control5 = "10") or (control5 = "11") then resta1 := suma_def;
if hrest = '1' then
salida := in_sig - resta1; salida_def <= salida; salida_re <= salida;
end if;
end if;
end if; end if; end process;
12 de septiembre de 2023 TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
8.5
Aplicación
Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
Módulo FSM: Gestionaisel control desde activación de Hab_ext hasta la salida fin
entity LMS6_estados
port (reloj,reset,extern_hab : in std_logic;
hmul,hsum,hres,control1,fin : out std_logic;
control2,control4,control5 : out std_logic_vector (1 downto 0));
end LMS6_estados;
architecture LMS6_estadosarchi of LMS6_estados is
type estados_lms4 is (reset_estado,espera,ini_calc,genera_salida,
peso1_mult,actualiza1_mult2,peso2_sum,peso2_calc_y_fin);
signal estado_actual,estado_sig : estados_lms4;
begin
cambia_estado : process(reloj,reset) begin
if reset = '0' then estado_actual <= reset_estado;
elsif reloj'event and reloj = '1' then
estado_actual <= estado_sig;
end if;
end process;
maquina_estados : process(estado_actual,extern_hab) begin
control1 <= '0'; -- se asignan valores por defecto
control2 <= "00"; control4 <= "10";
control5 <= "10"; hmul <= '0';
hsum <= '0'; hres <= '0'; fin <= '0';
case estado_actual is
when reset_estado =>
control1 <= '0'; control2 <= "00"; control4 <= "10";
control5 <= "10"; hmul <= '0'; hsum <= '0';
hres <= '0'; fin <= '0';
if extern_hab = '1' then estado_sig <= espera;
else estado_sig <= ini_calc; end if;
12 de septiembre de 2023 TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Aplicación
8.5 Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
entity LMS6 is
port (in_sig,sen_in,cos_in : in external_vector;
hab_ext,clock,reset : in std_logic;
lms_out : out external_vector;
ending : out std_logic);
end LMS6;
component LMS6_mult
port (sen_in,cos_in,weight1,weight2,salida_ext : in external_vector;
reset,reloj,hmul,control1 : in std_logic;
control2 : in std_logic_vector (1 downto 0);
mul_salida : out external_vector);
end component;
component LMS6_acc
port ( mult_result : in external_vector;
reset,reloj : in std_logic;
acc_salida : out external_vector);
end component;
Módulo :deprocess
NEWDATA prueba: Lee datos de fichero, escribe resultado en fichero y genera Reloj y Reset
begin
habi_ext <= '0';
wait for 215 ns;
habi_ext <= '1';
wait for 615 ns;
end process;
MAIN : process
variable noise,sinus,cosinus : integer;
variable filtered : integer;
variable linea1,linea2: LINE;
begin
while not ENDFILE(file_noise) loop
READLINE(file_noise,linea1);
READ(linea1,noise);
READ(linea1,sinus);
READ(linea1,cosinus);
input_signal <= to_signed(noise,external_length);
sen_signal <= to_signed(sinus,external_length);
cos_signal <= to_signed(cosinus,external_length);
wait until fin_cal'event and fin_cal='1';
filtered := to_integer(out_signal);
WRITE(linea2,filtered);
WRITELINE(file_filtered,linea2);
end loop;
wait;
end process;
12 de septiembre de 2023 TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Aplicación
8.5 Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
Design statistics:
Minimum period: 102.065ns (Maximum frequency: 9.798MHz)
Maximum net delay: 28.538ns