Sei sulla pagina 1di 41

UPIITA-IPN Materia: Circuitos Lógicos

Práctica No. 8 y 9: Contadores y registros universales. Número de mesa: 1


Álvarez Gómez Julio César Nombre de la empresa: Mexilogics
Galván Escobar Adrián Raúl Grupo: 2MV12
Mata Prieto Varush
Varela Alpizar Benjamin

Resumen
En este reporte se emplearan los circuitos contadores y registros de corrimiento alimentados
por el reloj interno de la FPGA Amiba 2 para el desarrollo de distintas aplicaciones tales
como un multiplicador y divisor por 2 y 4 con salida a displays de 7 segmentos e ingreso de
datos vía encoder mecánico rotatorio, la generación de señales rampa y senoidal para su
muestreo en osciloscopio, así como el control de apagado-encendido de una carga AC a
través del envío de comandos por una aplicación Bluetooth controlada por un smartphone.
Abstract
In this report we will use the counter circuits and shift registers of the FPGA Amiba 2 for the
development of different applications such as a multiplier and divider by 2 and 4 with output
to a 7 segments displays and its data input via rotary mechanical encoder, the generation of
ramp and sinusoidal signals for sampling in oscilloscope, as well as the on-off control of an
AC load through the sending of commands by a Bluetooth Aplication controlled by a
smartphone.
Résumé
Dans ce compte-rendu on utilisera les circuits de comptage et les registres à decalage
alimentés par l’horloge interne du FPGA Amiba 2 pour le developement de differents
applications comme un multiplicateur et diviseur par 2 et 4 avec affichage en displays de 7
segments et entrée de données via encodeur mécanique rotatif., la generation des signaux
rampe et sinusoïdaux pour son affichage sur un oscilloscope, ainsi que le controle ON-OFF
d'une charge en Courant Alterne en envoyant des commandes via une application Bluetooth
contrôlée par un smartphone.
Tabla de contenidos
Puntos VHDL Verilog UCF Fotos Diagramas Tabla Simulación
1.- Traffic light
with 2 modes
2.- Drum toy
with U/D
3.- Music
generator, 3
modes, display

1
4.- Mult x2x4
Div x2x4
✓ ✓ ✓ ✓
5 (i).- Position
controller
parabolic antena
5 (ii).- Position
controller for an
arm and gripper
w/servomotors
5 (iii).- Ramp and
sinusoidal signal
✓ ✓ ✓ ✓
generator and
DAC.
6 (i).- Bluetooth
controller
✓ ✓ ✓ ✓
6 (ii).-TV remote
control
6 (iii).- Position
controller for an
arm and gripper
w/servomotors
CH1 (1)
CH2 (2)

Introducción
Un circuito secuencial síncrono (regido por un tren de pulsos de reloj) consiste en un grupo
de flip-flops y compuertas lógicas combinacionales (opcionales) conectados con una
retroalimentación. Los flip-flops son esenciales para proveedor el carácter secuencial a los
circuitos lógicos (por lo que no habría ninguna retroalimentación). 2 elementos
fundamentales que contienen circuitos combinacionales y circuitos secuenciales son los
registros y los contadores.
Registros
Consiste en el conjunto de celdas binarias acondicionadas para la retención y/o
desplazamiento de información binaria. En otras palabras, los registros están constituidos por
flip-flops, donde cada flip-flop es una celda binaria capaz de almacenar un bit de
información. En adición a los flip-flops, los registros pueden tener compuestas de lógica
combinacional para realizar tareas del procesamiento de los datos. Para esta práctica, se hará
uso de los registros de corrimiento.

2
Registro de corrimiento
Estos se forman de una cadena de flip-flops conectados en cascada (donde la salida de un FF
se conecta a la entrada del siguiente FF) y reciben el mismo pulso de reloj que causa el
corrimiento de una etapa a la siguiente (ver figura 1).

Figura 1.- Registro de desplazamiento de 5 bits para salida en paralelo

Estos registros sirven para la transmisión de información de forma serial (transferencia y


manipulación de datos bit a bit) o paralela (Transferencia y manipulación de datos por
conjuntos de bits), así como convertir los datos seriales en datos en paralelo y viceversa.
Podemos clasificar los distintos tipos de registros de acuerdo con la forma en que los datos
pueden ingresar para su almacenamiento, así como la forma en que se les da salida del
registro, lo cual se lista a continuación.
• PIPO (Parallel Input – Parallel Output)
• PISO (Parallel Input – Serial Output)
• SISO (Serial Input – Serial Output)
• SIPO (Serial Input – Parallel Output) (insertar imágenes de estos tipos de registros)
Contadores
Se trata de los circuitos secuenciales que pueden o no depender de una señal de reloj
(síncronos y asíncronos).
• Asíncronos: Diseñados para aplicar la señal de reloj al primer FF y la salida de este
alimenta al segundo FF y así sucesivamente hasta el último del circuito.
• Síncronos: Deseñados mediante la conexión del pulso de reloj a todos los FF.
Otra forma de clasificarlos es por el número de estados, números de FF:
• Contadores binarios (2, 3, 4 bits, etc)
• Por módulos (por ejemplo, módulo 5 cuenta de 1 a 4 o de 0 a 4)
• Ascendentes, descendentes, o ascendentes-descendentes (up-down)
• Ciclados o no ciclados

3
Para esta práctica se emplearán este tipo de circuitos para el diseño de las aplicaciones
abarcadas.
Convertidor Analógico-Digital (Red R2R)
Se trata del circuito encargado de traducir un valor digital de X bits a una señal equivalente
analógica. Por lo tanto, pasamos de datos binarios (1’s y 0’s) a valores distintos de voltaje.
Ahora bien, este convertidor se obtiene a través del arreglo de resistencias R2R o Red R2R,
la cual se construye como indica la figura 2.

Figura 2.- Red “R2R” para un Convertidor Digital-Analógico (DAC) de 4 bits

En la imagen anterior vemos que los bits de b3 a b0, siendo el bit b3 el más significativo
(MSB) y b0 el menos significativo (LSB). Como su nombre lo indica, la red R2R necesita de
arreglos de resistencias de una resistencia y el doble de su valor, para formar divisores de
tensión, siendo las resistencias 2R las que están en serie con los bits de entrada de la señal
digital, mientras que las resistencias R interconectan a los bits de entrada. De igual manera
hay que resaltar que la última resistencia de este arreglo (conectada a GND) será de un valor
2R.
Funcionamiento de la Red R2R
Con ayuda del teorema de superposición y del teorema de Thévenin podemos calcular el
voltaje en los nodos de cada bit, haciendo esto encontramos que, para el arreglo de 4 bits
mostrado anteriormente tenemos (ver figura 3):

4
Figura 3.- Voltajes en cada bit de la red “R2R” para un DAC de 4 bits

Observamos que la aportación de cada bit del ADC está dado por la siguiente expresión:
𝑉𝐶𝐶
𝑉𝑏𝑖 =
2(𝑛−𝑖)
Donde:
• n es la cantidad de bits del ADC
• i es la posición del bit
Así, para el caso de b0 y b3 para el arreglo de la imagen anterior de 4 bits:
𝑉𝐶𝐶 𝑽𝑪𝑪
𝑽𝒃𝟎 = =
2(4−0) 𝟏𝟔
𝑉𝐶𝐶 𝑽𝑪𝑪
𝑽𝒃𝟑 = =
2(4−3) 𝟐
Por lo que en los bits de este arreglo tendremos salidas de voltaje ponderadas a las distintas
potencias de 2 (que dependerán del número de bits del arreglo R2R). Para esta práctica, se
utilizaron 2 redes R2R de 8 bits cada una para la representación de las señales en el punto 5
y para proyectar las señales de este punto hicimos uso del osciloscopio de 2 canales del
laboratorio de Electrónica III.

5
Módulo Bluetooth BT HC-06
Este módulo permite conectar a la FPGA con un celular, PC, de forma inalámbrica. Para la
comunicación bluetooth es necesario tener 2 dispositivos: un maestro y un esclavo. Para
conectar la FPGA con un smartphone, para el caso del BT HC-06 (ver figura 4) ya está
configurado como esclavo de fábrica (mientras que el maestro es el smartphone).
Especificaciones técnicas del módulo BT HC-06:
• Voltaje de operación: 3.3 V – 5 V
• Corriente de operación < 40 mA
• Bluetooth versión 2.0
• Interfaz de comunicación Serial UART TTL
• Baudrate por defecto: 9600
• Compatible con Android
Mientras que los pines de este módulo se ven en la figura 4.
Este módulo fue empleado para el punto 6 de la práctica, en conjunto con el módulo
de 4 relevadores con optoacopladores (ya abarcado en reportes anteriores)
Figura 4.- Pinout del
módulo BT HC-06

Desarrollo
1.- Aplicación de semáforos simples con fotoresistencia y etapa de potencia. Semáforo
principal con temporizador y mensaje de voz.
No se presentó este punto en el laboratorio.
2.- Aplicación de un tambor que cuenta del 1 al 10 (Up-Dowm) con RGB, mensajes de
voz, sensor de impacto y circuito antirrebote.
No se presentó este punto en el laboratorio.
3.- Aplicación de un generador de sonido (alarma, música y efecto especial), 7-seg.
No se presentó este punto en el laboratorio.
4.- Aplicación de los registros en la multiplicación y división con factores de 2 y 4, salida
a display 7-seg.
Para esta aplicación se realizaron las operaciones de multiplicación x2, x4 y división /2, /4
(y mediante push buttons decidíamos que operación realizar). El ingreso del número para las
operaciones se realizó a través de un encoder mecánico rotatorio y este dato se muestra en
los displays de la FPGA (fila 1). De igual manera, el resultado de la operación se muestra en
los displays de la FPGA (fila 2).

6
Este código está compuesto por 6 componentes:
• Componente para el comportamiento del encoder mecánico rotatorio. (U1)
• Componente encargado de la conversión de binario a decimal por la metodología
“shift and add 3” (U2)
• Componente encargado de las operaciones x2, x4, /2. /4. (U3)
• Componente para mostrar los datos numéricos en los displays de 7 segmentos
incorporados en la FPGA. (U4)
• Componente para la función antirrebote de los push-buttons (U5)
• Componente para el divisor de frecuencia para el muestreo en los displays de 7
segmentos. (U6)
Los diagramas esquemáticos para este punto fueron:

Figura 5.- Encoder mecánico rotatorio y su asignación de pines para la FPGA.

Figura 6.- Esquemático del circuito de Figura 7.- Esquemático del circuito para los
alimentación a los displays incorporados en la push buttons incorporados en la FPGA Amiba
FPGA Amiba 2. 2.

7
Figura 8.- Esquemático y asignación de pines de la calculadora x2, x4, /2, /4 de la FPGA Amiba 2.

El código empleado (en VHDL) fue el siguiente:


• Código principal
----------------------------------------------------------------------
------------
-- MEXILOGICS: CON UN ENCODER MECÁNICO SE AUMENTA EN UNO UN DATO DE 8
BITS
-- AL PRESIONAR UN BOTÓN ESE DATO ES MULTIPLICADO X2,X4,/2 Ó /4
----------------------------------------------------------------------
------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_arith.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;

entity encoder_cont is

port (
clk : in std_logic;
Ain,Bin,BTN : in STD_LOGIC; -- rotary encoder to lower JA
Multx2,Divx2,Multx4,Divx4,orig : in std_logic;
leds : out std_logic_vector(7 downto 0);
DISPLAY: out STD_LOGIC_VECTOR(7 downto 0); -- segments of display
AN: OUT STD_LOGIC_VECTOR(7 downto 0) -- anodes
);
end encoder_cont;

architecture Behavioral of encoder_cont is

8
signal count : std_logic_Vector(7 downto 0);
signal int_count : integer range 0 to 255 := 0; --pulso de 1250
us@400Hz (0.25ms)

signal resultao : std_logic_vector(13 downto 0);


--Declaracin de seales del divisor
signal SAL_400Hz: std_logic;

--Declaracin de seales de asignacin de U-D-C-UM


signal UNIint,DECint,CENint,MILint: std_logic_vector (3 downto 0); --
U-D-C-M

signal salidona : std_logic_vector(4 downto 0);


signal clr : std_logic := '0';
signal A, B : std_logic;
signal EncOut: STD_LOGIC_VECTOR (4 downto 0);
-- direction indicator
signal LED: STD_LOGIC_VECTOR (1 downto 0);

type stateType is ( idle, R1, R2, R3, L1, L2, L3, add, sub);
signal curState, nextState: stateType;

begin

--clk and button

clock: process (clk, BTN)

begin
-- if the rotary button is pressed the count resets
if (BTN='1') then
curState <= idle;
EncOut <= "00000";
elsif (clk'event and clk = '1') then
-- detect if the shaft is rotated to right or left
-- right: add 1 to the position at each click
-- left: subtract 1 from the position at each click
if curState /= nextState then
if (curState = add) then
if EncOut < "10011" then
EncOut <= EncOut+1;
int_count<=int_count+1;
else
EncOut <= "00000";
end if;
elsif (curState = sub) then
if EncOut > "00000" then
EncOut <= EncOut-1;
int_count<=int_count-1;
else
EncOut <= "10011";
end if;
else

9
EncOut <= EncOut;
end if;
else
EncOut <= EncOut;
end if;
curState <= nextState;
end if;
count <= conv_std_logic_vector(int_count,8);
end process;
-----FSM process
next_state: process (curState, A, B)
begin
case curState is
--detent position
when idle =>
LED<= "00";
if B = '0' then
nextState <= R1;
elsif A = '0' then
nextState <= L1;
else
nextState <= idle;
end if;

-- start of right cycle


--R1
when R1 =>
LED<= "01";
if B='1' then
nextState <= idle;
elsif A = '0' then
nextState <= R2;
else
nextState <= R1;
end if;

--R2
when R2 =>
LED<= "01";
if A ='1' then
nextState <= R1;
elsif B = '1' then
nextState <= R3;
else
nextState <= R2;
end if;
--R3
when R3 =>
LED<= "01";
if B ='0' then
nextState <= R2;
elsif A = '1' then
nextState <= add;
else

10
nextState <= R3;
end if;
when add =>
LED<= "01";
nextState <= idle;

-- start of left cycle


--L1
when L1 =>
LED<= "10";
if A ='1' then
nextState <= idle;
elsif B = '0' then
nextState <= L2;
else
nextState <= L1;
end if;

--L2
when L2 =>
LED<= "10";
if B ='1' then
nextState <= L1;
elsif A = '1' then
nextState <= L3;
else
nextState <= L2;
end if;

--L3
when L3 =>
LED<= "10";
if A ='0' then
nextState <= L2;
elsif B = '1' then
nextState <= sub;
else
nextState <= L3;
end if;
when sub =>
LED<= "10";
nextState <= idle;
when others =>
LED<= "11";
nextState <= idle;
end case;
end process;

U1: entity work.encoder_multdiv port map(


clk => clk, --a seal p/LD y srmd (U1)
Ain => Ain, -- Seales a los displays
Bin => Bin,
Aout => A,

11
Bout => B );

--Declaracin del componente que convierte de binario a decimal


--por la metodologa de correr y sumar 3 (shift and add 3)
U2: entity work.SHIFT_ADD port map(
CONT => resultao, --a seal p/LD y srmd (U1)
UNI => UNIint, -- Seales a los displays
DEC => DECint,
CEN => CENint,
MIL => MILint );

U3: entity work.Operacion port map(


clk => clk,
Dato => count, --a seal p/LD y srmd (U1)
X2 => salidona(0), -- Seales a los displays
X4 => salidona(1),
DIV2 => salidona(2),
DIV4 => salidona(3),
Dataorg => salidona(4),
resultao => resultao,
leds => leds );

U4: entity work.DISPLAY_result port map(


UNI => UNIint, -- Seales a los displays
DEC => DECint,
CEN => CENint,
MIL => MILint,
SAL_400Hz => SAL_400Hz, --A seal de reloj U4
DISPLAY => DISPLAY, --A segmentos de display
AN => AN ); --A nodos del display

U5: entity work.debounce port map( --Módulo debounce para los botones
clk => clk,
clr => clr,
entrada(0) => multx2,
entrada(1) => multx4,
entrada(2) => divx2,
entrada(3) => divx4,
entrada(4) => orig,
salida => salidona );

U6: entity work.DIV_CLK port map( --Divisor de reloj para los displays
clk => clk,
SAL_400Hz => SAL_400Hz );
end Behavioral;

• Componente U1
----------------------------------------------------------------------
------------
-- MEXILOGICS: DEBOUNCE PARA EL ENCODER MECÁNICO
----------------------------------------------------------------------
------------

12
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_arith.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;

entity encoder_multdiv is
Port (
clk : in STD_LOGIC;
-- signals from the pmod
Ain : in STD_LOGIC;
Bin : in STD_LOGIC;
-- debounced signals
Aout: inout STD_LOGIC;
Bout: inout STD_LOGIC );
end encoder_multdiv;

architecture Behavioral of encoder_multdiv is


signal sclk: std_logic_vector (6 downto 0);
signal sampledA, sampledB : std_logic;
begin
process(clk) begin
if clk'event and clk = '1' then
sampledA <= Ain;
sampledB <= Bin;
-- clock is divided to 1MHz
-- samples every 1uS to check if the input is the same as the sample
-- if the signal is stable, the debouncer should output the signal

if sclk = "1100100" then -- (100*20ns= 2us) (100*10ns=


1us)
if sampledA = Ain then Aout <= Ain;
end if;
if sampledB = Bin then Bout <= Bin;
end if;
sclk <="0000000";
else
sclk <= sclk +1;
end if;
end if;
end process;
end Behavioral;

• Componente U2
----------------------------------------------------------------------
------------
--MEXILOGICS
--Convertidor SHIFt and add 3
--------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_arith.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;

13
--------------------------------------------------------
--Declaracin de la entidad
entity SHIFT_ADD is
port(
CONT: in std_logic_vector (13 downto 0):=(others=>'0'); --8
bits
UNI,DEC,CEN,MIL: out std_logic_vector (3 downto 0) );
end SHIFT_ADD;

--------------------------------------------------------
--Declaracin de la arquitectura
architecture Behavioral of SHIFT_ADD is
--DECLARACIN DE SEALES DE ASIGNACIN DE U-D-C
signal P:std_logic_vector(15 downto 0); --Asigna UNI,DEC,CEN

-----------CONVERTIR DE BIN A BCD------------------


-- Este proceso contiene un algoritmo recorre y suma 3 para
-- convertir un nmero binario abcd, que se manda a los displays.
-- El algoritmo consiste en desplazar (shift) el vector inicial
-- (en binario) el nmero de veces segn sea el nmero de bits,
-- y cuando alguno de los bloques de 4 bits (U-D-C-UM, que es el
-- nmero de bits necesarios para que cuente de 0 a 9 por cifra)
-- sea igual o mayor a 5 (por eso el >4) se le debe sumar 3
-- a ese bloque, despus se continua desplazando hasta que otro
-- (o el mismo) bloque cumpla con esa condicin y se le sumen 3.

-- Inicialmente se rota 3 veces porque es el nmero mnimo de bits


-- que debe tener para que sea igual o mayor a 5.
-- Finalmente se asigna a otro vector, el vector ya convertido,
-- que cuenta con 3 bloques para las 3 cifras de 4 bits cada una.
begin
PROCESS(CONT)
VARIABLE UM_C_D_U:STD_LOGIC_VECTOR(29 DOWNTO 0);
--30 bits para separar las U.Millar-Centenas-Decenas-Unidades
BEGIN
--ciclo de inicializacin
FOR I IN 0 TO 29 LOOP --
UM_C_D_U(I):='0'; -- se inicializa con 0
END LOOP;
UM_C_D_U(13 DOWNTO 0):=CONT(13 downto 0); --contador de 14 bits
-- UM_C_D_U(17 DOWNTO 4):=CONT(13 downto 0); --contador de 14 bits,
carga desde
-- el shift4
--ciclo de asignacin UM-C-D-U
FOR I IN 0 TO 13 LOOP
-- FOR I IN 0 TO 9 LOOP -- si carga desde shift4 solo hace 10 veces el
ciclo shift add
-- los siguientes condicionantes comparan (>=5) y suman 3
IF UM_C_D_U(17 DOWNTO 14) > 4 THEN -- U
UM_C_D_U(17 DOWNTO 14):= UM_C_D_U(17 DOWNTO 14)+3;
END IF;
IF UM_C_D_U(21 DOWNTO 18) > 4 THEN -- D
UM_C_D_U(21 DOWNTO 18):= UM_C_D_U(21 DOWNTO 18)+3;
END IF;

14
IF UM_C_D_U(25 DOWNTO 22) > 4 THEN -- C
UM_C_D_U(25 DOWNTO 22):= UM_C_D_U(25 DOWNTO 22)+3;
END IF;
IF UM_C_D_U(29 DOWNTO 26) > 4 THEN -- UM
UM_C_D_U(29 DOWNTO 26):= UM_C_D_U(29 DOWNTO 26)+3;
END IF;
-- realiza el corrimiento
UM_C_D_U(29 DOWNTO 1):= UM_C_D_U(28 DOWNTO 0);
END LOOP;
P<=UM_C_D_U(29 DOWNTO 14); -- guarda en P y en seguida se separan UM-
C-D-U
END PROCESS;
--UNIDADES
UNI<=P(3 DOWNTO 0);
--DECENAS
DEC<=P(7 DOWNTO 4);
--CENTENAS
CEN<=P(11 DOWNTO 8);
--MILLARES
MIL<=P(15 DOWNTO 12);
end Behavioral;

• Componente U3
----------------------------------------------------------------------
------------
--MEXILOGICS: MÓDULO PARA REGRESAR EL RESULTADO DESEADO
--SEGÚN EL BOTÓN PRESIONADO
----------------------------------------------------------------------
------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_arith.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;

entity Operacion is
port(
clk : in std_logic; --CLK 50MHZ
X2,X4,DIV2,DIV4,dataorg : in std_logic; --BOTONES QUE REALIZAN
LA OPERACIÓN
dato : in std_logic_vector(7 downto 0); --DATO QUE SE
INTRODUCE POR EL ENCODER
resultao : out std_logic_vector(13 downto 0); --RESULTADO DE
HASTA 14 BITS
leds : out std_logic_vector(7 downto 0) --SALIDA A LEDS
TESTIGOS
);
end Operacion;

architecture Behavioral of Operacion is


signal selec : std_logic_vector(4 downto 0);
signal lol : std_logic_vector(13 downto 0);
signal u : integer := 0;

15
begin
process(clk) begin
if rising_edge(clk) then
if X2 = '1' then u <= 1; --INDICA LA OPERACIÓN A
REALIZAR
elsif X4 = '1' then u <= 2;
elsif DIV2 = '1' then u <= 3;
elsif DIV4 = '1' then u <= 4;
elsif dataorg = '1' then u <= 5;
else u<=u;
end if;

case(u) is --LEE EL BOTÓN PRESIONADO


when 1 => resultao <=
conv_std_logic_vector((conv_integer(dato)*2),14);
when 2 => resultao <=
conv_std_logic_vector((conv_integer(dato)*4),14);
when 3 => resultao <=
conv_std_logic_vector((conv_integer(dato)/2),14);
when 4 => resultao <=
conv_std_logic_vector((conv_integer(dato)/4),14);
when others => resultao <= "00000000000000" or
dato;
end case;
leds <= dato;
end if;
end process;
end Behavioral;

• Componente U4
----------------------------------------------------------------------
------------
--MEXILOGICS: PROGRAMA PARA MOSTRAR EL NÚMERO XONVERTIDO A UDCM EN LOS
DISPLAYS
----------------------------------------------------------------------
------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_arith.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;

entity Display_result is
Port(
UNI,DEC,CEN,MIL: in std_logic_vector (3 downto 0); --U-D-C-M
SAL_400Hz : in std_logic; --Reloj de 400Hz
DISPLAY : out STD_LOGIC_VECTOR(7 downto 0); --segmentos del
display
AN : out std_logic_vector (7 downto 0) --nodos del display
);
end Display_result;

architecture Behavioral of Display_result is

16
-- Declaracin de seales de la multiplexacin y asignacin de U-D-C al
disp
signal SEL: std_logic_vector (1 downto 0):="00"; -- selector de
barrido
signal D: std_logic_vector (3 downto 0); -- almacena los valores del
disp
begin
PROCESS(SAL_400Hz, sel, UNI, DEC,CEN,MIL)
BEGIN
IF SAL_400Hz'EVENT and SAL_400Hz='1' THEN SEL <= SEL + '1';
CASE(SEL) IS
when "00" => AN <="11110111"; D <= UNI; -- UNIDADES
when "01" => AN <="11111011"; D <= DEC; -- DECENAS
when "10" => AN <="11111101"; D <= CEN; -- CENTENAS
when "11" => AN <="11111110"; D<= MIL; --MILLARES
when others =>AN <="11111111"; D <= x"0"; -- signo
END CASE;
end if;
END PROCESS; -- fin del proceso Multiplexor

process(D) begin
case(D) is
WHEN x"0" => DISPLAY <= "00000011"; --0
WHEN x"1" => DISPLAY <= "10011111"; --1
WHEN x"2" => DISPLAY <= "00100101"; --2
WHEN x"3" => DISPLAY <= "00001101"; --3
WHEN x"4" => DISPLAY <= "10011001"; --4
WHEN x"5" => DISPLAY <= "01001001"; --5
WHEN x"6" => DISPLAY <= "01000001"; --6
WHEN x"7" => DISPLAY <= "00011111"; --7
WHEN x"8" => DISPLAY <= "00000001"; --8
WHEN x"9" => DISPLAY <= "00001001"; --9
WHEN x"F" => DISPLAY <= "11111101"; --signo
WHEN OTHERS => DISPLAY <= "11111111"; --apagado
end case;
end process;
end Behavioral;

• Componente U5
----------------------------------------------------------------------
------------
--MEXILOGICS: DEBOUNCE PARA LOS BOTONES
---------------------------------------------------------------------
-------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity debounce is
--nmero de bits del antirrebote
--declaracin de los puertos
port(
entrada: in std_logic_vector(4 downto 0);

17
salida: out std_logic_vector(4 downto 0);
clk,clr: in std_logic); --reloj y clear
end debounce;

architecture Behavioral of debounce is


signal delay1, delay2, delay3 : std_logic_vector(4 downto 0);
begin
process(entrada, clk, clr) begin
if clr='1' then
delay1 <= "00000";
delay2 <= "00000";
delay3 <= "00000";
elsif clk'event and clk='1' then
delay1 <= entrada;
delay2 <= delay1;
delay3 <= delay2;
end if;
end process; --fin del proceso
--salida sin rebotes
salida <= delay1 and delay2 and delay3;
end Behavioral;

• Componente U6
----------------------------------------------------------------------
--MEXILOGICS
--DIVISOR DE 2.5ms
----------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;
use IEEE.STD_LOGIC_arith.ALL;

--Declaracin de entidad
entity DIV_CLK is
port(
clk: in std_logic; --reloj de 50MHz
SAL_400Hz: inout std_logic --salida 2.5ms
);
end DIV_CLK;

----------------------------------------------------------------------
------------
--Declaracin de la arquitectura
architecture Behavioral of DIV_CLK is
--Declaracin de seales de divisores
signal conta_1250us : integer range 1 to 62_500 := 1; --pulso de 1250
us@400Hz (0.25ms)

begin
--Divisor 2.5ms = 400Hz
--Divisor nodos
process(clk) begin
if rising_edge(clk) then

18
if(conta_1250us = 62_500) then --cuenta 1250us (50MHz = 62500)
SAL_400Hz <= not(SAL_400Hz); --Genera un barrido de 2.5ms
conta_1250us <= 1;

else conta_1250us <= conta_1250us + 1;


end if;
end if;
end process; --Fin del proceso divisor de nodos

----------------------------------------------------------------------
------------
--fin de la arquitectura
end Behavioral;

Y el archivo de restricciones (.ucf) es:


//MEXILOGICS
//Archivo de reestricciones de usuario (UCF)//

##Clock signal
Net "clk" LOC = E7 | IOSTANDARD=LVCMOS33;

//DISPLAYS
net "DISPLAY(7)" LOC="K13";//A
net "DISPLAY(6)" LOC="L15";//B
net "DISPLAY(5)" LOC="M15";//C
net "DISPLAY(4)" LOC="P15";//D
net "DISPLAY(3)" LOC="P14";//E
net "DISPLAY(2)" LOC="K15";//F
net "DISPLAY(1)" LOC="L14";//G
net "DISPLAY(0)" LOC="N15";//P

//NODOS
net "AN(7)" LOC="K12";//DP8
net "AN(6)" LOC="J13";//DP7
net "AN(5)" LOC="K11";//DP6
net "AN(4)" LOC="H13";//DP5
net "AN(3)" LOC="G13";//DP4
net "AN(2)" LOC="H12";//DP3
net "AN(1)" LOC="F13";//DP2
net "AN(0)" LOC="G12";//DP1

##SALIDAS A LAS COLUMNAS


Net "Ain" LOC = E15 | IOSTANDARD = LVCMOS33;
Net "Bin" LOC = C15 | IOSTANDARD = LVCMOS33;
Net "BTN" LOC = B14 | IOSTANDARD = LVCMOS33;

##PUSHBUTTON
Net "Multx2" LOC = J4 | IOSTANDARD=LVCMOS33;
Net "Multx4" LOC = K3 | IOSTANDARD=LVCMOS33;
Net "Divx2" LOC = H4 | IOSTANDARD=LVCMOS33;
Net "Divx4" LOC = K1 | IOSTANDARD=LVCMOS33;
Net "orig" LOC = J3 | IOSTANDARD=LVCMOS33;

19
##LED VERDES
Net "leds<7>" LOC = N1 | IOSTANDARD=LVCMOS33;
Net "leds<6>" LOC = R4 | IOSTANDARD=LVCMOS33;
Net "leds<5>" LOC = P7 | IOSTANDARD=LVCMOS33;
Net "leds<4>" LOC = R9 | IOSTANDARD=LVCMOS33;
Net "leds<3>" LOC = P13 | IOSTANDARD=LVCMOS33;
Net "leds<2>" LOC = M4 | IOSTANDARD=LVCMOS33;
Net "leds<1>" LOC = M6 | IOSTANDARD=LVCMOS33;
Net "leds<0>" LOC = M11 | IOSTANDARD=LVCMOS33;

A continuación, se mostrarán algunas imágenes demostrando su funcionamiento:

Figura 9.- Descripción de los push buttons y sus respectivas operaciones aritméticas señaladas
para el número ingresado mediante el encoder rotatorio mecánico.

20
Figura 10.- Multiplicación x2 del número Figura 11.- División /2 del número ingresado
ingresado

Figura 12.- Multiplicación x4 del número Figura 13.- División /4 del número ingresado
ingresado

21
5 (iii).- Generador de señal rampa y senoidal
Para este punto, haciendo uso de 2 redes R2R (que cumplen la función de convertidores
analógicos-digitales), la FPGA Amiba 2 y el osciloscopio para el muestro de las señales. Se
realizo el código para mostrar las señales “diente de sierra” y “senoidal” en el osciloscopio.
El esquemático de la red R2R es el siguiente (ver figura 14):

Figura 14.- Esquemático de la Red R2R utilizada para la generación de las señales rampa y
senoidal

Y el código (en VHDL) empleado fue:


----------------------------------------------------------------------
-- MEXILOGICS: CONVERTIDOR DIGITAL A ANALÓGICO DE SEÑAL SINUSOIDAL Y
RAMPA
----------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

22
use IEEE.STD_LOGIC_unsigned.ALL;
use IEEE.STD_LOGIC_arith.ALL;

entity Sine_signal is
Generic( max: integer:=22; -- No. bits del divisor
max2 : integer:= 7;
n: integer:=8 -- No. bits de salida
);

Port(
btn0: in std_logic; --use BTN0 as reset input
clk: in std_logic; --Nexys 2 50MHz, Nexys 3 100 MHz clock input
SW : in std_logic; --Selector de velocidad para la seal de rampa
sine: out std_logic_vector (7 downto 0);
ramp: out std_logic_vector (7 downto 0) );
end Sine_signal;

architecture Behavioral of Sine_signal is


-----------------------------------------------------------------
-- Signals, Type and Constants Declarations
------------------------------------------------------------------
signal cntUS:std_logic_vector (5 downto 0):= (others =>'0'); --Signal
to do OneUSClk
signal OneUSClk: std_logic; --Signal is treated as a 1 MHz clock
signal CONT2: std_logic_vector (max2 DOWNTO 0):=(others=>'0'); -- cont
rampa
signal clkdiv: std_logic:='0'; -- clkdiv
signal CONT: std_logic_vector (max2 DOWNTO 0):=(others=>'0'); -- cont
de max+1 bits

--Declaracin de la tabla
type tablaSeno is array(integer range 0 to 359) of std_logic_vector(7
downto 0);

constant Datos_seno : tablaSeno := (


0 => x"7F", --
1 => x"81", --
2 => x"83", --
3 => x"86", --
4 => x"88", --
5 => x"8A", --
6 => x"8C", --
7 => x"8F", --
8 => x"91", --
9 => x"93", --
10 => x"95", --
11 => x"97", --
12 => x"9A", --
13 => x"9C", --
14 => x"9E", --
15 => x"A0", --
16 => x"A2", --
17 => x"A4", --
18 => x"A6", --

23
19 => x"A9", --
20 => x"AB", --
21 => x"AD", --
22 => x"AF", --
23 => x"B1", --
24 => x"B3", --
25 => x"B5", --
26 => x"B7", --
27 => x"B9", --
28 => x"BB", --
29 => x"BD", --

30 => x"BF", --
31 => x"C1", --
32 => x"C3", --
33 => x"C4", --
34 => x"C6", --
35 => x"C8", --
36 => x"CA", --
37 => x"CC", --
38 => x"CD", --
39 => x"CF", --
40 => x"D1", --
41 => x"D3", --
42 => x"D4", --
43 => x"D6", --
44 => x"D8", --
45 => x"D9", --
46 => x"DB", --
47 => x"DC", --
48 => x"DE", --
49 => x"DF", --
50 => x"E1", --
51 => x"E2", --
52 => x"E3", --
53 => x"E5", --
54 => x"E6", --
55 => x"E7", --
56 => x"E9", --
57 => x"EA", --
58 => x"EB", --
59 => x"EC", --
60 => x"ED", --
61 => x"EF", --
62 => x"F0", --
63 => x"F1", --
64 => x"F2", --
65 => x"F3", --
66 => x"F3", --
67 => x"F4", --
68 => x"F5", --
69 => x"F6", --
70 => x"F7", --
71 => x"F8", --

24
72 => x"F8", --
73 => x"F9", --
74 => x"FA", --
75 => x"FA", --
76 => x"FB", --
77 => x"FB", --
78 => x"FC", --
79 => x"FC", --
80 => x"FD", --
81 => x"FD", --
82 => x"FD", --
83 => x"FE", --
84 => x"FE", --
85 => x"FE", --
86 => x"FE", --
87 => x"FE", --
88 => x"FE", --
89 => x"FE", --
90 => x"FF", --
91 => x"FE", --
92 => x"FE", --
93 => x"FE", --
94 => x"FE", --
95 => x"FE", --
96 => x"FE", --
97 => x"FE", --
98 => x"FD", --
99 => x"FD", --
100 => x"FD", --
101 => x"FC", --
102 => x"FC", --
103 => x"FB", --
104 => x"FB", --
105 => x"FA", --
106 => x"FA", --
107 => x"F9", --
108 => x"F8", --
109 => x"F8", --
110 => x"F7", --
111 => x"F6", --
112 => x"F5", --
113 => x"F4", --
114 => x"F3", --
115 => x"F3", --
116 => x"F2", --
117 => x"F1", --
118 => x"F0", --
119 => x"EF", --
120 => x"ED", --
121 => x"EC", --
122 => x"EB", --
123 => x"EA", --
124 => x"E9", --
125 => x"E7", --

25
126 => x"E6", --
127 => x"E5", --
128 => x"E3", --
129 => x"E2", --
130 => x"E1", --
131 => x"DF", --
132 => x"DE", --
133 => x"DC", --
134 => x"DB", --
135 => x"D9", --
136 => x"D8", --
137 => x"D6", --
138 => x"D4", --
139 => x"D3", --
140 => x"D1", --
141 => x"CF", --
142 => x"CD", --
143 => x"CC", --
144 => x"CA", --
145 => x"C8", --
146 => x"C6", --
147 => x"C4", --
148 => x"C3", --
149 => x"C1", --
150 => x"BF", --
151 => x"BD", --
152 => x"BB", --
153 => x"B9", --
154 => x"B7", --
155 => x"B5", --
156 => x"B3", --
157 => x"B1", --
158 => x"AF", --
159 => x"AD", --
160 => x"AB", --
161 => x"A9", --
162 => x"A6", --
163 => x"A4", --
164 => x"A2", --
165 => x"A0", --
166 => x"9E", --
167 => x"9C", --
168 => x"9A", --
169 => x"97", --
170 => x"95", --
171 => x"93", --
172 => x"91", --
173 => x"8F", --
174 => x"8C", --
175 => x"8A", --
176 => x"88", --
177 => x"86", --
178 => x"83", --
179 => x"81", --

26
180 => x"7F", --
181 => x"7D", --
182 => x"7B", --
183 => x"78", --
184 => x"76", --
185 => x"74", --
186 => x"72", --
187 => x"6F", --
188 => x"6D", --
189 => x"6B", --
190 => x"69", --
191 => x"67", --
192 => x"64", --
193 => x"62", --
194 => x"60", --
195 => x"5E", --
196 => x"5C", --
197 => x"5A", --
198 => x"58", --
199 => x"55", --
200 => x"53", --
201 => x"51", --
202 => x"4F", --
203 => x"4D", --
204 => x"4B", --
205 => x"49", --
206 => x"47", --
207 => x"45", --
208 => x"43", --
209 => x"41", --
210 => x"3F", --
211 => x"3D", --
212 => x"3B", --
213 => x"3A", --
214 => x"38", --
215 => x"36", --
216 => x"34", --
217 => x"32", --
218 => x"31", --
219 => x"2F", --
220 => x"2D", --
221 => x"2B", --
222 => x"2A", --
223 => x"28", --
224 => x"26", --
225 => x"25", --
226 => x"23", --
227 => x"22", --
228 => x"20", --
229 => x"1F", --
230 => x"1D", --
231 => x"1C", --
232 => x"1B", --
233 => x"19", --

27
234 => x"18", --
235 => x"17", --
236 => x"15", --
237 => x"14", --
238 => x"13", --
239 => x"12", --
240 => x"11", --
241 => x"0F", --
242 => x"0E", --
243 => x"0D", --
244 => x"0C", --
245 => x"0B", --
246 => x"0B", --
247 => x"0A", --
248 => x"09", --
249 => x"08", --
250 => x"07", --
251 => x"06", --
252 => x"06", --
253 => x"05", --
254 => x"04", --
255 => x"04", --
256 => x"03", --
257 => x"03", --
258 => x"02", --
259 => x"02", --
260 => x"01", --
261 => x"01", --
262 => x"01", --
263 => x"00", --
264 => x"00", --
265 => x"00", --
266 => x"00", --
267 => x"00", --
268 => x"00", --
269 => x"00", --
270 => x"00", --
271 => x"00", --
272 => x"00", --
273 => x"00", --
274 => x"00", --
275 => x"00", --
276 => x"00", --
277 => x"00", --
278 => x"01", --
279 => x"01", --
280 => x"01", --
281 => x"02", --
282 => x"02", --
283 => x"03", --
284 => x"03", --
285 => x"04", --
286 => x"04", --
287 => x"05", --

28
288 => x"06", --
289 => x"06", --
290 => x"07", --
291 => x"08", --
292 => x"09", --
293 => x"0A", --
294 => x"0B", --
295 => x"0B", --
296 => x"0C", --
297 => x"0D", --
298 => x"0E", --
299 => x"0F", --
300 => x"11", --
301 => x"12", --
302 => x"13", --
303 => x"14", --
304 => x"15", --
305 => x"17", --
306 => x"18", --
307 => x"19", --
308 => x"1B", --
309 => x"1C", --
310 => x"1D", --
311 => x"1F", --
312 => x"20", --
313 => x"22", --
314 => x"23", --
315 => x"25", --
316 => x"26", --
317 => x"28", --
318 => x"2A", --
319 => x"2B", --
320 => x"2D", --
321 => x"2F", --
322 => x"31", --
323 => x"32", --
324 => x"34", --
325 => x"36", --
326 => x"38", --
327 => x"3A", --
328 => x"3B", --
329 => x"3D", --
330 => x"3F", --
331 => x"41", --
332 => x"43", --
333 => x"45", --
334 => x"47", --
335 => x"49", --
336 => x"4B", --
337 => x"4D", --
338 => x"4F", --
339 => x"51", --
340 => x"53", --
341 => x"55", --

29
342 => x"58", --
343 => x"5A", --
344 => x"5C", --
345 => x"5E", --
346 => x"60", --
347 => x"62", --
348 => x"64", --
349 => x"67", --
350 => x"69", --
351 => x"6B", --
352 => x"6D", --
353 => x"6F", --
354 => x"72", --
355 => x"74", --
356 => x"76", --
357 => x"78", --
358 => x"7B", --
359 => x"7D"); --

signal Datos_seno_ptr : integer range 0 to 359 :=0; --Datos_seno'HIGH


+ 1 := 0;
------------------------------------------------------------------
begin
------------------------------------------------------------------
--This process counts to 24(or 49), and then resets. It is used to
divide the clock signal.
--This makes oneUSClock peak aprox. once every 1microsecond
process (CLK, btn0)
begin
if (CLK = '1' and CLK'event) then
-- if(cntUS = "110001") then --49 Nexys 3
if(cntUS = "011000" or btn0 = '1') then --24 Nexys 2 [50*20ns]=1us
cntUS <= "000000";
oneUSClk <= not oneUSClk;
else
cntUS <= cntUS + '1';
end if;
end if;
end process;

----------------------------------------------------------------------
--This process increments the pointer Datos_seno_ptr
process (oneUSClk, btn0, Datos_seno_ptr)
begin
if (oneUSClk = '1' and oneUSClk'event) then
if Datos_seno_ptr = 359 or btn0 = '1' then
Datos_seno_ptr <= 0;
else
Datos_seno_ptr <= Datos_seno_ptr + 1;
end if;
end if;
end process;

---------------------contador------------------------------------

30
-- en este proceso se genera un contador de n=max+1 bits,
-- que servir como divisores de frecuencia para el contador
PROCESS(btn0, clk, cont)
begin
if btn0='1' then
CONT<=(others=>'0');
elsif (rising_edge(clk)) then -- reloj 50MHz
CONT<=CONT+'1'; -- contador ascendente
end if;
end process;

---------------------selecciona la velocidad de la seal--------------


-- en este proceso se selecciona la velocidad con cont(max) o
cont(max-1)
PROCESS(clk,sw, cont(max2),cont(max2-1))
begin
if(rising_edge(clk)) then -- reloj 50MHz
if sw='0' then clkdiv <= CONT(max2); -- reloj lento
else clkdiv <= CONT(max2-1); -- reloj rpido
end if;
end if;
end process;

---------------------contador (seal rampa)----------------------------


--------
-- en este proceso se genera un contador de 8 bits que depende
-- de clkdiv que sirve para generar una seal rampa
PROCESS(btn0, oneusclk,cont2)
begin
if btn0='1' then
CONT2<=(others=>'0');
elsif(rising_edge(oneusclk)) then -- reloj clkdiv
CONT2<=CONT2+'1'; -- contador ascendente
end if;
end process;

----SALIDA A LAS DACS-------------------------------------------------


--------------------------------------------
sine <= Datos_seno(Datos_seno_ptr);
ramp <= CONT2(max2 downto 0);
end Behavioral;

Y el archivo de restricciones (.ucf) es:


//MEXILOGICS
//Archivo de reestricciones de usuario (UCF)//

##Clock signal
Net "clk" LOC = E7 | IOSTANDARD=LVCMOS33;

##SEÑAL SINUSOIDAL
Net "sine<7>" LOC = B3 | IOSTANDARD=LVCMOS33;

31
Net "sine<6>" LOC = A2 | IOSTANDARD=LVCMOS33;
Net "sine<5>" LOC = E2 | IOSTANDARD=LVCMOS33;
Net "sine<4>" LOC = D13 | IOSTANDARD=LVCMOS33;
Net "sine<3>" LOC = C10 | IOSTANDARD=LVCMOS33;
Net "sine<2>" LOC = C8 | IOSTANDARD=LVCMOS33;
Net "sine<1>" LOC = D6 | IOSTANDARD=LVCMOS33;
Net "sine<0>" LOC = C4 | IOSTANDARD=LVCMOS33;

##SEÑAL DE RAMPA
Net "ramp<7>" LOC = A3 | IOSTANDARD = LVCMOS33;
Net "Ramp<6>" LOC = C1 | IOSTANDARD = LVCMOS33;
Net "Ramp<5>" LOC = E1 | IOSTANDARD = LVCMOS33;
Net "Ramp<4>" LOC = C12 | IOSTANDARD = LVCMOS33;
Net "Ramp<3>" LOC = D10 | IOSTANDARD = LVCMOS33;
Net "Ramp<2>" LOC = C7 | IOSTANDARD = LVCMOS33;
Net "Ramp<1>" LOC = D5 | IOSTANDARD = LVCMOS33;
Net "Ramp<0>" LOC = E4 | IOSTANDARD = LVCMOS33;

#PUSHBUTTON
Net "BTN0" LOC = J4 | IOSTANDARD=LVCMOS33;

#SWITCHES
Net "SW" LOC = L1 | IOSTANDARD = LVCMOS33; #D8

A continuación, se mostrarán algunas de las imágenes de su funcionamiento:

Figura 15.- Redes R2R (convertidores Figura 16.- Pantalla del osciloscopio de la
Digital – Analógico) utilizadas para las salida de las redes R2R para las señales
señales rampa y senoidal (una en cada rampa (color amarillo) y senoidal (color azul)
protoboard) y su conexión a los puertos de
expansión de la FPGA Amiba 2

32
6 (i).- Controlador ON-OFF de una carga AC con Bluetooth.
Para este punto, tomamos de base el código de la pre-práctica y lo modificamos para que,
mediante el uso de una aplicación para la comunicación entre el módulo BT HC-06 y un
smartphone (enviando comandos desde el smartphone a través de su aplicación “Bluetooth
Serial Controller” hacia el módulo y este transmitiendo los datos a la FPGA), controlamos el
encendido-apagado de una carga de corriente alterna (para nuestro caso usamos un foco de
corriente alterna). Para no ocasionar un fallo por la conexión de la alimentación por CA para
los focos y la alimentación directa para la FPGA utilizamos como etapa de potencia un
módulo de relevadores con optoacopladores para no tener conexión directa de estas etapas.
El diagrama esquemático de la etapa de potencia (modulo con relevadores y optoacopladores
y focos de CA) es (ver figura 17):

Figura 17.- Esquemático de la etapa de potencia para la carga AC (foco de corriente alterna).

33
Mientras que la conexión de pines del módulo Bluetooth a la FPGA es (ver figura 18):

Figura 18.- Conexión del módulo BT HC-06 con la FPGA.

Y el código (en Verilog) es:


/////////////////////////////////////////////////////////////////////

//MEXILOGICS: CONTROL DE UN MÓDULO BLUETOOTH PARA ENCENDER UNA CARGA


//Rx BT HC-06 con salida a leds y display

module receptor(
input clk, //50MHz
input reset, //reset
input rx, //entrada de datos del modulo bluetooth (a DO)
output reg carga, //Salida hacia la carga
output reg[7:0] leds=8'b00000000, //salida a leds
output reg[7:0] dsply=8'b11111110, //salida a display 7seg
output reg[7:0] anode=8'b1110 //salida a nodos
); //fin del mdulo receptor

//fsm states
reg [1:0] presentstate, nextstate;
parameter EDO_1 = 2'b00;
parameter EDO_2 = 2'b10;

//seales
reg control=0; //indica cuando ocurre el bit de start
reg done=0; // bandera que indica que termino de recibir los datos
reg[8:0]tmp=9'b000000000; //registro que recibe los datos enviados

//contadores para los retardos


reg[3:0]i = 4'b0000; //contador de los bits recibidos
reg[9:0]c = 10'b1111111111; //contador de retardos
reg delay = 0; //algoritmo para los retardos
reg[1:0]c2 = 2'b11;
reg capture = 0;

//proceso de retardo al triple de la frecuencia


//868*20ns=17.36us
//17.36us*3=58.08us
//58.08us*2=104.16us=1/9600baudios o bits/seg
always@(posedge clk)

34
begin
if(c<868)
c = c + 1;
else
begin
c=0;
delay = ~delay;
end
end

//proceso para el contador C2 para la captura


always@(posedge delay)
begin
if (c2>1)
c2=0;
else
c2 = c2 + 1;
end

//proceso para capturar en el bit de en medio (capture)


always@(c2)
begin
if (c2==1)
capture=1;
else
capture=0;
end

//FSM actualizacin
always@(posedge capture, posedge reset)
if (reset) presentstate <= EDO_1;
else presentstate <= nextstate;

//FSM
always@(*)
begin
case(presentstate)
EDO_1: begin
if(rx==1 && done==0)
begin
control=0;
nextstate= EDO_1;
end
else if(rx==0 && done==0)
begin
control=1;
nextstate= EDO_2;
end
else
begin
control=0;
nextstate= EDO_1;

35
end
end
EDO_2: begin
if(done==0)
begin
control=1;
nextstate= EDO_2;
end
else
begin
control=0;
nextstate= EDO_1;
end
end
default
nextstate= EDO_1;
endcase
end

//proceso de recepcin de datos


always@(posedge capture)
begin
if (control==1 && done==0)
begin
tmp <= {rx,tmp[8:1]};
end
end

//proceso que cuenta los bits que llegan (9 bits)


always@(posedge capture)
begin
if (reset)
begin
// abcdefgP
leds<=8'b00000000;
anode<=8'b01111111;
end
else if (control) begin
if(i>=9)
begin
i=0;
done=1;
leds<=tmp[8:1];
case (tmp[8:1]) // abcdefgp
8'h30 : dsply <= 8'b00000011; // 0
8'h31 : dsply <= 8'b10011111; // 1
8'h32 : dsply <= 8'b00100101; // 2
8'h33 : dsply <= 8'b00001101; // 3
8'h34 : dsply <= 8'b10011001; // 4
8'h35 : dsply <= 8'b01001001; // 5
8'h36 : dsply <= 8'b01000001; // 6
8'h37 : dsply <= 8'b00011111; // 7
8'h38 : dsply <= 8'b00000001; // 8

36
8'h39 : dsply <= 8'b00001001; // 9
8'h42 : dsply <= 8'b11000001; // B
8'h43 : dsply <= 8'b01100011; // C
8'h44 : dsply <= 8'b10000101; // D
8'h45 : dsply <= 8'b01100001; // E
8'h46 : dsply <= 8'b01110001; // F
8'h47 : dsply <= 8'b01000001; // G = 6.
8'h48 : dsply <= 8'b10010001; // H
8'h49 : dsply <= 8'b11011111; // I
8'h2B : dsply <= 8'b10011101; // +
8'h2F : dsply <= 8'b10110101; // /
8'h41 : begin carga<= 1'b1; dsply <= 8'b00010001; end
8'h61 : begin carga<= 1'b1; dsply <= 8'b00010001; end
8'h50 : begin carga<= 1'b0; dsply <= 8'b00110001; end
8'h70 : begin carga<= 1'b0; dsply <= 8'b00110001; end
default : dsply <= 8'b11101111; // _
endcase
end
else
begin
i=i+1;
done=0;
end
end
else
done=0;
end

endmodule // fin del mdulo receptor de BT

Y el archivo de restricciones (.ucf) es:


//MEXILOGICS
//Archivo de reestricciones de usuario (UCF)//

##Clock signal
Net "clk" LOC = E7 | IOSTANDARD=LVCMOS33;

//DISPLAYS
Net "dsply<7>" LOC = K13 | IOSTANDARD=LVCMOS33;
Net "dsply<6>" LOC = L15 | IOSTANDARD=LVCMOS33;
Net "dsply<5>" LOC = M15 | IOSTANDARD=LVCMOS33;
Net "dsply<4>" LOC = P15 | IOSTANDARD=LVCMOS33;
Net "dsply<3>" LOC = P14 | IOSTANDARD=LVCMOS33;
Net "dsply<2>" LOC = K15 | IOSTANDARD=LVCMOS33;
Net "dsply<1>" LOC = L14 | IOSTANDARD=LVCMOS33;
Net "dsply<0>" LOC = N15 | IOSTANDARD=LVCMOS33;

//ANODOS
Net "anode<7>" LOC = K12 | IOSTANDARD=LVCMOS33;
Net "anode<6>" LOC = J13 | IOSTANDARD=LVCMOS33;
Net "anode<5>" LOC = K11 | IOSTANDARD=LVCMOS33;
Net "anode<4>" LOC = H13 | IOSTANDARD=LVCMOS33;

37
Net "anode<3>" LOC = G13 | IOSTANDARD=LVCMOS33;
Net "anode<2>" LOC = H12 | IOSTANDARD=LVCMOS33;
Net "anode<1>" LOC = F13 | IOSTANDARD=LVCMOS33;
Net "anode<0>" LOC = G12 | IOSTANDARD=LVCMOS33;

##RX
Net "rx" LOC = E15 | IOSTANDARD=LVCMOS33;
Net "carga" LOC = F15 | IOSTANDARD=LVCMOS33;

##SALIDAS DE SONIDO
#Net "sonidoOUT" LOC = C4 | IOSTANDARD = LVCMOS33;

#PUSHBUTTON
Net "reset" LOC = J4 | IOSTANDARD=LVCMOS33;

##LED VERDES
Net "leds<7>" LOC = N1 | IOSTANDARD=LVCMOS33;
Net "leds<6>" LOC = R4 | IOSTANDARD=LVCMOS33;
Net "leds<5>" LOC = P7 | IOSTANDARD=LVCMOS33;
Net "leds<4>" LOC = R9 | IOSTANDARD=LVCMOS33;
Net "leds<3>" LOC = P13 | IOSTANDARD=LVCMOS33;
Net "leds<2>" LOC = M4 | IOSTANDARD=LVCMOS33;
Net "leds<1>" LOC = M6 | IOSTANDARD=LVCMOS33;
Net "leds<0>" LOC = M11 | IOSTANDARD=LVCMOS33;

Para el mostrar el funcionamiento de esta aplicación se tomaron las siguientes fotografías:

Figura 19.- Foco apagado (la A mostrada en Figura 20.- Foco encendido (la P mostrada en
el display indica que este comando se envío el display indica que este comando se envió
desde la aplicación del smartphone) desde la aplicación del smartphone)

38
Figura 21.- Comando “a” enviado desde la Figura 22.- Comando “p” enviado desde la
aplicación del smartphone para el apagado de aplicación del smartphone para el encendido
la carga AC de la carga AC

Conclusiones
Álvarez Gómez Julio Cesar:
Práctica: Utilizando el concepto de registros de corrimiento se puede caracterizar un circuito
lógico para lograr el comportamiento deseado y en esta práctica se han repasado tres
aplicaciones que ejemplifican lo anterior. Para lograr uno u otro comportamiento se han
tomado en cuenta también los estados anteriores al estado futuro, esto con la finalidad de
dotar de un comportamiento para el código implementado e interactuar de una manera más
inductiva con el resultado de éste.
Lo primero ha sido entregar un dato al sistema para después utilizar el corrimiento en los flip
– flops y así obtener secuencias de resultados en nuestra salida del sistema. Cuando aplicamos
una serie y entregamos un resultado hemos realizado un proceso y, por ende, realizado una
operación lógica. Es así como leemos, procesamos, interpretamos y concluimos con cada bit
de información que entra desde la primera instancia hasta la última, todo con una especie de
instrucción o ‘cerebro’.
Lectura: Más allá de las ideologías, este relato nos comenta que las decisiones pueden dar
lugar a excepciones aparentemente ‘rebelde’. Para el viejo monje esto fue pieza clave para
decidir ayudar a la pobre joven cuyo problema iba más allá de una intención caprichosa, pues
en verdad necesitaba la ayuda. El joven monje, un poco cegado por las normas no comprendió
el porqué de la desobediencia de su compañero, quien únicamente estaba preocupado por
ayudar a los demás. La respuesta de este último a los reclamos fue contundente porque dejaba
ver la extraña fijación por aquél de fijarse demasiado en lo que hacen los demás en lugar de
dar cabida a un análisis moral o por lo menos ser solidario con los suyos.

39
Galván Escobar Adrián Raúl:
Práctica: El uso de contadores y registros toma una importancia significativa al momento de
implementar aplicaciones que requieran etapas de control digital y automatización con base
en los circuitos secuenciales y combinacionales. Los contadores permitieron la creación de
secuencias lógicas para el envío de datos a las terminales de expansión de la FPGA en un
orden que deseáramos, mientras que los registros fueron importantes para el envío recepción
de bits utilizados para el control de nuestras aplicaciones. Desafortunadamente, no pudimos
cumplir en tiempo y forma con todo lo solicitado, destacando que para el punto 1 tuvimos la
secuencia de iluminación de los semáforos correcta, pero tuvimos dificultades para la
secuencia de la matriz de leds 8x8 con la figura de la persona caminando y deteniéndose de
estos semáforos. Por otro lado, gracias a esta práctica comprendí el uso y limitaciones de los
arreglos R2R para la construcción de Convertidores Digital-Analógicos, así como la
codificación necesaria para el muestreo de señales en el osciloscopio mediante el envío de
señales digitales de la FPGA a la red R2R, igualmente aprendí la codificación necesaria para
la implementación de un módulo Bluetooth que permite la comunicación de nuestra FPGA
con dispositivos compatibles con el protocolo Bluetooth que emplea el módulo,
principalmente para el envío de comandos desde un dispositivo móvil a la FPGA para el
control de un circuito (en el caso de nuestra práctica, para el control ON-OFF de una carga
de CA.
Lectura: El texto nos pone en una situación de dualidad entre lo que uno cree que es lo
correcto y lo que realmente se considera correcto. Por una parte, de los dos monjes, el más
anciano a pesar de tener más tiempo con su cargo (monje zen) y conocer mejor que el monje
joven las enseñanzas de sus creencias (el voto de castidad), es capaz de ayudar al prójimo en
su mayor momento de necesidad, mientras que el monje joven, al tener las creencias
inculcadas en un menor tiempo que el monje anciano, solo pensó que debía obedecer a este
voto, cerrando toda oportunidad de una nueva visión y negándose a la posibilidad de apoyar.
El monje anciano, a pesar de ir en contra de su voto, al final me da a entender que el
significado de este no solo aplicaba en un contexto de contacto físico, sino también en la
huella o impacto emocional que deja en los monjes, pues al final, mientras el monje anciano
continuo su camino sin inmutarse ante su acción (lo cual también nos destaca la capacidad
de afrontar y continuar adelante), el monje joven tuvo muy presente en su pensamiento la
acción que hizo el monje anciano hace muchas leguas atrás, lo que al final destaca el monje
anciano cuando le dice al monje joven que parecía que seguía cargando con ella, es decir,
que tan fuerte fue la impresión emocional que la mujer causo en el monje joven que le fue
imposible superarlo.
Mata Prieto Varush:
Práctica: En el mundo de la ingeniería existen muchos recursos para poder resolver un
problema, por lo que es fundamental conocerlos todos para, de esta forma, alcanzar la
solución de la mejor forma posible, esto se vio reflejado en los registros ya que son una forma
de manejar los datos sin tener que utilizar librerías de más o tener que convertir los datos, lo
que puede llegar a causar problemas con la memoria lo que afecta directamente al tiempo de

40
respuesta. De igual forma, es importante conocer cómo manejar los contadores para lograr
captar señales por medio de comunicación UART, lo que nos abre la posibilidad de trabajar
con diferentes tipos de módulos. Gracias a esta práctica aprendí la importancia de manejar
todas las herramientas que nos proporciona las tarjetas FPGA para seleccionar el método
correcto para el desafío presentado.
Lectura: La lectura nos habla de las normas impuestas, ya que el monje joven priorizó las
reglas al no querer ayudar a la joven mientras que el monje más viejo sabía que no era la gran
cosa ayudar a alguien aún cuando no puede ser bien visto por las normas impuestas, el
mensaje es que no siempre se deben seguir las reglas al pie de la letra, cuando se quiere
ayudar a alguien esto puede que no sea muy importante, lo que queda a nuestro juicio el
decidir si cargaremos con la culpa por haber hecho algo malo según las normas impuestas o
estar tranquilos ya que se ayudó a alguien que lo necesitaba.
Varela Alpízar Benjamín:
Práctica: Esta práctica proporcionó una introducción práctica y sólida a la implementación
de aplicaciones utilizando contadores y registros de corrimiento en CPLD o FPGA. Gracias
a los conocimientos adquiridos de selección y configuración de relojes internos y externos,
el diseño y desarrollo de circuitos digitales más complejos y funcionales en futuros proyectos
resultara más sencillo.
Lectura: El mensaje que comunica la lectura es que no nos sirve de nada estar cargando con
ciertas cosas que ya pasaron, lo mejor es soltar y dejarlas ir, pues ya no podemos hacer nada
para cambiarlas, al contrario, nos estorban si seguimos pensando en ello.

Referencias Bibliográficas
[1] msavalos. (19 de enero de 2021). ¿Cómo funciona un Conversor Digital-Analógico
(DAC) R2R?. ELECTRÓNICA + PROGRAMACIÓN + GNU/LINUX.
https://electronlinux.wordpress.com/2021/01/19/como-funciona-un-conversor-digital-
analogico-dac-r2r/
[2] NayLamp Mechatronics. (s.f.) MÓDULO BLUETOOTH HC06.
https://naylampmechatronics.com/inalambrico/24-modulo-bluetooth-hc06.html
[3] Jaramillo Gómez, Juan Antonio. (2023). PRE-Práctica No. 8 y 9. Contadores y registro
de corrimiento universal. [Archivo PDF]. Recuperado el 27 de mayo de 2023.
https://classroom.google.com/u/0/c/NTU1NDc4MzMyMzJa
[4] Mano, M. Morris. (2006). Digital Design. 3ra edición. (pp. 257-259). Prentice Hall
Editorial. Recuperado de https://www.academia.edu/32873658/Digital_Design_3rd_Edition

41

Potrebbero piacerti anche