Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Vibilidad de La Tarjeta Basys2 para Su Implementacion en El Control de Un Proceso
Vibilidad de La Tarjeta Basys2 para Su Implementacion en El Control de Un Proceso
Presenta:
Mario Merino Mrquez
Asesor Interno:
Asesor Externo:
Dr. Oscar Leopoldo Prez Castaeda
Tehuacn, Puebla; a 24 Mayo de 2012
pg. 1
NDICE
NDICE .................................................................................................................... 2
INTRODUCCIN ................................................................................................... 4
JUSTIFICACIN .................................................................................................... 6
OBJETIVOS............................................................................................................ 8
OBJETIVO GENERAL .................................................................................... 8
OBJETIVOS ESPECFICOS ............................................................................. 8
ALCANCES Y LIMITACIONES........................................................................... 13
ALCANCES ................................................................................................ 13
LIMITACIONES............................................................................................ 13
pg. 2
RESULTADOS ..................................................................................................... 74
DESARROLLO DE PRCTICAS UTILIZANDO LA TARJETA BASYS2 .................... 74
Practica 1 Decoder Display ............................................................................. 74
Practica 2 - Contador Ascendente ..................................................................... 77
Practica 3 - Contador con salida a Display ........................................................ 81
Practica 4 - Encendido de un motor de CD....................................................... 83
Prctica 5 - Motor Reversible ............................................................................. 85
Practica 6 Sumador Aritmtico con Salida a Display ...................................... 88
Practica 7 Unidad Aritmtica Lgica (ALU) ..................................................... 97
Practica 8 Elementos de Memoria (Flip-Flops) Pulsador .............................105
Practica 9 Maquinas de Estados Finitos (FSM) ............................................108
Prctica 10 Circuito Anti rebotes (Debounce Circuit) ...................................120
Practica 11 - Generacin de una seal PWM .................................................125
Practica 12 - PWM con salida a display. ..........................................................129
Practica 13 Seal PWM con Potencimetro. ...............................................135
Practica 14 - Control de un motor debido a la seal de un sensor. .................140
Prctica 15 - Seal PWM controlada con Pushbuttons ...................................152
Prctica 16 - Contador Parametrizable (Mod_m_Counter) ..............................157
Prctica 17 - FIFO Buffer .................................................................................159
Prctica 18 Comunicacin Serial Puerto PS2 Teclado ..............................162
pg. 3
INTRODUCCIN
Viabilidad de la Tarjeta Basys2 para su Implementacin en el
Control de un Proceso
pg. 4
pg. 5
JUSTIFICACIN
Velocidad, Reprogramacin, Mltiples I/0, Rendimiento, Costo
Actel. Las aplicaciones finales que se le dan a estos dispositivos suelen ser
diversas y se presentan en campos tales como telecomunicaciones, industria
automotriz, industria de consumo, entre otros.
Este documento busca adems de demostrar la viabilidad de la
Tarjeta Basys2 para ser utilizada en el control de un proceso, beneficiar y
orientar a todos aquellos que se comienzan a sumergir dentro del campo de
los dispositivos lgicos programables para el diseo de sistemas digitales a
travs de FPGAs, de modo que puedan hacer consideraciones para la
eleccin de la arquitectura que controle sus procesos.
pg. 7
OBJETIVOS
Objetivo General
-
Objetivos Especficos
-
pg. 8
REA DE PARTICIPACIN
Ingeniera Electrnica Ciencia Aplicada para Crear e Innovar
pg. 9
PROBLEMAS A RESOLVER
Cronograma de Actividades
A continuacin se exponen los problemas a resolver para el desarrollo
del proyecto, asi como una breve descripcin de los mismos.
Bsqueda y Compra de Tarjeta basada en FPGA XILINX Spartan 3E
100K
-
Duracin: 2 semanas
Instalacin y Manejo del Software ISE Design Suite 13.4 y Digilent Adept
-
Duracin: 1 semana
Duracin: 1 semana
pg. 10
Duracin: 3 semanas
Duracin: 3 semanas
Duracin: 3 semanas
pg. 11
Duracin: 2 semanas
Duracin: 3 semanas
pg. 12
ALCANCES Y LIMITACIONES
Alcances
Las prcticas expuestas en este documento pretenden demostrar la
viabilidad del uso de una tarjeta de desarrollo basada en FPGA para su
implementacin en el control de un proceso, adems servirn de gua para
todos aquellos que busquen disear sistemas digitales con dispositivos
lgicos programables.
El impacto de este proyecto beneficia a la carrera de Ingeniera
Electrnica en sus cursos de Electrnica Digital y Diseo Digital con VHDL.
La tarjeta Basys 2 cuenta con 4 mdulos de expansin PMOD los
cuales cuentan con 4 entradas y salidas externas cada uno que nos permiten
ingresar seales elctricas de sensores u otros dispositivos, o enviar seales
elctricas para activar actuadores o establecer comunicacin entre el FPGA y
un ordenador.
La Tarjeta Basys2 nos permite trabajar a velocidades de 50Mhz y
controlar mltiples procesos de forma paralela, lo cual es su principal ventaja
en comparacin a un microcontrolador.
Limitaciones
La adquisicin de la Tarjeta Basys2 en el territorio nacional es
complicada; los distribuidores autorizados de la empresa Digilent se
encuentran fuera del estado de Puebla. Es ms sencillo pedirla directamente
al proveedor en USA pero se debe pagar un impuesto aduanal.
Se debe analizar el proceso a controlar para determinar si las entradas
y salidas con las que cuenta la Tarjeta Basys2 son suficientes para su
implementacin.
Los componentes electrnicos con los que se cuenta dentro del rea
de Ingeniera Electrnica son insuficientes, por lo cual se opta por adquirirlos
en distribuidores locales generando gastos adicionales.
El voltaje de las entradas y salidas de la Tarjeta Basys2 utiliza
tecnologa LVTTL de 3.3V por lo tanto se requiere acondicionar
pg. 13
pg. 14
MARCO TERICO
Sistemas de Control y Sistemas Digitales
El control de procesos a travs de tecnologas reprogramables es un
rea en constante crecimiento con dispositivos lgicos programables
evolucionando rpidamente.
Un proceso es un conjunto de actividades o eventos que se realizan
o suceden (alternativa o simultneamente) bajo ciertas circunstancias con un
fin determinado.
Los sistemas de control son parte integrante de la sociedad moderna y
sus numerosas aplicaciones estn alrededor de nosotros: Un sistema de
control esta formado por subsistemas y procesos unidos con el fin de
controlar las salidad de los procesos. En su forma ms sencilla, un sistema
de control produce una salida o respuesta para una entrada o estmulo dado.
En la Figura 2 se muestra un sistema de control simple.
Entrada; Estimulo
Salida; Respuesta
Sistema de Control
Respuesta Deseada
Respuesta Real
Figura 2 Diagrama Sistema de Control
pg. 15
Norman S. Nise, Sistemas de Control para Ingeniera. (1a Edicin), Compaa Editorial Continental, Mexico: 2004
pg. 16
Dispositivos FPGA
Un FPGA (Field programable gate array) es un dispositivo lgico que
contiene una matriz de celdas lgicas idnticas, con interconexiones
programables (switches programables). La estructura conceptual de un
dispositivo FPGA se muestra en la Figura 4. Una celda lgica puede ser
configurada (programada) para realizar una funcin simple, y un switch
programable puede ser configurado para proveer interconexin a travs de
las celdas lgicas. Un diseo puede ser implementado en un FPGA
especificando la funcin de cada celda lgica y estableciendo selectivamente
la conexin de cada switch programable. Una vez que el diseo y la sntesis
son completados, podemos utilizar un simple cable adaptador para descargar
la celda lgica deseada y la configuracin del switch programable al
dispositivo FPGA, para obtener el circuito digital diseado.
pg. 17
Pong P. Chu, FPGA Prototyping by VHDL Examples XILINX Spartan-3 Version. (1a Edicin), John Wiley
& Sons Inc, Hoboken, New Jersey: 2008
pg. 18
pg. 19
que interconectan los segmentos de alambrado entre las pistas para ofrecer
conexiones de diferentes longitudes.
Una de las principales caractersticas de los mdulos lgicos de los
FPGAs de Actel, es que los mdulos no se programan para que efecten una
operacin, sino que toda la programacin se hace mediante antifusibles en
las pistas de alambrado.3
Menndez Ortiz Mara Alejandra, Arquitectura FPGA para la adquisicin de Datos Trmicos. Universidad
del Mar Campus Puerto Escondido Oaxaca Mxico: 2010.
pg. 21
puede ser configurada de distintas formas. El DCM usa un ciclo digitaldelayed para reducir los problemas con los tiempos y controlar la frecuencia
y fase de las seales de reloj. Las IOB controlan el flujo de datos entre los
pines de E/S y la lgica interna.4 La arquitectura del Spartan-3E es mostrada
en la Figura 6.
La Familia Spartan-3E cuenta con 5 miembros que ofrecen distintas
densidades, las cuales van desde los 100,000 hasta los 1.6 millones de
compuertas, tal y como se muestra en la Tabla 1.
Tarjeta Basys2
La tarjeta Basys2 es una plataforma para el diseo e implementacin
de circuitos digitales. La tarjeta esta construida en base a un FPGA Spartan3E de Xilinx y un controlador USB Atmel AT90USB2. La tarjeta Basys2
provee el hardware necesario listo para usarse capaz de soportar circuitos
que van desde el rango de lo bsico hasta el control complejo de procesos.
Una amplia gama de dispositivos de E/S y todas las conexiones del FPGA
son incluidas, por lo que incontables diseos pueden ser creados sin la
necesidad de componentes adicionales.
Pong P. Chu, FPGA Prototyping by VHDL Examples XILINX Spartan-3 Version. (1a Edicin), John Wiley
& Sons Inc, Hoboken, New Jersey: 2008
5
pg. 22
pg. 23
pg. 24
Comunicaciones
De acuerdo a la empresa de consultora industrial Gartner, durante el
ciclo fiscal 2008-2009, el mercado de la tecnologa FPGAs para
Comunicaciones gener aproximadamente USD $ 1,45 millones de dlares,
mientras que las proyecciones para el 2012 ascienden a unos USD $ 2,096
millones de dlares.
En cuanto a la cantidad de patentes registradas con esta tecnologa
para Comunicaciones, indica que a la fecha se tiene un total de 2,527
documentos y solicitudes a nivel internacional. Los campos en donde se ha
generado mayor propiedad intelectual son: Comunicaciones pticas,
Comunicaciones Inalmbricas/Almbricas, Antenas, Moduladores y
Codificadores y Redes.
pg. 25
Aeroespacial y Militar
El mercado de la tecnologa FPGA en el 2008 fue de
aproximadamente USD$447 millones y se estima que para el 2012 sea de
USD$717 millones.
Aplicaciones:
-
Sistemas de radar
Enlaces de comunicaciones de alta velocidad
Misiles
Aplicaciones de alta confiablidad en el espacio
Procesamiento digital de seales robusto y de alta seguridad
Automotriz
El mercado de la tecnologa FPGA en el 2008 fue de
aproximadamente USD$83 millones y se estima que para el 2012 sea de
USD$358 millones.
Aplicaciones:
GPS
Infoentretenimiento
Control de frenos
Control de luces
Sistemas de seguridad
Industrial
Los sectores industriales que mayor consumo de FPGAs registran son
para aplicaciones de Sistemas de Manufactura, Equipo Mdico y Monitoreo
de Pacientes, Seguridad, Administracin de Energa, Pruebas y Mediciones,
Redes y Domtica. En el 2008 el sector industrial recaud 852 millones de
dlares (mdd) y se estima que para el 2012 ascienda a unos 1,406 mdd. La
cantidad de patentes internacionales en el sector Industrial con tecnologa
FPGAs llega a 524 documentos y solicitudes.
pg. 26
Electrnica de Consumo
En el rea de electrnica de consumo, los FPGAs generaron en el
2008 un total de 469 mdd por ingresos y se estima que para el ao 2012 se
eleve a 672 mdd. En cuanto a propiedad intelectual a nivel internacional se
han registrado 102 documentos y solicitudes. Las aplicaciones ms comunes
en las que son utilizados son: Audio, Video y Equipo de Oficina.
Procesamiento de Datos
El mercado de FPGAs en el 2008 para este campo sum 312 mdd y
se tiene proyectado que para el ao 2012 alcance los 335 mdd. Sus
principales aplicaciones han sido para el desarrollo de Sper computadoras,
Tarjetas Inteligentes, Servidores, Procesadores y Computadoras Personales
(PCs). 8
Lenguaje VHDL
VHDL es el acrnimo que representa la combinacin
de VHSIC y HDL, donde VHSIC es el acrnimo de Very High Speed
Integrated Circuit y HDL es a su vez el acrnimo de Hardware Description
Language.
Es un lenguaje definido por el IEEE (Institute of Electrical and
Electronics Engineers) (ANSI/IEEE 1076-1993) usado por ingenieros para
describir circuitos digitales.
Aunque puede ser usado de forma general para describir cualquier
circuito se usa principalmente para programar PLD (Programable Logic
Device - Dispositivo Lgico Programable), FPGA (Field Programmable Gate
Array), ASIC y similares.
Formas de describir un circuito
Dentro del VHDL hay varias formas con las que podemos disear el
mismo circuito y es tarea del diseador elegir la ms apropiada.
8
pg. 27
diseo
Secuencia de diseo
pg. 29
Inicio
Cdigo en VHDL
No
Compilacin
Si
Simulacin
Funcional
No
Si
No
Sntesis
Si
Simulacin
Pos-Sintesis
No
Si
Ubicacin y
Enrrutamiento
Fichero SDF
Anotacin Final
Simulacin
Temporal
No
Programacin del
Dispositivo
Fin
pg. 30
2)
3)
Entity
pg. 31
puerto (port). Existen tres tipos de puertos: in (entrada), out (salida) e inout
(bidireccional).
La palabra reservada entity, seguida del nombre de la interfaz y de las
palabras reservadas is port, indica el comienzo de la definicin de la interfaz.
A continuacin, se especifica el nombre de cada uno de los puertos, su
direccin (in, out o inout) y su tipo. En el ejemplo mostrado en la Figura 10,
todos los puertos son seales del tipo std_logic.
Finalmente, las palabras reservadas end entity, seguidas del nombre
de la interfaz, indican el final de la definicin.
Los nombres definidos por el usuario deben comenzar por una letra,
seguida opcionalmente por cualquier secuencia de letras, nmeros y
caracteres guion bajo, con la limitacin de que ni pueden aparecer dos
guiones bajos seguidos, ni el guion bajo puede ser el ultimo caracter del
nombre. En VHDL no se diferencia entre los caracteres en mayscula y en
minscula.
Los tipos de seales utilizados en el lenguaje VHDL se muestran en la
Tabla 2.
TIPO
Caractersticas
BIT
Booleana
pg. 32
Std_logic
Integer
Bit_Vector
Std_Logic_Vector
Character
Architecture
La architecture describe el comportamiento o la estructura de la
entidad de diseo. En la Figura 11 se muestra la arquitectura de las
compuertas NOT, XOR y AND.9
Urqua Alfonso, Martn Villalba Carla, Casos prcticos de diseo de circuitos digitales con VHDL,
Universidad Nacional de Educacin a Distancia (UNED) Departamento de Informtica y Automtica, Madrid,
Espaa: 2008
pg. 33
Bibliotecas
pg. 34
Cantidad
Producto
Basys2
Multimete
r-MS821
PMOD-TMP
Descripcin
PMOD-TMP Thermometer
Precio
Unitario
$ 59.00
USD
$ 29.99
USD
$ 24.99
USD
Sub
Total
$ 59.00
USD
$ 59.98
USD
$ 24.99
USD
Cantidad
Producto
Envo
Impuesto
Descripcin
Servicio de Paquetera FedEx
Impuesto Aduanal
Precio
Unitario
$ 81.77
USD
$ 30.00
USD
Sub
Total
$ 81.77
USD
$ 30.00
USD
pg. 35
Cantidad
Producto
Descripcin
Precio
Unitario
Protoboard
SN754410
NE555
Multivibrador 555
30
Resistor
Capacitor
20
2N25
Resistores de distintos
valores
Capacitores Electrolticos
y Cermicos
Optoacoplador MOC
10
2N2222
NPN Transistor
Motor
Motro de 5V CD
Relay
Relays de 5V CD
Cable
Telefnico
$ 9.00
USD
$ 2.99
USD
$ 0.95
USD
$ 0.10
USD
$ 0.30
USD
$ 0.80
USD
$ 0.23
USD
$ 1.00
USD
$ 1.00
USD
$ 0.88
USD
Sub
Total
$ 18.00
USD
$ 2.99
USD
$ 0.95
USD
$ 3.00
USD
$ 1.50
USD
$ 16.00
USD
$ 2.30
USD
$ 1.00
USD
$ 2.00
USD
$ 2.64
USD
306.12 USD
pg. 36
pg. 37
Uso del Software ISE Design Suite 13.4, Adept 2.6.1 System y
configuracin de la Tarjeta Basys2
Para explicar el uso del software ISE Design Suite 13.4, Adept 2.6.1
System, la descarga y configuracin de los programas hacia la Tarjeta
Basys2 as como las bases del lenguaje de programacin VHDL, se
desarrollar una prctica sencilla que servir de gua a travs de la creacin,
simulacin y descarga del proyecto. Iniciaremos por compuertas lgicas
pg. 38
pg. 39
pg. 40
pg. 41
pg. 42
pg. 43
s : out
end compuerta_and;
STD_LOGIC);
Cdigo 4 Entidad Compuerta_and
pg. 44
-- combinacionales o subprogramas.
end NOMBRE_ARQUITECTURA;
Cdigo 5 Sintaxis de la Arquitectura
pg. 45
Para iniciar la revisin de sitanxis del cdigo, se hace doble clic sobre
el nombre del proceso o con un clic derecho y luego seleccionando el
comando Run del men contextual. Se puede observar el resultado del
proceso de revisin de sintaxis en la parte inferior del programa en la
ventana de resultados.
pg. 46
Simulacin
Analicemos cmo realizar una simulacin del componente
compuerta_and. En primer lugar, dentro de Project Navigator, en la seccin
Design, en la opcin View, se selecciona Simulation:
Figura 21 Simulacin
pg. 47
pg. 48
0
0
1
1
0
1
0
1
0
0
0
1
pg. 49
simulacin por cierto tiempo, lo que nos mostrar algo como lo que se tiene
en la Figura 26.
pg. 51
pg. 52
pg. 53
0
0
1
1
0
1
0
1
0
1
1
1
pg. 54
pg. 55
0
0
1
1
0
1
0
1
0
1
1
0
pg. 56
0
0
1
1
0
1
0
1
0
0
0
1
0
1
1
0
pg. 57
pg. 58
pg. 59
pg. 60
pg. 61
pg. 62
);
end component;
begin
end behavioral;
Cdigo 14 Declaracin medio_sumador y compuerta_or
pg. 63
Ntese que el tipo de las seales auxiliares debe coincidir con el tipo
de las seales de los componentes con los que se desea realizar la
conexin.
A continuacin se crean dos instancias del mdulo medio_sumador y
una del mdulo compuerta_or, y se utilizarn las seales s1, c1 y c2 para
interconectar dichas instancias.
MS0: medio_sumador port map( EntradaA, EntradaB, c1, s1 );
MS1: medio_sumador port map( s1, Cin, c2, Suma );
COR: compuerta_or port map( c1, c2, Cout );
Cdigo 17 Instanciacin sumador_completo
pg. 64
);
end component;
component compuerta_or
port (
a : in std_logic;
b : in std_logic;
s : out std_logic
);
end component;
signal s1 : std_logic;
signal c1, c2 : std_logic;
begin
MS0: medio_sumador port map( EntradaA, EntradaB, c1, s1 );
MS1: medio_sumador port map( s1, Cin, c2, Suma );
COR: compuerta_or port map( c1, c2, Cout );
end behavioral;
Cdigo 18 Mdulo sumado_completo
pg. 65
Ntese que todos los mdulos anteriores se han anidado dentro del
mdulo sumador_completo, adems de que hay dos apariciones del
mdulo medio_sumador, correspondiendo con las instancias que se han
creado del mismo. A continuacin se realiza una revisin de sintaxis, si no
hay problemas proceda con la simulacin. Para comprobar la simulacin
observe la tabla de verdad para el sumador completo de 1 bit:
Cin
EntradaB
EntradaA
Cout
Suma
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
0
0
0
1
0
1
1
1
0
1
1
0
1
0
0
1
pg. 66
Cout
(M11)
Suma
(M5)
Cin
(K3)
EntradaA
(L3)
EntradaB
(P11)
pg. 67
pg. 68
pg. 69
pg. 70
pg. 71
pg. 72
pg. 73
RESULTADOS
Desarrollo de Prcticas utilizando la Tarjeta Basys2
Las prcticas expuestas a continuacin se desarrollaron con la Tarjeta
Basys2 basada en el Xilinx Spartan 3E, estas prcticas tienen como objetivo
demostrar la viabilidad del uso de la tarjeta Basys2 como arquitectura base
en el control de un proceso.
El diseo estructural con VHDL permite agregar mdulos y crear
prcticas cada vez ms complejas. El diseo estructural, la asignacin de
pines y la descarga hacia la tarjeta se explica de forma breve en este
documento y para no extender de ms las prcticas se omiten dentro del
desarrollo de las mismas.
Se recomienda tener bases del lenguaje VHDL y de electrnica digital
para comprender en su totalidad las practicas expuestas.
pg. 74
pg. 75
pg. 76
a(entrada)
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
Leds
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
Display
0
1
2
3
4
5
6
7
8
9
a
b
c
d
e
f
pg. 77
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;
entity contadorAD is
Port ( clk : in STD_LOGIC;
reset:in std_logic;
Q : out STD_LOGIC_VECTOR (3 downto 0));
end contadorAD;
Cdigo 2.1 - Entidad contadorAD
pg. 78
begin
-- Proceso que lleva la cuenta de 4 bits
process( reloj_lento, reset )
begin
if reset = '1' then
aux <= "0000";
elsif reloj_lento'event and reloj_lento = '1' then
aux <= aux + 1;
end if;
end process;
Q <= aux;
Cdigo 2.3 - Proceso contador ascendente
pg. 79
pg. 80
end Behavioral;
Cdigo 2.5 - Mdulo contadorAD
pg. 81
if (reset='1') then
cuenta<=0;
elsif (reloj_lento'event and reloj_lento = '1') then
cuenta<= cuenta + 1
end if;
end process;
pg. 82
1 Optoacoplador 2N25
1 Transistor NPN 2N2222
1 Protoboard
1 Resistor 330
1 Resistor 10K
1 Relevador de 5V
Alambre telefnico
1 Motor de CD @ 5V
pg. 84
3 Opto-Acoplador 2N25
1 Protoboard
3 Resistor 330
3 Resistor 1K
1 Puente H SN754410
Alambre telefnico
1 Motor de CD @ 5V
pg. 85
pg. 86
process (sentido)
begin
if sentido='0' then
--SENTIDO DEL MOTOR HACIA LA IZQUIERDA
s1<= '1';
s2<='0';
led_sent <= '0';
else
--SENTIDO DEL MOTOR HACIA LA DERECHA
s1<='0';
s2<='1';
led_sent <= '1';
end if;
end process;
end Behavioral;
Cdigo 5.2 - Arquitectura puente_h
pg. 87
pg. 88
bits
cin : in STD_LOGIC;
reloj_tarjeta : in STD_LOGIC;
reset : in STD_LOGIC;
-- Carry in de 1 bit
Como
se
observa
se
agreg
la
librera
IEEE.STD_LOGIC_UNSIGNED.ALL para poder realizar operaciones con
operadores aritmticos (+, - , *, /) esta es una gran ventaja ya que ahorra
cdigo
y
facilita
la
programacin.
(La
librera
pg. 89
COMPONENT Enciende7Segmentos
PORT(
valor0 : IN std_logic_vector(3 downto 0);
valor1 : IN std_logic_vector(3 downto 0);
valor2 : IN std_logic_vector(3 downto 0);
valor3 : IN std_logic_vector(3 downto 0);
reloj_50MHz : IN std_logic;
reset : IN std_logic;
segmentos : OUT std_logic_vector(6 downto 0);
anodos : OUT std_logic_vector(3 downto 0)
);
END COMPONENT;
Cdigo 6.2 Inicializacin del Componente
entity Enciende7Segmentos is
Port (
valor0 : in STD_LOGIC_VECTOR (3 downto 0);
valor1 : in STD_LOGIC_VECTOR (3 downto 0);
valor2 : in STD_LOGIC_VECTOR (3 downto 0);
valor3 : in STD_LOGIC_VECTOR (3 downto 0);
segmentos : out STD_LOGIC_VECTOR (6 downto 0);
reloj_50MHz : in std_logic;
reset : in std_logic;
pg. 90
=>
anodos
<=
"1110";
valor_aux
<=
when
"01"
=>
anodos
<=
"1101";
valor_aux
<=
when
"10"
=>
anodos
<=
"1011";
valor_aux
<=
valor0;
valor1;
valor2;
when others => anodos <= "0111"; valor_aux <=
valor3;
end case;
pg. 91
end if;
end process;
-a
----- f| g | b
----- e|
| c
----d
-- Activa los segmentos adecuados
-- Por hacer: manejar el punto decimal y ampliar a ms caracteres.
with valor_aux select
segmentos <=
-- abcdefg
"1001111"
"0010010"
"0000110"
"1001100"
"0100100"
"0100000"
"0001111"
"0000000"
"0000100"
"0001000"
"1100000"
"0110001"
"1000010"
"0110000"
"0111000"
"0000001"
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
"0001",
"0010",
"0011",
"0100",
"0101",
"0110",
"0111",
"1000",
"1001",
"1010",
"1011",
"1100",
"1101",
"1110",
"1111",
others;
--1
--2
--3
--4
--5
--6
--7
--8
--9
--A
--b
--C
--d
--E
--F
--0
end Behavioral;
Cdigo 6.4 Programa Enciende7Segmentos
pg. 92
COMPONENT Nombre_del_programa
GENERIC( Variables_genericas: natural;
N : integer
);
PORT(
Entradas : IN std_logic;
Bus_Entradas : IN std_logic_vector(N downto 0);
Salidas : OUT std_logic;
Bus_Salidas : OUT std_logic_vector(N downto 0);
);
END COMPONENT;
Cdigo 6.5 Inicializacin de componentes (Forma General)
pg. 93
Bus_Salidas => ,
);
Cdigo 6.6 Mapeo de componentes (Forma General)
pg. 94
);
copiabin( 0 ) := '0';
-- unidades
if i < 15 and resultado( 3 downto 0 ) > "0100"
then
resultado( 3 downto 0 ) := resultado( 3
downto 0 ) + "0011";
end if;
-- decenas
if i < 15 and resultado( 7 downto 4 ) > "0100"
then
resultado( 7 downto 4 ) := resultado( 7
downto 4 ) + "0011";
end if;
-- centenas
if i < 15 and resultado( 11 downto 8 ) > "0100"
then
resultado( 11 downto 8 ) := resultado( 11
downto 8 ) + "0011";
end if;
-- millares
if i < 15 and resultado (15 downto 12) > "0100"
then
resultado ( 15 downto 12 ) := resultado ( 15
downto 12 ) + "0011";
end if;
end loop;
return resultado;
end bin_a_bcd;
-- Inicio de la Arquitectura
begin
-- Utilizacin de los 3 LSB de "a" y "b" para hacer una Suma con
vectores de 6 bits
A_aux (2 downto 0) <= a;
B_aux (2 downto 0) <= b;
--process (A_aux, B_aux, cin, reloj_tarjeta)
--begin
--if reloj_tarjeta'event and reloj_tarjeta = '1' then
suma <= A_aux + B_aux + cin;
--end if;
--end process;
suma_aux (5 downto 0) <= suma;
numerobcd <= bin_a_bcd(Suma_aux);
pg. 95
unidades
decenas
centenas
millares
end Behavioral;
Cdigo 6.7 Arquitectura Sumador_Arith
pg. 96
0
0
1
1
0
1
0
1
pg. 97
pg. 98
dp <= dp_in(1);
when "10" =>
an <= "1011";
hex <= hex2;
dp <= dp_in(2);
when others =>
an <= "0111";
hex <= hex3;
dp <= dp_in(3);
end case;
end process;
-- hex-to-7- segment led decoding
with hex select
sseg (6 downto 0) <=
"0000001" when
"1001111" when
"0010010" when
"0000110" when
"1001100" when
"0100100" when
"0100000" when
"0001111" when
"0000000" when
"0001100" when
"0001000" when
"1100000" when
"1110010" when
"1000010" when
"0011000" when
"0111000" when
"0000",
"0001",
"0010",
"0011",
"0100",
"0101",
"0110",
"0111",
"1000",
"1001",
"1010",
"1011",
"1100",
"1101",
"1110",
others;
--a
--b
--c
--d
--P
--f
--decimal point
sseg(7) <= dp;
end Behavioral;
Cdigo 7.1 disp_hex_mux (Salida a Displays y Multiplexeo)
pg. 99
Sel
: in STD_LOGIC_VECTOR (1 downto 0);
clk : in STD_LOGIC;
reset : in STD_LOGIC;
segmentos : out std_logic_vector( 7 downto 0 );
Componente para encender display
anodos : out std_logic_vector( 3 downto 0 ); -Componente para multiplexar display
Salida : out STD_LOGIC_VECTOR (5 downto 0));
--
end ALU;
architecture Behavioral of ALU is
-- Declaracin de Seales Auxiliares
signal a: unsigned (Dato_A'range);
signal b: unsigned (Dato_B'range);
signal Salida_aux: unsigned (Salida'range);
signal numerobcd : unsigned( 15 downto 0 );
encender los 4 displays
-- 16 bits para
--===========================================================
-- Llamada al archivo componente "disp_hex_mux"
--===========================================================
COMPONENT disp_hex_mux
PORT(
clk : IN std_logic;
reset : IN std_logic;
hex3 : IN std_logic_vector(3 downto 0);
hex2 : IN std_logic_vector(3 downto 0);
hex1 : IN std_logic_vector(3 downto 0);
hex0 : IN std_logic_vector(3 downto 0);
dp_in : IN std_logic_vector(3 downto 0);
an : OUT std_logic_vector(3 downto 0);
sseg : OUT std_logic_vector(7 downto 0)
);
END COMPONENT;
-===========================================================================
=======
-- Funcin que recibe un valor binario de 16 bits y devuelve su
representacin
-- BCD de cuatro dgitos (16 bits).
-- Usa el algoritmo de corrimiento y suma 3.
function
bin_a_bcd(
bin
unsigned(15
downto
0))
return
unsigned is
variable i : integer := 0;
variable resultado : unsigned(
15
downto
:=
"0000000000000000";
pg. 100
-- Proceso de la ALU
PROCESS (a, b, Sel)
BEGIN
pg. 101
CASE Sel IS
WHEN "00" => Salida_aux <= RESIZE(a,Salida_aux'length) +
RESIZE(b,Salida_aux'length);
WHEN
"01"
=>
Salida_aux
<=
RESIZE((a
*
b),Salida_aux'length);
WHEN "10" => Salida_aux <= RESIZE((a(1 downto 0) &
a(2)),Salida_aux'length); -- Rot izq
WHEN "11" => Salida_aux <= RESIZE((a(0) & a(2 downto
1)),Salida_aux'length); -- Rot derecha
WHEN OTHERS => null;
END CASE;
END PROCESS;
--Conversin de entradas Dato_A y Dato_B a unsigned y asignacin a
seales auxiliares
a <= UNSIGNED(Dato_A);
b <= UNSIGNED(Dato_B);
--Salida a Leds
Salida <= std_logic_vector (Salida_aux);
end Behavioral;
Cdigo 7.2 ALU
pg. 102
pg. 103
pg. 104
Signal a : natural;
Signal a_aux : unsigned (7 downto 0);
Signal b : unsigned (7 downto 0);
Primero se convierte de natural a unsigned y se asigna a una seal
auxiliar a_aux
a_aux <= to_unsigned (a, 8);
seal_destino <= to_unsigned (seal_natural, #
nmero_bits_destino)
Despus se puede hacer la suma entre 2 seales de tipo unsigned y
despus convertirla a std_logic_vector para desplegarla en la salida Leds.
Leds <= std_logic_vector (a_aux + b);
pg. 105
pg. 106
pg. 107
BTN0_REG1
BTN0_REG2
elsif Clk'event
BTN0_REG1
BTN0_REG2
end if;
end process;
<= '0';
<= '0';
and Clk='1' then
<= BTN0;
<= BTN0_REG1;
pg. 109
Push = 1
Push = 0
Led0 <= 0
Push = 0
Led_O
N
Led_
OFF
Led0 <= 1
Push = 1
Figura 9.2 Diagrama de Estados FSM_Led
pg. 110
entity FSM_Led is
Port ( Push: in STD_LOGIC;
Clk : in STD_LOGIC;
Reset : in STD_LOGIC;
Led0 : out STD_LOGIC);
end FSM_Led;
Cdigo 9.1 Entidad FSM_Led
-=====================================================================
--Proceso que obtiene el estado siguiente y salidas (next-state
logic)
-=====================================================================
pg. 111
pg. 112
LED_OFF y LED_ON a
-- las seales que se declaren del tipo estados_led.
type estados_led is (LED_OFF, LED_ON);
-- Seales para el programa (ojo que
enumeracin XD)
signal state_reg, state_next : estados_led;
signal btn_reg : std_logic;
signal Push_tick : std_logic;
begin
son
componente
de
la
--===================================
--Detector de Flancos
--===================================
process(clk)
begin
if (clk'event and clk='1') then
btn_reg <= Push;
end if;
end process;
Push_tick <= (not btn_reg) and Push;
--==========================================================
-- Proceso que actualiza y guarda el estado del registro
--==========================================================
P_SEQ_FSM: Process (Reset, Clk)
begin
if Reset = '1' then
state_reg <= LED_OFF;
elsif Clk'event and Clk='1' then
state_reg <= state_next;
end if;
end process;
-=====================================================================
--Proceso que obtiene el estado siguiente y salidas (next-state
logic)
-=====================================================================
P_COMB_ESTADO: Process (state_reg, Push_tick)
begin
state_next <= state_reg; -- condicion de inicio y regreso a
estado actual
Led0 <= '0';
case state_reg is
when LED_OFF =>
if Push_tick = '1' then
state_next <= LED_ON;
pg. 113
end Behavioral;
Cdigo 9.4 Arquitectura FSM_Led
pg. 114
Pause
Dir
Figura 9.5 Diagrama de estados FSM_Rot_Led
pg. 115
Donde:
N = Constante de tipo Integer
T = Tiempo Deseado
De este modo se crea una Constante con un valor de 24 para obtener
un Tiempo de 0.33 segundos lo cual equivale a F = 1/T = 3 Hz. (3 Pulsos por
segundo).
El cdigo para lograr esta Divisin de Frecuencia queda como se
muestra en el Recuadro de Cdigo 9.5
constant N: integer:=24; -- 2^N * 20ns = reloj
signal q_reg, q_next: unsigned (N-1 downto 0);
signal Tick : std_logic;
begin
--===================================
--Contador que genera ticks de 0.3 seg
--===================================
process (clk)
begin
if (Clk'event and Clk='1') then
q_reg <= q_next;
end if;
end process;
-- next-state logic
q_next <= q_reg + 1;
-- tick de salida
Tick <= '1' when q_reg=0 else '0';
Cdigo 9.5 Divisor de Frecuencia
pg. 116
Led : out
end FSM_Rot_Led;
Pause_ent: in STD_LOGIC;
STD_LOGIC_VECTOR (7 downto 0));
--===================================
--Contador que genera ticks de 0.3 seg
--===================================
process (clk)
begin
if (Clk'event and Clk='1') then
pg. 117
-=====================================================================
--Proceso que obtiene el estado siguiente y salidas (next-state
logic)
-=====================================================================
P_COMB_ESTADO: Process (state_reg, Tick, Dir, Pause)
begin
state_next <= state_reg; -- 118 ondicin de inicio y regreso a
estado actual
case state_reg is
when s0 =>
Led_aux <= 00000001;
if Tick = 1 then
if Dir = 1 then
state_next <= s1;
else
state_next <= s7;
end if;
end if;
when s1 =>
Led_aux <= 00000010;
if Tick = 1 then
if Dir = 1 then
state_next <= s2;
else
pg. 118
pg. 119
else
state_next <= s6;
end if;
end if;
end case;
end process;
Led <= std_logic_vector (Led_aux);
end Behavioral;
Cdigo 9.6 FSM_Rot_Led
pg. 120
pg. 121
pg. 122
pg. 123
pg. 124
Donde:
D es el ciclo de trabajo
es el tiempo en que la funcin es positiva (ancho del pulso)
T es el perodo de la funcin
pg. 125
F
Posicin
I
entity Contador is
port (
pg. 126
end Contador;
architecture Behavioral of Contador is
begin
output: process(clk,reset)
variable cuenta : std_logic_vector(7 downto 0);
begin
-- Actualizar la cuenta
if (reset='1') then -- Reset asncrono
cuenta:=(others=>'0'); -- Inicializar contador
q<=cuenta;
elsif (clk'event and clk='1') then -- Flanco de subida en reloj
cuenta:=(cuenta+1); -- Incrementar contador
q<=cuenta;
end if;
end process;
end Behavioral;
Cdigo 11.1 Mdulo contador
pg. 127
end Behavioral;
Cdigo 11.3 - Mdulo PWM_OUT.
pg. 128
pg. 130
pg. 131
begin
--=============================================================
-- Conversin de los Porcentajes de la Entrada de los Switches
--=============================================================
process (Entrada) begin
case Entrada is
when "000000" => Porcentaje
when "000001" => Porcentaje
when "000010" => Porcentaje
when "000011" => Porcentaje
when "000100" => Porcentaje
when "000101" => Porcentaje
when "000110" => Porcentaje
when "000111" => Porcentaje
when "001000" => Porcentaje
when "001001" => Porcentaje
when "001010" => Porcentaje
when "001011" => Porcentaje
when "001100" => Porcentaje
when "001101" => Porcentaje
when "001110" => Porcentaje
when "001111" => Porcentaje
when "010000" => Porcentaje
when "010001" => Porcentaje
when "010010" => Porcentaje
when "010011" => Porcentaje
when "010100" => Porcentaje
when "010101" => Porcentaje
when "010110" => Porcentaje
when "010111" => Porcentaje
when "011000" => Porcentaje
when "011001" => Porcentaje
when "011010" => Porcentaje
when "011011" => Porcentaje
when "011100" => Porcentaje
when "011101" => Porcentaje
when "011110" => Porcentaje
when "011111" => Porcentaje
when "100000" => Porcentaje
when "100001" => Porcentaje
when "100010" => Porcentaje
when "100011" => Porcentaje
when "100100" => Porcentaje
when "100101" => Porcentaje
when "100110" => Porcentaje
when "100111" => Porcentaje
when "101000" => Porcentaje
when "101001" => Porcentaje
when "101010" => Porcentaje
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
"0000000" ; -- 0 0%
"0000001" ; -- 1 1%
"0000011" ; -- 2 3%
"0000100" ; -- 3 4%
"0000101"
; -- 4 6%
"0000111"
; -- 5 7%
"0001001"
; -- 6 9%
"0001011"; -- 7 11%
"0001100"
; -- 8 12%
"0001110"
; -- 9 14%
"0001111"
; -- 10 15%
"0010001"
; -- 11 17%
"0010011"
; -- 12 19%
"0010100"
; -- 13 20%
"0010110"
; -- 14 22%
"0010111"
; -- 15 23%
"0011001"
; -- 16 25%
"0011010"
; -- 17 26%
"0011100"
; -- 18 28%
"0011110"
; -- 19 30%
"0011111"
; -- 20 31%
"0100001"
; -- 21 33%
"0100010"
; -- 22 34%
"0100100"
; -- 23 36%
"0100110"
; -- 24 38%
"0100111"
; -- 25 39%
"0101001"
; -- 26 41%
"0101010"
; -- 27 42%
"0101100"
; -- 28 44%
"0101110"
; -- 29 46%
"0101111"
; -- 30 47%
"0110001"
; -- 31 49%
"0110010"
; -- 32 50%
"0110100"
; -- 33 52%
"0110101"
; -- 34 53%
"0110111"
; -- 35 55%
"0111001"
; -- 36 57%
"0111011"
; -- 37 58%
"0111100"
; -- 38 60%
"0111101"
; -- 39 61%
"0111111"
; -- 40 63%
"1000001"
; -- 41 65%
"1000010"
; -- 42 66%
pg. 132
PORT MAP(
--================================
-- Salida a Display
--================================
Porcentaje_aux (6 downto 0) <= Porcentaje;
hex <= bin_a_bcd(Porcentaje_aux);
end Behavioral;
Cdigo 12.1 - Mdulo Porcentaje.
pg. 133
usuario por medio de los 6 bits de la seal entrada (El clculo se realiz por
simple regla de tres).
Ahora solo queda mapear este componente dentro del mdulo PWM
para que el proyecto quede terminado, el cdigo del proyecto ya terminado
se muestra en el recuadro de cdigo 12.2.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity PWM is
port (pwm_pos : in std_logic_vector (5 downto 0); -- Posicion
pwm_clk : in std_logic; -- Reloj
pwm_reset: in std_logic; -- Reset.
pwm_o : out std_logic; -- Seal PWM
an: out std_logic_vector (3 downto 0);
sseg: out std_logic_vector (7 downto 0));
end PWM;
architecture Behavioral of PWM is
--==================================
-- Instalacion de Contador
--==================================
component contador is
port (clk : in std_logic; -- Reloj
reset : in std_logic;
q : out std_logic_vector (5 downto 0)); --Salida
end component;
--==================================
-- Instalacion de Comparador
--==================================
component comparador is
port (opa : in std_logic_vector(5 downto 0); -- Operador A
opb : in std_logic_vector(5 downto 0); -- Operador B
G : out std_logic);
end component;
--==================================
-- Instalacion Displays a porcentaje
--================================== o algo asi?
COMPONENT Porcentaje
PORT(
Entrada : IN std_logic_vector(5 downto 0);
clk : IN std_logic;
an : OUT std_logic_vector(3 downto 0);
sseg : OUT std_logic_vector(7 downto 0)
);
END COMPONENT;
pg. 134
pg. 135
pg. 136
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity Contador_Ticks_10ms is
Port ( clk : in STD_LOGIC;
Pulso : out STD_LOGIC);
end Contador_Ticks_10ms;
architecture Behavioral of Contador_Ticks_10ms is
constant N: integer:=19; -- 2^N * 20ns = 10 ms reloj
signal q_reg, q_next: unsigned (N-1 downto 0);
signal Tick : std_logic;
type Sreg0_type is (Pulso_OFF, Pulso_ON);
signal state_reg, state_next: Sreg0_type;
begin
--===================================
--Contador que genera ticks de 10 ms
--===================================
process (clk)
begin
pg. 137
Pulso_ON;
Pulso_OFF;
Pulso_OFF;
Pulso_ON;
end Behavioral;
Cdigo 13.1 Generador de pulsos
pg. 138
pg. 139
end Behavioral;
Cdigo 13.2 Seal PWM con Generador de Pulsos de 10ms
pg. 141
Figura 14.3 Circuito para el acondicionamiento de seal, con salida hacia el FPGA.
pg. 142
pg. 143
-- Registro de Estado
process (clk, reset)
begin
if (reset = '1') then
state_reg <= zero;
elsif (clk'event and clk='1') then
state_reg <= state_next;
end if;
end process;
-- logica de estados y salidas
process (state_reg, sw, m_tick)
begin
state_next <= state_reg; -- parametro default
db <= '0'; -- default 0
case state_reg is
when zero =>
if sw = '1' then
state_next <= wait1_1;
end if;
when wait1_1 =>
if sw = '0' then
state_next <= zero;
else
if m_tick = '1' then
state_next <= wait1_2;
end if;
end if;
when wait1_2 =>
if sw = '0' then
state_next <= zero;
else
if m_tick = '1' then
state_next <= wait1_3;
end if;
end if;
when wait1_3 =>
if sw = '0' then
state_next <= zero;
else
if m_tick = '1' then
state_next <= one;
end if;
end if;
when one =>
db <= '1';
if sw = '0' then
state_next <= wait0_1;
end if;
when wait0_1 =>
db <= '1';
pg. 144
if sw = '1' then
state_next <= one;
else
if m_tick = '1' then
state_next <= wait0_2;
end if;
end if;
when wait0_2 =>
db <= '1';
if sw = '1' then
state_next <= one;
else
if m_tick = '1' then
state_next <= wait0_3;
end if;
end if;
when wait0_3 =>
db <= '1';
if sw = '1' then
state_next <= one;
else
if m_tick = '1' then
state_next <= zero;
end if;
end if;
end case;
end process;
--====================================
--Detector de Flancos
--====================================
process(clk)
begin
if (clk'event and clk='1') then
db_reg <= db;
end if;
end process;
--db_reg <= db when m_tick = '1' else db_reg;
Flanco_Enable <= ((not db_reg) and db);
end Behavioral;
Cdigo 14.1 Modulo debounce_FSM con Flanco_Enable.
pg. 145
pg. 146
);
END COMPONENT;
-===========================================================================
========
-- Funcin que recibe un valor binario de 4 bits y devuelve su
representacin
-- BCD de tres dgitos (8 bits).
-- Usa el algoritmo de corrimiento y suma 3.
-===========================================================================
========
function
bin_a_bcd(
bin
unsigned(3
downto
0))
return
unsigned is
variable i : integer := 0;
variable resultado : unsigned(
downto
:=
"00000000";
variable copiabin : unsigned( 3 downto 0 ) := bin;
begin
-- Aqu va el cdigo de la funcin
for i in 0 to 3 loop
resultado( 7 downto 1 ) := resultado( 6 downto 0
);
resultado( 0 ) := copiabin( 3 );
copiabin( 3 downto 1 ) := copiabin( 2 downto 0 );
copiabin( 0 ) := '0';
-- unidades
if i < 3 and resultado( 3 downto 0 ) > "0100"
then
resultado( 3 downto 0 ) := resultado( 3
downto 0 ) + "0011";
end if;
-- decenas
if i < 3 and resultado( 7 downto 4 ) > "0100"
then
resultado( 7 downto 4 ) := resultado( 7
downto 4 ) + "0011";
end if;
-- centenas
--if i < 7 and resultado( 11 downto 8 ) > "0100"
then
--
downto 8 ) + "0011";
--end if;
end loop;
return resultado;
pg. 147
end bin_a_bcd;
--============================================
--Seales Auxiliares (Reg Reloj y cuenta)
--============================================
constant N: integer:=4; -- 2^N * 20ns = 10 ms reloj
signal q_reg, q_next: unsigned (N-1 downto 0);
signal sensor_enable : STD_LOGIC;
-- Seales Display
signal hex0: unsigned (7 downto 0);
begin
--============================================
--Mapeo Antirrebotes
--============================================
Inst_Debounce_fsm: Debounce_fsm PORT MAP(
clk => clk ,
reset => reset,
sw => Sensor,
Flanco_Enable => sensor_enable
);
--============================================
-- Mapeo Display_Mux
--============================================
Inst_disp_hex_mux: disp_hex_mux PORT MAP(
clk => clk,
reset => reset,
hex3 => "0000",
hex2 => "0000",
hex1 => std_logic_vector (hex0 (7 downto 4)),
hex0 => std_logic_vector (hex0 (3 downto 0)),
dp_in => "1111",
an => an,
sseg => sseg
);
--===================================
--Contador que genera ticks de 10 ms
--===================================
process (clk,reset)
begin
if reset = '1' then
q_reg <= (others => '0');
elsif(clk'event and clk='1') then
q_reg <= q_next;
end if;
end process;
pg. 148
-- next-state logic
q_next <= q_reg + 1 when (sensor_enable = '1') else
q_reg;
--================
--Cast de salida
--================
Cuenta <= std_logic_vector (q_reg);
Cuenta_max <= '1' when q_reg = 15 else '0';
--====================================
-- Salida a Displays y conversin
--====================================
hex0 <= bin_a_bcd(q_reg);
end Behavioral;
Cdigo 14.2 Mdulo Sensor_Prox.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity Motor_Sensor is
port (
CLK: in STD_LOGIC;
Sensor: in STD_LOGIC;
reset: in STD_Logic;
Cuenta: out std_logic_vector (3 downto 0);
an: out std_logic_vector (3 downto 0);
sseg: out std_logic_vector (7 downto 0);
Stop_emerg: in STD_LOGIC;
Motor: out STD_LOGIC);
end;
architecture motor_on_arch of Motor_Sensor is
pg. 149
begin
--========================================
-- Mapeo Sensor_Prox
--========================================
Inst_Sensor_Prox: Sensor_Prox PORT MAP(
Sensor => Sensor,
reset => reset,
clk => CLK,
Cuenta => Cuenta,
an => an,
cuenta_max => cuenta_max,
sseg => sseg
);
--=========================================
--Detector de Flancos
--=========================================
process(CLK)
begin
if (CLK'event and CLK='1') then
cuenta_reg <= cuenta_max;
end if;
end process;
--db_reg <= db when m_tick = '1' else db_reg;
cuenta_flanco <= ((not cuenta_reg) and cuenta_max);
--==========================================
pg. 150
end motor_on_arch;
Cdigo 14.3 Mdulo Motor_Sensor.
pg. 151
Mdulos Necesarios:
Contador Cdigo 11.1
Comparador Cdigo 11.2
Disp_hex_mux Cdigo 7.1
Contador_UP_DOWN Cdigo 15.2
entity pwm_unit is
Port ( --pwm_pos : in
STD_LOGIC_VECTOR (5 downto 0); -- BITS DE
ENTRADA SWITCHES
pwm_clk : in STD_LOGIC;
P_up : in STD_LOGIC;
P_down : in STD_LOGIC;
--sal: out std_logic;
--Pulso: out std_logic;
--led_enable: out std_logic;
--start: in std_logic;
pwm_motor: out std_logic;
pwm_led:out std_logic;
an: out std_logic_vector (3 downto 0);
sseg: out std_logic_vector (7 downto 0));
end pwm_unit;
architecture Behavioral of pwm_unit is
COMPONENT Contador_UP_DOWN
PORT(
P_up1 : IN std_logic;
P_down1 : IN std_logic;
clk : IN std_logic;
reset : IN std_logic;
cuenta : OUT std_logic_vector(7 downto 0);
an : OUT std_logic_vector(3 downto 0);
sseg : OUT std_logic_vector(7 downto 0)
);
END COMPONENT;
COMPONENT contador
PORT(
clk : IN std_logic;
reset : IN std_logic;
q : OUT std_logic_vector(7 downto 0)
);
END COMPONENT;
component comparador is
pg. 152
-- Operador A
-- Operador B
signal ntic
: std_logic_vector (7 downto 0); -- Numero de tics de
reloj
--signal ntic_ms: std_logic_vector (3 downto 0); -- 8 bits menos peso
de ntic
--signal sg
: std_logic; -- Seal G
signal pwm_o : std_logic;
signal pwm_pos : std_logic_vector (7 downto 0);
--Inicio de Arquitectura
begin
--enable<= not start;
--led_enable<= start;
CONT1: contador
port map (clk=>pwm_clk, q=>ntic, reset=> '0');
COMP1: comparador port map (opa=>ntic, opb=>pwm_pos, G=> pwm_o);
Inst_Contador_UP_DOWN: Contador_UP_DOWN PORT MAP(
P_up1 => P_up,
P_down1 => P_down,
clk => pwm_clk,
reset => '0',
cuenta => pwm_pos,
an => an,
sseg => sseg
);
end Behavioral;
Cdigo 15.1 Pwm_unit
pg. 153
pg. 154
copiabin( 0 ) := '0';
-- unidades
if i < 11 and resultado( 3 downto 0 ) > "0100" then
resultado( 3 downto 0 ) := resultado( 3 downto 0 ) +
"0011";
end if;
-- decenas
if i < 11 and resultado( 7 downto 4 ) > "0100" then
resultado( 7 downto 4 ) := resultado( 7 downto 4 ) +
"0011";
end if;
-- centenas
if i < 11 and resultado( 11 downto 8 ) > "0100" then
resultado( 11 downto 8 ) := resultado( 11 downto 8 ) +
"0011";
end if;
-- millares
--if i < 15 and resultado (15 downto 12) > "0100" then
-resultado ( 15 downto 12 ) := resultado ( 15 downto 12
) + "0011";
--end if;
end loop;
return resultado;
end bin_a_bcd;
--==============================================
--Display instansiacin
--==============================================
COMPONENT disp_hex_mux
PORT(
clk : IN std_logic;
reset : IN std_logic;
hex3 : IN std_logic_vector(3 downto 0);
hex2 : IN std_logic_vector(3 downto 0);
hex1 : IN std_logic_vector(3 downto 0);
hex0 : IN std_logic_vector(3 downto 0);
dp_in : IN std_logic_vector(3 downto 0);
an : OUT std_logic_vector(3 downto 0);
sseg : OUT std_logic_vector(7 downto 0)
);
END COMPONENT;
begin
--====================================
--Detector de Flancos
pg. 155
--====================================
--process(clk)
--begin
-if (clk'event and clk='1') then
-db_reg_up1 <= P_up1;
-db_reg_down1 <= P_down1;
-end if;
--end process;
--=============================================
-- Generador de Ticks de 0.6 s
--=============================================
process (clk)
begin
if (clk'event and clk='1') then
q_reg <= q_next;
end if;
end process;
-- next-state logic
q_next <= q_reg + 1;
-- tick de salida
Tick <= '1' when q_reg=0 else '0';
--=============================================
-- Contador Up / Down
--=============================================
P_conta: Process (reset, clk)
begin
if reset = '1' then
conta <= 0;
elsif clk'event and clk='1' then
if Tick = '1' and P_up1 = '1' then
if conta /= 100 then
conta <= conta + 1;
end if;
elsif Tick = '1' and P_down1 = '1' then
if conta /= 0 then
conta <= conta - 1;
end if;
end if;
end if;
end process;
pg. 156
end Behavioral;
Cdigo 15.2 Contador_UP_DOWN
pg. 157
-===========================================================================
=======
entity mod_m_counter is
generic (
N: integer := 6; -- numero de bits
M: integer := 40 MOD-M
);
Port ( clk : in STD_LOGIC;
reset : in STD_LOGIC;
max_tick : out STD_LOGIC);
--q : out STD_LOGIC_VECTOR (N-1 downto 0));
end mod_m_counter;
architecture Behavioral of mod_m_counter is
signal r_reg: unsigned (N-1 downto 0);
signal r_next: unsigned (N-1 downto 0);
begin
-===========================================================================
=======
--Registro cambio de estado
-===========================================================================
=======
process (clk, reset)
begin
if (reset = 1) then
r_reg <= (others => 0);
elsif (clkevent and clk = 1) then
r_reg <= r_next;
end if;
end process;
-===========================================================================
========
--Logica de cambio de estado
-===========================================================================
========
r_next <= (others => 0) when r_reg = (M-1) else
r_reg + 1;
-===========================================================================
pg. 158
========
--Salida
-===========================================================================
========
--q <= std_logic_vector (r_reg);
max_tick <= 1 when r_reg = (M-1) else 0;
end Behavioral;
Cdigo 16.1 Mdulo mod_m_counter
entity fifo is
generic (
B: natural :=8 ; -- 8 Numero de Bits
W: natural :=4 -- 4 Number of Address Bits
);
Port ( clk : in STD_LOGIC;
reset : in STD_LOGIC;
pg. 159
rd : in STD_LOGIC;
wr : in STD_LOGIC;
w_data : in STD_LOGIC_VECTOR (B-1 downto 0);
empty : out STD_LOGIC;
full : out STD_LOGIC;
r_data : out STD_LOGIC_VECTOR (B-1 downto 0));
end fifo;
architecture Behavioral of fifo is
type reg_file_type is array (2**W-1 downto 0) of
std_logic_vector (B-1 downto 0);
signal array_reg: reg_file_type;
signal w_ptr_reg, w_ptr_next, w_ptr_succ:
std_logic_vector (W-1 downto 0);
signal r_ptr_reg, r_ptr_next, r_ptr_succ:
std_logic_vector (W-1 downto 0);
signal full_reg, empty_reg, full_next, empty_next: std_logic;
signal wr_op: std_logic_vector (1 downto 0);
signal wr_en: std_logic;
begin
--=================================================================
--registro
--=================================================================
process (clk, reset)
begin
if (reset = '1') then
array_reg <= (others =>(others => '0'));
elsif (clk'event and clk='1') then
if wr_en='1' then
array_reg(to_integer(unsigned(w_ptr_reg)))
<= w_data;
end if;
end if;
end process;
-- Lectura del puerta
r_data <= array_reg(to_integer(unsigned(r_ptr_reg)));
-- Write Enabled solo cuando FIFO no esta lleno
wr_en <= wr and (not full_reg);
--==================================================================
-- FIFO control logic
--==================================================================
-- registro para leer y escribir punteros (pointers)
process(clk, reset)
begin
if (reset = '1') then
w_ptr_reg <= (others => '0');
pg. 160
pg. 161
--salidas
full <= full_reg;
empty <= empty_reg;
end Behavioral;
Cdigo 17.1 Mdulo FIFO
Mdulos:
FIFO Cdigo 17.1
Mod_m_couter Cdigo 16.1
Kb_code Cdigo 18.1
Kb_monitor Cdigo 18.2
Key2ascii Cdigo 18.3
PS2_RX Cdigo 18.4
Kb_led Cdigo 18.5
-===========================================================================
==
-- PS2 keyboard last-releases key circuit
-===========================================================================
==
entity kb_code is
pg. 162
pg. 163
entity kb_monitor is
Port ( clk : in STD_LOGIC;
reset : in STD_LOGIC;
ps2d : in STD_LOGIC;
ps2c : in STD_LOGIC;
tx : out STD_LOGIC);
end kb_monitor;
architecture Behavioral of kb_monitor is
constant SP: std_logic_vector (7 downto 0) := "00100000";
-- blank space in ASCII
type statetype is (idle, send1, send0, sendb);
signal state_reg, state_next: statetype;
signal scan_data, w_data: std_logic_vector (7 downto 0);
signal scan_done_tick, wr_uart: std_logic;
signal ascii_code: std_logic_vector (7 downto 0);
signal hex_in: std_logic_vector (3 downto 0);
begin
--====================================================================
-- Inicializacion PS2 RECEIVER
--====================================================================
PS2_RX_unit: entity work.PS2_RX (Behavioral)
pg. 164
port map (clk => clk, reset => reset, rx_en => '1',
ps2d => ps2d, ps2c => ps2c,
rx_done_tick => scan_done_tick,
dout => scan_data);
--====================================================================
-- Inicializacion UART
--====================================================================
UART_unit: entity work.UART (Behavioral)
port map (clk => clk, reset => reset, rd_uart => '0',
wr_uart => wr_uart, rx => '1', w_data =>
w_data,
tx_full => open, rx_empty => open, r_data =>
open,
tx => tx);
--====================================================================
-- FSM para enviar 3 Caracteres ASCII
--====================================================================
-- REGISTROS DE ESTADO
process (clk, reset)
begin
if reset = '1' then
state_reg <= idle;
elsif (clk'event and clk = '1') then
state_reg <= state_next;
end if;
end process;
-- next state logic
process (state_reg, scan_done_tick, ascii_code)
begin
wr_uart <= '0';
w_data <= SP;
state_next <= state_reg;
case state_reg is
when idle => -- start when a scan code received
if scan_done_tick = '1' then
state_next <= send1;
end if;
when send1 => -- send higher hex char
w_data <= ascii_code;
wr_uart <= '1';
state_next <= send0;
when send0 => -- send lower hex char
w_data <= ascii_code;
wr_uart <= '1';
state_next <= sendb;
when sendb => -- send blank space char
pg. 165
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
"0000",
"0001",
"0010",
"0011",
"0100",
"0101",
"0110",
"0111",
"1000",
"1001",
"1010",
"1011",
"1100",
"1101",
"1110",
others;
-----------------
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
end Behavioral;
Cdigo A.9 Mdulo Kb_monitor
entity key2ascii is
Port ( key_code : in STD_LOGIC_VECTOR (7 downto 0);
ascii_code : out STD_LOGIC_VECTOR (7 downto 0));
end key2ascii;
architecture Behavioral of key2ascii is
begin
with key_code select
ascii_code <=
"00110000" when "01000101", -- 0
"00110001" when "00010110", -- 1
pg. 166
"00110010"
"00110011"
"00110100"
"00110101"
"00110110"
"00110111"
"00111000"
"00111001"
when
when
when
when
when
when
when
when
"00011110",
"00100110",
"00100101",
"00101110",
"00110110",
"00111101",
"00111110",
"01000110",
---------
2
3
4
5
6
7
8
9
"01000001"
"01000010"
"01000011"
"01000100"
"01000101"
"01000110"
"01000111"
"01001000"
"01001001"
"01001010"
"01001011"
"01001100"
"01001101"
"01001110"
"01001111"
"01010000"
"01010001"
"01010010"
"01010011"
"01010100"
"01010101"
"01010110"
"01010111"
"01011000"
"01011001"
"01011010"
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
"00011100",
"00110010",
"00100001",
"00100011",
"00100100",
"00101011",
"00110100",
"00110011",
"01000011",
"00111011",
"01000010",
"01001011",
"00111010",
"00110001",
"01000100",
"01001101",
"00010101",
"00101101",
"00011011",
"00101100",
"00111100",
"00101010",
"00011101",
"00100010",
"00110101",
"00011010",
---------------------------
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
"01100000"
"00101101"
"00111101"
"01011011"
"01011101"
"01011100"
"00111011"
"00100111"
"00101100"
"00101110"
"00101111"
when
when
when
when
when
when
when
when
when
when
when
"00001110",
"01001110",
"01010101",
"01010100",
"01011011",
"01011101",
"01001100",
"01010010",
"01000001",
"01001001",
"01001010",
------------
'
=
{
}
\
;
,
.
/
"00100000"
"00001101"
"00001000"
"00101010"
when
when
when
when
"00101001", -- (space)
"01011010", -- (enter, cr)
"01100110", -- (backspace)
others; -- *
pg. 167
end Behavioral;
Cdigo 18.2 Mdulo key2ascii
entity PS2_RX is
Port ( clk : in STD_LOGIC;
reset : in STD_LOGIC;
ps2d : in STD_LOGIC; -- key data
ps2c : in STD_LOGIC; -- key clock
rx_en : in STD_LOGIC;
rx_done_tick : out STD_LOGIC;
dout : out STD_LOGIC_VECTOR (7 downto 0));
end PS2_RX;
architecture Behavioral of PS2_RX is
type statetype is (idle, dps, load);
signal state_reg, state_next: statetype;
signal filter_reg, filter_next: std_logic_vector(7 downto 0);
signal f_ps2c_reg, f_ps2c_next: std_logic;
signal b_reg, b_next: std_logic_vector (10 downto 0);
signal n_reg, n_next: unsigned (3 downto 0);
signal fall_edge: std_logic;
begin
-=========================================================================
-- Filtro y detector de flancos --- ticks generados para ps2c
-=========================================================================
process(clk, reset)
begin
if reset = '1' then
filter_reg <= (others => '0');
f_ps2c_reg <= '0';
elsif (clk'event and clk = '1') then
filter_reg <= filter_next;
f_ps2c_reg <= f_ps2c_next;
end if;
end process;
filter_next <= ps2c & filter_reg(7 downto 1);
f_ps2c_next <= '1' when filter_reg = "11111111" else
'0' when filter_reg = "00000000" else
f_ps2c_reg;
fall_edge <= f_ps2c_reg and (not f_ps2c_next);
-=========================================================================
-- FSMD to extract the 8 - bit data
--
pg. 168
=========================================================================
process (clk, reset)
begin
if reset = '1' then
state_reg <= idle;
n_reg <= (others => '0');
b_reg <= (others => '0');
elsif (clk'event and clk = '1') then
state_reg <= state_next;
n_reg <= n_next;
b_reg <= b_next;
end if;
end process;
-- next state logic
process (state_reg, n_reg, b_reg, fall_edge, rx_en, ps2d)
begin
rx_done_tick <= '0';
state_next <= state_reg;
n_next <= n_reg;
b_next <= b_reg;
case state_reg is
when idle =>
if fall_edge = '1' and rx_en = '1' then
-- shift in start bit
b_next <= ps2d & b_reg (10 downto 1);
n_next <= "1001";
state_next <= dps;
end if;
when dps => -- 8 data + 1 parity + 1 stop
if fall_edge = '1' then
b_next <= ps2d & b_reg (10 downto 1);
if n_reg = 0 then
state_next <= load;
else
n_next <= n_reg - 1;
end if;
end if;
when load =>
-- 1 extra clock to complete the last shift
state_next <= idle;
rx_done_tick <= '1';
end case;
end process;
-- salidas
dout <= b_reg (8 downto 1); -- data bits
end Behavioral;
Cdigo 18.3 Mdulo PS2_RX
pg. 169
pg. 170
CONCLUSIONES Y RECOMENDACIONES
Tarjeta Basys2 Viable en el control de Procesos.
pg. 171
REFERENCIAS BIBLIOGRFICAS
1
www.xilinx.com/support/documentation/data_sheets/ds312.pdf
http://www.digilentinc.com/Products/Detail.cfm?NavPath=2,400,790&Prod=B
ASYS2
6
http://www.mexchip.com/categor%C3%ADas/tutoriales/vhdl/
pg. 172