Vhdl para síntesis Alfredo Rosado Muñoz Universidad de Valencia Ingeniería Electrónica Diseño de Circuitos y Sistemas Electrónicos.
Download ReportTranscript Vhdl para síntesis Alfredo Rosado Muñoz Universidad de Valencia Ingeniería Electrónica Diseño de Circuitos y Sistemas Electrónicos.
Slide 1
Vhdl para síntesis
Alfredo Rosado Muñoz
Universidad de Valencia
Ingeniería Electrónica
Diseño de Circuitos y Sistemas Electrónicos
Slide 2
Objetivos
Realizar descripciones VHDL óptimas para implementación hardware
Saber utilizar las construcciones destinadas a hardware específico
Reset, reloj, triestados, unidades funcionales, ...
Evitar el empleo de VHDL no sintetizable o poco eficiente
Pensar “hardware” a pesar de describir “software”
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
Trabajo en grupo
03 de noviembre de 2015
Menor tiempo de diseño
Diferentes descripciones (RTL, Comp., Estruct.)
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 3
Tema
TEMA 8. LENGUAJES DE DESCRIPCIÓN HARDWARE ORIENTADOS A
SÍNTESIS. (3 HORAS)
8.1
8.2
8.3
8.4
8.5
Herramientas de síntesis: metodología y modo de funcionamiento.
Síntesis de lógica combinacional
Síntesis de lógica secuencial: Inferencia de latches, inferencia de flip-flop.
Tipos de descripción específicos: Puertas triestado y puertos bidireccionales,
máquinas de estados, memorias.
Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz.
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 4
Metodología
8.1
Herramientas de síntesis: metodología y modo de funcionamiento
PROBLEMA:
Software con características particulares
SOLUCIÓN:
Descripciones “universales”
Metodología de diseño:
Recomendaciones IEEE
03 de noviembre de 2015
ieee.std_logic_1164.all
Tipos: std_logic, integer
ieee.numeric_std.all
signed, unsigned
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 5
Consideraciones
8.1
Herramientas de síntesis: metodología y modo de funcionamiento
Tener presente la estructura hardware a diseñar y el paralelismo de las descripciones
No emplear construcciones claramente no sintetizables: inicialización, “after”, ficheros, ...
Asignar tipos de datos de forma uniforme
No utilizar enteros en puertos I/O, en operaciones lógicas y de desplazamiento
Ciertos operadores aritméticos no son sintetizables: **, /, rem, mod
Evitar la generación indeseada de registros en descripciones combinacionales
Descomponer cualquier diseño en módulos combinacionales y secuenciales
R e g i s tr o s
R e g i s tr o s
Ló gica
com b inaciona l
L ó gica
co m b in a cion a l
R e g i s tr o s
S a lid as
E n tra das
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 6
Lógica Combinacional
8.2
Síntesis de Lógica Combinacional
No es necesario el uso de procesos
Se admite el uso de cualquier operador predefinido (and, nand, or, nor, not, xor, xnor)
Sentencias concurrentes a emplear:
When..else
architecture p_a of puerta is
begin
with c select
d <= a
when
b
when
"11" when
"00" when
"00" when
end p_a;
03 de noviembre de 2015
"00",
"01",
"10",
"11",
others;
entity
entitypuerta
puertais
is
port
port(a,
(a,b,
b,c:
c:in
instd_logic_vector
std_logic_vector(1
(1downto
downto0);
0);
d:
d:out
outstd_logic_vector
std_logic_vector(1
(1downto
downto0));
0));
end
endpuerta;
puerta;
architecture p_a of puerta is
architecture
begin
p_a of puerta is
begin d <= a when c="00" else
d <=
b when
a
c="01"
when c="00"
else else
"11"bwhenwhen
c="10"
c="01"
elseelse
"00""11"
whenwhen
a="11"
c="10"
elseelse
"01""00"
;
when a="11";
end
endp_a;
p_a;
With..select
Completar SIEMPRE
todas las condiciones
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 7
Lógica Combinacional
8.2
Síntesis de Lógica Combinacional
Uso de if..then..else en procesos:
if c="00" then d <= a; e <= b;
elsif b="00" then e <= a; d <= b;
else
e <= (others =>'0');
d <= (others =>'0');
end if;
if c="00" then d <= a; e <= b; end if;
if b="00" then e <= a; d <= b; end if;
if c/="00" and b/="00" then
e <= (others =>'0');
d <= (others =>'0');
end if;
Agrupar en una sola sentencia todas las
condiciones siempre que sea posible
Number of ports : 10
Number of nets : 28
Number of instances : 22
Total accumulated area :
Number of IBUF : 6
Number of OBUF : 4
Number of gates : 14
Number of ports : 10
Number of nets : 41
Number of instances : 35
Total accumulated area :
Number of IBUF : 6
Number of Latches : 2
Number of OBUF : 4
Number of gates : 24
NO incluir la señal de reloj en la lista de sensibilidad de un proceso combinacional
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 8
Lógica Secuencial
8.3
Síntesis de Lógica Secuencial
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
Diferencia entre variables y señales
Aconsejable incluir siempre un reset global que aplique un valor de inicialización
Inferencia de Latches
entity latch is
port (a, b: in std_logic;
d: out std_logic);
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;
03 de noviembre de 2015
entity latch is
port (a, b: in std_logic;
d: out std_logic);
end latch;
architecture l_a of latch is
begin
d <= a when b=’1’;
end l_a;
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 9
Lógica Secuencial
8.3
Síntesis de Lógica Secuencial: Inferencia de registros activos por flanco
Es el método más habitual de describir sistemas síncronos
Los dispositivos lógicos incluyen registros activos por flanco (generalmente de tipo D)
Existen varias formas de especificar la llegada de un flanco:
Descripción genérica
entity registro is
port (d, reset, preset, reloj: in std_logic;
q: out std_logic);
end registro;
rising_edge(reloj)
if reloj’event and reloj=‘1’
if reloj’event and reloj=‘1’ and reloj’last_value=‘0’
architecture r_a of registro is
begin
process (d, reset, preset, reloj)
begin
if reset = ’1’ then q <= ‘0’;
elsif preset = ‘1’ then q <= ‘1’;
elsif rising_edge(reloj) then q <= d;
end if;
end process;
end r_a;
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 10
Lógica Secuencial
8.3
Síntesis de Lógica Secuencial: Inferencia de registros activos por flanco
No emplear más condiciones else ó elsif en la misma sentencia
if..then..else después de la condición de evaluación del reloj
En la misma evaluación if del reloj no se deben comparar otras señales o variables
La sentencia if del reloj no puede estar dentro de un bucle
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
En comparaciones múltiples, emplear la sentencia case
No utilizar relojes derivados, alternativamente, emplear habilitación de reloj
r_derivado <= not a and (b or c);
process
(d,<=
reset,
r_derivado
relojpreset,
and notreloj,
a and r_derivado)
(b or c);
begin
process (d, reset, preset, r_derivado)
if reset = ’1’ then q <= ‘0’;
begin
elsif
preset
= ‘1’
then
q <=
‘1’;
if reset
= ’1’
then
q <=
‘0’;
elsif
elsifrising_edge(reloj)
preset = ‘1’ then then
q <= ‘1’;
if
r_derivado
=
‘1’
then
elsif rising_edge(r_derivado) then
<=d;
d;
qq<=
end
if;
end if;
end
if;
end process;
end
end process;
r_a;
end r_a;
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 11
Módulos Específicos
8.4
Módulos funcionales específicos
En sistemas complejos es necesaria una correcta partición del diseño (Top-Down)
Las descripciones de mayor nivel suelen ser estructurales (componentes y subprogramas)
Aconsejable emplear módulos del fabricante (generadores automáticos, módulos IP, ...)
Consultar documentación del software de síntesis Herramientas y atributos especiales
Módulos específicos usuales: Multiplicadores, RAM, ROM, UART, filtro FIR, interface PCI, ...
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;
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 12
Módulos Específicos
8.4
Módulos funcionales específicos: Puertos bidireccionales
Para puertos bidireccionales la descripción es similar a los triestado: Tipo inout
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;
interna1 <= (a and b) nor c;
salida <= (c xor interna2) when oe='0' else 'Z';
end bidir_a ;
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
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 13
Módulos Específicos
8.4
entity bebida
is de estados
Módulos funcionales específicos:
Máquinas
port (reloj, reset, veinte, diez : in std_logic ;
when B =>
when
F => out std_logic);
preparada, servir, devolucion,
moneda:
Ejemplo:
servir
'1'; ;
moneda <= '1';
end<=bebida
estado_sig
<= A; Mbebida_a
P re p a ra
d o architecture
onedas
of bebida is if (veinte = '1') then
P re p a ra d o
M o n e d a s when C =>
estado_sig <= I;
type estados is (A, B, C, D, F, I);
moneda
<=
D is p e n s a d
o r d esignal
beb
id a '1';
s . estado_actual,
40c€.
Inestado_sig
s e rc ió n
: estados
;
elsif (diez
= '1') then
D is p e n s a d o r d e b e b id a s . 4 0 c € .
In sif
e rc ióm
n (veinte
M onedas
S ó lo a d m
ite
o n e d a s d e=1 0'1')
c € y 2 then
0c€
begin
M onedas
estado_sig <= B;
S ó lo a d m ite m o n e d a s d e 1 0 c € y 2 0 c €
estado_sig
<= process
F;
cambiaest:
(reloj,
reset)
is
begin
else
R e to rn o
B e b id a
elsif (diez
= '1')
then
R e to rn o
B e b id a
M o n e d a s='1') then estado_actual <= A;
if
(reset
s e rvid a
estado_sig <= F;
M onedas
s e rvid a
estado_sig <=elsif
D; (rising_edge(reloj)) then
end if;
else
estado_actual <= estado_sig;
estado_sig <=end
C; if;
end if;
when I =>
end process cambiaest;
devolucion <=is'1';
asignaest: process (veinte, diez, estado_actual)
begin
when D =>
servir <= '1';
preparada <= '0';
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
end bebida_a;
estado_sig <= F;
when A =>
else
preparada <= '1';
estado_sig <= D; if (veinte = '1') then
end if;
estado_sig <= D;
elsif
(diez = '1') then
type estados is (A, B, C, D, F, I, V, W);
estado_sig
<= C;
signal estado_actual, estado_sig : estados
;
else
estado_sig <= A;
attribute ENUM_ENCODING : STRING;
if; is ”000 001 010 011 100 101 110 111”;
attribute ENUM_ENCODING of estadosend
: type
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 14
Módulos Específicos
8.4
Módulos funcionales específicos: Memorias
Si el tamaño de la memoria es reducido,
ésta puede implementarse mediante
recursos lógicos comunes (funciones
lógicas y registros)
Habitualmente, existen en hardware
estructuras regulares que las
implementan y donde se sintetizan si la
descripción VHDL es apropiada
package ROMS is
Memoria ROM
constant ANCHO_ROM: INTEGER := 5;
subtype ROM_WORD is BIT_VECTOR (1 to ANCHO_ROM);
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
("10000"),
("11101"),
("11111"),
("10000"),
("10101"),
("00011"),
("11000"));
end ROMS;
use work.ROMS.all;
entity ROM5x8 is
port(
ADDR: in ROM_RANGE;
DATA: out ROM_WORD);
end ROM5x8;
architecture rom_a of ROM5x8 is
begin
DATA <= ROM(ADDR);
end rom_a;
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 15
Módulos Específicos
8.4
Módulos funcionales específicos: Memorias
En el caso de RAM, es necesario comprobar que
el dispositivo
library ieee;
incorpora este
use ieee.std_logic_1164.all;
recurso lógico
entity ram1 is
port (
Memoria RAM
use ieee.numeric_std.all;
dato: in std_logic_vector (7 downto 0);
direccion: in unsigned (5 downto 0);
we, inclock, outclock: in std_logic;
q: out std_logic_vector (7 downto 0));
end ram1;
architecture ram1_a of ram1 is
type mem_type is array (63 downto 0) of std_logic_vector (7 downto 0);
signal mem: mem_type;
begin
l0: process (inclock, outclock, we, direccion) begin
if (rising_edge(inclock)) then
if (we = '1') then
mem(to_integer(direccion)) <= dato;
end if;
end if;
if (rising_edge(outclock)) then
q <= mem(to_integer(direccion));
end if;
end process;
end ram1_a;
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 16
Aplicación
8.5
Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
Se propone un ejemplo que incluya:
1. Descripción de VHDL para síntesis
2. Diseño de sistemas digitales, desde su concepción hasta su descripción
3. Uso intensivo de recursos VHDL para simulación: bancos de pruebas
Planteamiento: Se desea reducir el ruido de 50Hz en las señales de adquisición de ECG
Solución: Filtro adaptativo LMS
Señal + ruido
+
d(n)
y(n)
Salida filtrada
Señal seno 50Hz
(ruido)
Retardo
90º
u1(n)
e(n)
w0(n)
w1(n)
Filtro
adaptativo
u0(n)
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 17
Aplicación
8.5
Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
Las ecuaciones que rigen el valor de los pesos y la salida filtrada:
1
e(n)
w
i0
i
(n) u i (n)
y (n) d (n) e(n)
w
i
( n 1)
w
i
u i (n) y (n)
Siendo la constante de adaptación :
0
2
2
2
M E (u )
M= núm etapas del filtro (M=2)
E (u )
1
M
M 1
ui
2
i0
Recuento de operaciones aritméticas: 4 multiplicaciones (dos con tres factores)
3 sumas
1 resta
Restricción: Sólo se debe emplear un módulo aritmético de cada tipo
(multiplicador, sumador y restador)
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 18
Aplicación
8.5
Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
Especificaciones:
1. Entradas/salidas de 12bits
2. Números con signo (compl. a 2)
3. =0,25012 =512 (desnormalizado)
4. Existen 3 entradas de 12 bits:
Señal con ruido, ruido 50Hz y ruido 50Hz desplazado 90º
5. Existen entradas Reloj, Reset y dato listo Hab_ext
6. Existe salida fin de final de filtrado de muestra
d(n)
u0(n)
u1(n)
Clock
Reset
Hab_ext
03 de noviembre de 2015
Filtro
LMS
FSM
Clock
Reset
Hab_ext
y(n)
hmul
hsum
hres
C1
C2
C4
C5
fin
Fin
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 19
Aplicación
8.5
Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
Propuesta:
u0
1
2
MUX
u1
*
C1
w0
0
w1
1
y
2
0
0,1
0
MUX
+
C2
hmult
hsum
Accumulador
DMUX
w1
2
C5
d(n)
-
0
MUX
C2
1
w0
Acc
Multiplicador
w0
w1
hrest
1
MUX
2
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
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
y
Slide 20
Aplicación
8.5
Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
Diseño VHDL estructurado:
1. Se diseña cada módulo por separado
2. Se simula la funcionalidad de cada módulo
3. Las señales de control son generadas por la FSM
4. Se unen los módulos en un diseño de nivel superior
5. Se genera un banco de pruebas que simule el sistema
Se proponen 4 módulos: Multiplicador, sumador-restador, FSM y memoria intermedia
Se define un paquete con las definiciones globales del sistema
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
package LMS_pkg is
constant beta_desp
:
constant external_length :
constant internal_length :
subtype external_vector is
subtype internal_vector is
end LMS_pkg;
03 de noviembre de 2015
integer:=9; -- 2**beta_desp=beta real
integer:=12;
integer:=(2*external_length);
signed ((external_length-1) downto 0);
signed ((internal_length-1) downto 0);
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 21
Aplicación
8.5
Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
Módulo multiplicador: Realiza la multiplicación de los valores de entrada que correspondan
mux_y_mul : process (reset,reloj,hmul)
variable mul_result : internal_vector;
variable mul1,mul2,mul_sal : external_vector;
begin
if reset = '0' then mul_salida <= (others =>'0');
elsif rising_edge(reloj) then
if hmul = '1' then
if control1 = '0' then mul1 := sen_in; -- sen_in corresponde a u0
else mul1 := cos_in;
-- control1 = '1', cos_in corresponde a u1
end if;
if control2 = "00" then mul2 := weight1;
elsif control2 = "01" then mul2 := weight2;
elsif (control2 = "10") or (control2 = "11") then mul2 := salida_ext;
end if;
mul_result := mul1 * mul2;
mul_sal(external_length-1) := mul_result(internal_length-1);
if control2 = "10" then
-En este caso se debe desplazar el resultado
mul_sal(beta_desp-1 downto 0) := mul_result((internal_length-3) downto
(internal_length-2-beta_desp));
for i in beta_desp to external_length-2 loop
mul_sal(i) := mul_result(internal_length-1);
end loop;
else
-- se redondea el valor sin desplazar
mul_sal(external_length-2 downto 0) := mul_result(internal_length-3 downto
external_length-1);
end if;
mul_salida <= mul_sal;
end if;
end if;
end process;
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 22
Aplicación
8.5
Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
Módulo almacenamiento: Almacena el resultado del multiplicador un ciclo de reloj
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
reset,reloj
acc_salida
end LMS6_acc;
: in external_vector;
: in std_logic;
: out external_vector);
architecture LMS6_accarchi of LMS6_acc is
begin
acc_or_direct : process(reset,reloj)
begin
if reset='0' then acc_salida <= (others => '0');
elsif reloj'event and reloj='1' then
acc_salida <= mult_result;
end if;
end process;
end LMS6_accarchi;
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 23
Aplicación
8.5
Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
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;
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 24
Aplicación
8.5
Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
Módulo
FSM: Gestiona
entity LMS6_estados
is el control desde activación de Hab_ext hasta la salida fin
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;
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 25
Aplicación
8.5
Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
Módulo Global: Descripción estructural para unir los módulos
entity LMS6 is
port (in_sig,sen_in,cos_in
hab_ext,clock,reset
lms_out
ending
end LMS6;
:
:
:
:
in external_vector;
in std_logic;
out external_vector;
out std_logic);
architecture LMS6archi of LMS6 is
component LMS6_mult
port (sen_in,cos_in,weight1,weight2,salida_ext
reset,reloj,hmul,control1
control2
mul_salida
end component;
component LMS6_acc
port (
mult_result
reset,reloj
acc_salida
:
:
:
:
in external_vector;
in std_logic;
in std_logic_vector (1 downto 0);
out external_vector);
: in external_vector;
: in std_logic;
: out external_vector);
end component;
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 26
Aplicación
8.5
Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
NEWDATA
process
Módulo:de
prueba: Lee datos de fichero, escribe resultado
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;
03 de noviembre de 2015
en fichero y genera Reloj y Reset
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 27
Aplicación
8.5
Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
Implementación: Sobre FPGA XC4010E –3 PC84
Device utilization summary:
Number of External IOBs
52 out of 160
Flops:
12
Latches:
0
Number of IOBs driving Global Buffers 1 out of 8
85%
Number of CLBs
Total CLB Flops:
4 input LUTs:
3 input LUTs:
44%
11%
39%
11%
Number of PRI-CLKs
Number of STARTUPs
176
92
315
44
out
out
out
out
of
of
of
of
400
800
800
400
1 out of 4
1 out of 1
12%
25%
100%
Design statistics:
Minimum period: 102.065ns (Maximum frequency: 9.798MHz)
Maximum net delay: 28.538ns
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Vhdl para síntesis
Alfredo Rosado Muñoz
Universidad de Valencia
Ingeniería Electrónica
Diseño de Circuitos y Sistemas Electrónicos
Slide 2
Objetivos
Realizar descripciones VHDL óptimas para implementación hardware
Saber utilizar las construcciones destinadas a hardware específico
Reset, reloj, triestados, unidades funcionales, ...
Evitar el empleo de VHDL no sintetizable o poco eficiente
Pensar “hardware” a pesar de describir “software”
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
Trabajo en grupo
03 de noviembre de 2015
Menor tiempo de diseño
Diferentes descripciones (RTL, Comp., Estruct.)
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 3
Tema
TEMA 8. LENGUAJES DE DESCRIPCIÓN HARDWARE ORIENTADOS A
SÍNTESIS. (3 HORAS)
8.1
8.2
8.3
8.4
8.5
Herramientas de síntesis: metodología y modo de funcionamiento.
Síntesis de lógica combinacional
Síntesis de lógica secuencial: Inferencia de latches, inferencia de flip-flop.
Tipos de descripción específicos: Puertas triestado y puertos bidireccionales,
máquinas de estados, memorias.
Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz.
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 4
Metodología
8.1
Herramientas de síntesis: metodología y modo de funcionamiento
PROBLEMA:
Software con características particulares
SOLUCIÓN:
Descripciones “universales”
Metodología de diseño:
Recomendaciones IEEE
03 de noviembre de 2015
ieee.std_logic_1164.all
Tipos: std_logic, integer
ieee.numeric_std.all
signed, unsigned
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 5
Consideraciones
8.1
Herramientas de síntesis: metodología y modo de funcionamiento
Tener presente la estructura hardware a diseñar y el paralelismo de las descripciones
No emplear construcciones claramente no sintetizables: inicialización, “after”, ficheros, ...
Asignar tipos de datos de forma uniforme
No utilizar enteros en puertos I/O, en operaciones lógicas y de desplazamiento
Ciertos operadores aritméticos no son sintetizables: **, /, rem, mod
Evitar la generación indeseada de registros en descripciones combinacionales
Descomponer cualquier diseño en módulos combinacionales y secuenciales
R e g i s tr o s
R e g i s tr o s
Ló gica
com b inaciona l
L ó gica
co m b in a cion a l
R e g i s tr o s
S a lid as
E n tra das
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 6
Lógica Combinacional
8.2
Síntesis de Lógica Combinacional
No es necesario el uso de procesos
Se admite el uso de cualquier operador predefinido (and, nand, or, nor, not, xor, xnor)
Sentencias concurrentes a emplear:
When..else
architecture p_a of puerta is
begin
with c select
d <= a
when
b
when
"11" when
"00" when
"00" when
end p_a;
03 de noviembre de 2015
"00",
"01",
"10",
"11",
others;
entity
entitypuerta
puertais
is
port
port(a,
(a,b,
b,c:
c:in
instd_logic_vector
std_logic_vector(1
(1downto
downto0);
0);
d:
d:out
outstd_logic_vector
std_logic_vector(1
(1downto
downto0));
0));
end
endpuerta;
puerta;
architecture p_a of puerta is
architecture
begin
p_a of puerta is
begin d <= a when c="00" else
d <=
b when
a
c="01"
when c="00"
else else
"11"bwhenwhen
c="10"
c="01"
elseelse
"00""11"
whenwhen
a="11"
c="10"
elseelse
"01""00"
;
when a="11";
end
endp_a;
p_a;
With..select
Completar SIEMPRE
todas las condiciones
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 7
Lógica Combinacional
8.2
Síntesis de Lógica Combinacional
Uso de if..then..else en procesos:
if c="00" then d <= a; e <= b;
elsif b="00" then e <= a; d <= b;
else
e <= (others =>'0');
d <= (others =>'0');
end if;
if c="00" then d <= a; e <= b; end if;
if b="00" then e <= a; d <= b; end if;
if c/="00" and b/="00" then
e <= (others =>'0');
d <= (others =>'0');
end if;
Agrupar en una sola sentencia todas las
condiciones siempre que sea posible
Number of ports : 10
Number of nets : 28
Number of instances : 22
Total accumulated area :
Number of IBUF : 6
Number of OBUF : 4
Number of gates : 14
Number of ports : 10
Number of nets : 41
Number of instances : 35
Total accumulated area :
Number of IBUF : 6
Number of Latches : 2
Number of OBUF : 4
Number of gates : 24
NO incluir la señal de reloj en la lista de sensibilidad de un proceso combinacional
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 8
Lógica Secuencial
8.3
Síntesis de Lógica Secuencial
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
Diferencia entre variables y señales
Aconsejable incluir siempre un reset global que aplique un valor de inicialización
Inferencia de Latches
entity latch is
port (a, b: in std_logic;
d: out std_logic);
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;
03 de noviembre de 2015
entity latch is
port (a, b: in std_logic;
d: out std_logic);
end latch;
architecture l_a of latch is
begin
d <= a when b=’1’;
end l_a;
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 9
Lógica Secuencial
8.3
Síntesis de Lógica Secuencial: Inferencia de registros activos por flanco
Es el método más habitual de describir sistemas síncronos
Los dispositivos lógicos incluyen registros activos por flanco (generalmente de tipo D)
Existen varias formas de especificar la llegada de un flanco:
Descripción genérica
entity registro is
port (d, reset, preset, reloj: in std_logic;
q: out std_logic);
end registro;
rising_edge(reloj)
if reloj’event and reloj=‘1’
if reloj’event and reloj=‘1’ and reloj’last_value=‘0’
architecture r_a of registro is
begin
process (d, reset, preset, reloj)
begin
if reset = ’1’ then q <= ‘0’;
elsif preset = ‘1’ then q <= ‘1’;
elsif rising_edge(reloj) then q <= d;
end if;
end process;
end r_a;
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 10
Lógica Secuencial
8.3
Síntesis de Lógica Secuencial: Inferencia de registros activos por flanco
No emplear más condiciones else ó elsif en la misma sentencia
if..then..else después de la condición de evaluación del reloj
En la misma evaluación if del reloj no se deben comparar otras señales o variables
La sentencia if del reloj no puede estar dentro de un bucle
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
En comparaciones múltiples, emplear la sentencia case
No utilizar relojes derivados, alternativamente, emplear habilitación de reloj
r_derivado <= not a and (b or c);
process
(d,<=
reset,
r_derivado
relojpreset,
and notreloj,
a and r_derivado)
(b or c);
begin
process (d, reset, preset, r_derivado)
if reset = ’1’ then q <= ‘0’;
begin
elsif
preset
= ‘1’
then
q <=
‘1’;
if reset
= ’1’
then
q <=
‘0’;
elsif
elsifrising_edge(reloj)
preset = ‘1’ then then
q <= ‘1’;
if
r_derivado
=
‘1’
then
elsif rising_edge(r_derivado) then
<=d;
d;
qq<=
end
if;
end if;
end
if;
end process;
end
end process;
r_a;
end r_a;
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 11
Módulos Específicos
8.4
Módulos funcionales específicos
En sistemas complejos es necesaria una correcta partición del diseño (Top-Down)
Las descripciones de mayor nivel suelen ser estructurales (componentes y subprogramas)
Aconsejable emplear módulos del fabricante (generadores automáticos, módulos IP, ...)
Consultar documentación del software de síntesis Herramientas y atributos especiales
Módulos específicos usuales: Multiplicadores, RAM, ROM, UART, filtro FIR, interface PCI, ...
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;
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 12
Módulos Específicos
8.4
Módulos funcionales específicos: Puertos bidireccionales
Para puertos bidireccionales la descripción es similar a los triestado: Tipo inout
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;
interna1 <= (a and b) nor c;
salida <= (c xor interna2) when oe='0' else 'Z';
end bidir_a ;
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
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 13
Módulos Específicos
8.4
entity bebida
is de estados
Módulos funcionales específicos:
Máquinas
port (reloj, reset, veinte, diez : in std_logic ;
when B =>
when
F => out std_logic);
preparada, servir, devolucion,
moneda:
Ejemplo:
servir
'1'; ;
moneda <= '1';
end<=bebida
estado_sig
<= A; Mbebida_a
P re p a ra
d o architecture
onedas
of bebida is if (veinte = '1') then
P re p a ra d o
M o n e d a s when C =>
estado_sig <= I;
type estados is (A, B, C, D, F, I);
moneda
<=
D is p e n s a d
o r d esignal
beb
id a '1';
s . estado_actual,
40c€.
Inestado_sig
s e rc ió n
: estados
;
elsif (diez
= '1') then
D is p e n s a d o r d e b e b id a s . 4 0 c € .
In sif
e rc ióm
n (veinte
M onedas
S ó lo a d m
ite
o n e d a s d e=1 0'1')
c € y 2 then
0c€
begin
M onedas
estado_sig <= B;
S ó lo a d m ite m o n e d a s d e 1 0 c € y 2 0 c €
estado_sig
<= process
F;
cambiaest:
(reloj,
reset)
is
begin
else
R e to rn o
B e b id a
elsif (diez
= '1')
then
R e to rn o
B e b id a
M o n e d a s='1') then estado_actual <= A;
if
(reset
s e rvid a
estado_sig <= F;
M onedas
s e rvid a
estado_sig <=elsif
D; (rising_edge(reloj)) then
end if;
else
estado_actual <= estado_sig;
estado_sig <=end
C; if;
end if;
when I =>
end process cambiaest;
devolucion <=is'1';
asignaest: process (veinte, diez, estado_actual)
begin
when D =>
servir <= '1';
preparada <= '0';
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
end bebida_a;
estado_sig <= F;
when A =>
else
preparada <= '1';
estado_sig <= D; if (veinte = '1') then
end if;
estado_sig <= D;
elsif
(diez = '1') then
type estados is (A, B, C, D, F, I, V, W);
estado_sig
<= C;
signal estado_actual, estado_sig : estados
;
else
estado_sig <= A;
attribute ENUM_ENCODING : STRING;
if; is ”000 001 010 011 100 101 110 111”;
attribute ENUM_ENCODING of estadosend
: type
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 14
Módulos Específicos
8.4
Módulos funcionales específicos: Memorias
Si el tamaño de la memoria es reducido,
ésta puede implementarse mediante
recursos lógicos comunes (funciones
lógicas y registros)
Habitualmente, existen en hardware
estructuras regulares que las
implementan y donde se sintetizan si la
descripción VHDL es apropiada
package ROMS is
Memoria ROM
constant ANCHO_ROM: INTEGER := 5;
subtype ROM_WORD is BIT_VECTOR (1 to ANCHO_ROM);
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
("10000"),
("11101"),
("11111"),
("10000"),
("10101"),
("00011"),
("11000"));
end ROMS;
use work.ROMS.all;
entity ROM5x8 is
port(
ADDR: in ROM_RANGE;
DATA: out ROM_WORD);
end ROM5x8;
architecture rom_a of ROM5x8 is
begin
DATA <= ROM(ADDR);
end rom_a;
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 15
Módulos Específicos
8.4
Módulos funcionales específicos: Memorias
En el caso de RAM, es necesario comprobar que
el dispositivo
library ieee;
incorpora este
use ieee.std_logic_1164.all;
recurso lógico
entity ram1 is
port (
Memoria RAM
use ieee.numeric_std.all;
dato: in std_logic_vector (7 downto 0);
direccion: in unsigned (5 downto 0);
we, inclock, outclock: in std_logic;
q: out std_logic_vector (7 downto 0));
end ram1;
architecture ram1_a of ram1 is
type mem_type is array (63 downto 0) of std_logic_vector (7 downto 0);
signal mem: mem_type;
begin
l0: process (inclock, outclock, we, direccion) begin
if (rising_edge(inclock)) then
if (we = '1') then
mem(to_integer(direccion)) <= dato;
end if;
end if;
if (rising_edge(outclock)) then
q <= mem(to_integer(direccion));
end if;
end process;
end ram1_a;
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 16
Aplicación
8.5
Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
Se propone un ejemplo que incluya:
1. Descripción de VHDL para síntesis
2. Diseño de sistemas digitales, desde su concepción hasta su descripción
3. Uso intensivo de recursos VHDL para simulación: bancos de pruebas
Planteamiento: Se desea reducir el ruido de 50Hz en las señales de adquisición de ECG
Solución: Filtro adaptativo LMS
Señal + ruido
+
d(n)
y(n)
Salida filtrada
Señal seno 50Hz
(ruido)
Retardo
90º
u1(n)
e(n)
w0(n)
w1(n)
Filtro
adaptativo
u0(n)
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 17
Aplicación
8.5
Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
Las ecuaciones que rigen el valor de los pesos y la salida filtrada:
1
e(n)
w
i0
i
(n) u i (n)
y (n) d (n) e(n)
w
i
( n 1)
w
i
u i (n) y (n)
Siendo la constante de adaptación :
0
2
2
2
M E (u )
M= núm etapas del filtro (M=2)
E (u )
1
M
M 1
ui
2
i0
Recuento de operaciones aritméticas: 4 multiplicaciones (dos con tres factores)
3 sumas
1 resta
Restricción: Sólo se debe emplear un módulo aritmético de cada tipo
(multiplicador, sumador y restador)
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 18
Aplicación
8.5
Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
Especificaciones:
1. Entradas/salidas de 12bits
2. Números con signo (compl. a 2)
3. =0,25012 =512 (desnormalizado)
4. Existen 3 entradas de 12 bits:
Señal con ruido, ruido 50Hz y ruido 50Hz desplazado 90º
5. Existen entradas Reloj, Reset y dato listo Hab_ext
6. Existe salida fin de final de filtrado de muestra
d(n)
u0(n)
u1(n)
Clock
Reset
Hab_ext
03 de noviembre de 2015
Filtro
LMS
FSM
Clock
Reset
Hab_ext
y(n)
hmul
hsum
hres
C1
C2
C4
C5
fin
Fin
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 19
Aplicación
8.5
Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
Propuesta:
u0
1
2
MUX
u1
*
C1
w0
0
w1
1
y
2
0
0,1
0
MUX
+
C2
hmult
hsum
Accumulador
DMUX
w1
2
C5
d(n)
-
0
MUX
C2
1
w0
Acc
Multiplicador
w0
w1
hrest
1
MUX
2
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
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
y
Slide 20
Aplicación
8.5
Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
Diseño VHDL estructurado:
1. Se diseña cada módulo por separado
2. Se simula la funcionalidad de cada módulo
3. Las señales de control son generadas por la FSM
4. Se unen los módulos en un diseño de nivel superior
5. Se genera un banco de pruebas que simule el sistema
Se proponen 4 módulos: Multiplicador, sumador-restador, FSM y memoria intermedia
Se define un paquete con las definiciones globales del sistema
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
package LMS_pkg is
constant beta_desp
:
constant external_length :
constant internal_length :
subtype external_vector is
subtype internal_vector is
end LMS_pkg;
03 de noviembre de 2015
integer:=9; -- 2**beta_desp=beta real
integer:=12;
integer:=(2*external_length);
signed ((external_length-1) downto 0);
signed ((internal_length-1) downto 0);
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 21
Aplicación
8.5
Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
Módulo multiplicador: Realiza la multiplicación de los valores de entrada que correspondan
mux_y_mul : process (reset,reloj,hmul)
variable mul_result : internal_vector;
variable mul1,mul2,mul_sal : external_vector;
begin
if reset = '0' then mul_salida <= (others =>'0');
elsif rising_edge(reloj) then
if hmul = '1' then
if control1 = '0' then mul1 := sen_in; -- sen_in corresponde a u0
else mul1 := cos_in;
-- control1 = '1', cos_in corresponde a u1
end if;
if control2 = "00" then mul2 := weight1;
elsif control2 = "01" then mul2 := weight2;
elsif (control2 = "10") or (control2 = "11") then mul2 := salida_ext;
end if;
mul_result := mul1 * mul2;
mul_sal(external_length-1) := mul_result(internal_length-1);
if control2 = "10" then
-En este caso se debe desplazar el resultado
mul_sal(beta_desp-1 downto 0) := mul_result((internal_length-3) downto
(internal_length-2-beta_desp));
for i in beta_desp to external_length-2 loop
mul_sal(i) := mul_result(internal_length-1);
end loop;
else
-- se redondea el valor sin desplazar
mul_sal(external_length-2 downto 0) := mul_result(internal_length-3 downto
external_length-1);
end if;
mul_salida <= mul_sal;
end if;
end if;
end process;
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 22
Aplicación
8.5
Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
Módulo almacenamiento: Almacena el resultado del multiplicador un ciclo de reloj
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
reset,reloj
acc_salida
end LMS6_acc;
: in external_vector;
: in std_logic;
: out external_vector);
architecture LMS6_accarchi of LMS6_acc is
begin
acc_or_direct : process(reset,reloj)
begin
if reset='0' then acc_salida <= (others => '0');
elsif reloj'event and reloj='1' then
acc_salida <= mult_result;
end if;
end process;
end LMS6_accarchi;
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 23
Aplicación
8.5
Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
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;
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 24
Aplicación
8.5
Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
Módulo
FSM: Gestiona
entity LMS6_estados
is el control desde activación de Hab_ext hasta la salida fin
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;
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 25
Aplicación
8.5
Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
Módulo Global: Descripción estructural para unir los módulos
entity LMS6 is
port (in_sig,sen_in,cos_in
hab_ext,clock,reset
lms_out
ending
end LMS6;
:
:
:
:
in external_vector;
in std_logic;
out external_vector;
out std_logic);
architecture LMS6archi of LMS6 is
component LMS6_mult
port (sen_in,cos_in,weight1,weight2,salida_ext
reset,reloj,hmul,control1
control2
mul_salida
end component;
component LMS6_acc
port (
mult_result
reset,reloj
acc_salida
:
:
:
:
in external_vector;
in std_logic;
in std_logic_vector (1 downto 0);
out external_vector);
: in external_vector;
: in std_logic;
: out external_vector);
end component;
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 26
Aplicación
8.5
Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
NEWDATA
process
Módulo:de
prueba: Lee datos de fichero, escribe resultado
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;
03 de noviembre de 2015
en fichero y genera Reloj y Reset
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz
Slide 27
Aplicación
8.5
Ejemplo de aplicación: Filtro LMS de eliminación de ruido de red de 50Hz
Implementación: Sobre FPGA XC4010E –3 PC84
Device utilization summary:
Number of External IOBs
52 out of 160
Flops:
12
Latches:
0
Number of IOBs driving Global Buffers 1 out of 8
85%
Number of CLBs
Total CLB Flops:
4 input LUTs:
3 input LUTs:
44%
11%
39%
11%
Number of PRI-CLKs
Number of STARTUPs
176
92
315
44
out
out
out
out
of
of
of
of
400
800
800
400
1 out of 4
1 out of 1
12%
25%
100%
Design statistics:
Minimum period: 102.065ns (Maximum frequency: 9.798MHz)
Maximum net delay: 28.538ns
03 de noviembre de 2015
TEMA: VHDL para Síntesis. Alfredo Rosado Muñoz