SEP

DGEST
INSTITUTO

TECNOLÓGICO

SNEST

DE

MATAMOROS

DEPARTAMENTO DE INGENIERÍA ELÉCTRICA Y ELECTRÓNICA

Diseño Digital con VHDL
Equipo:

Alumno(s):

Núm. de control:

Mario Arturo Cruz Colunga

11260077

Miguel Angel Fierros Peña

11260081

Hermenegildo Martínez de la Cruz

11260095

Jorge Alejandro Reyes Torres

11260108

H. MATAMOROS, TAM.

16 de Octubre del 2013
Practica 7
Objetivo:
Esta práctica implementará un contador de 3 bits descendente/ascendente usando
el AldecHDL y máquinas de estado finito.
Marco teórico:
Un contador ascendente/descendente (up/down)
Es aquel capaz de procesar en cualquier dirección a lo largo de una cierta
secuencia. Un contador ascendente/descendente, algunas veces también
denominado contador bidireccional, puede tener cualquier secuencia de estados
especificada. Un contador binario de 3 bits que avanza en modo ascendente a
través de la secuencia (0,1,2,3,4,5,6,7) y que luego pueda invertirse para recorrer
la secuencia en sentido contrario (7,6,5,4,3,2,1,0) es un ejemplo de un modo de
operación secuencial ascendente/descendente.
Máquina de estados
Se denomina máquina de estados finitos (FSM por finitestate machine) si el
conjunto de estados de la máquina es finito, este es el único tipo de máquinas de
estados que podemos modelar en un computador en la actualidad; debido a esto
se suelen utilizar los términos máquina de estados y máquina de estados finitos de
forma intercambiable. Sin embargo un ejemplo de una máquina de estados
infinitos sería un computador cuántico esto es debido a que los Qubit que utilizaría
este tipo de computadores toma valores continuos, en contraposición los bits
toman valores discretos (0 ó 1). Otro buen ejemplo de una máquina de estados
infinitos es una Máquina universal de Turing la cual se puede definir teóricamente
con una "cinta" o memoria infinita.
La representación de una máquina de estados se realiza mediante un Diagrama
de estados, sin embargo también es posible utilizar un Diagrama de flujo.
Material:
Laptop
Kit spartan3e
Software aldec HDL, xilinx ISE, adept.
Procedimiento:
Se crea nuevo proyecto en aldec HDL
Se crea un diagrama de estados
Entity : counter
Architecture: counter_arch

C
X

B

clk

A

Sreg0
clk
ce No clock enable

X='1'

count2
/010/

A<='0';B<='1';C<='0'
X='1'

count1
/001/

X='0'

X='0'
A<='0';B<='0';C<='1'

count3
/011/

A<='0';B<='1';C<='1'

X='1'
X='0'
X='0'

count0
/000/

X='1'

X='1'
count4
/100/

A<='0';B<='0';C<='0'

X='1'

X='0'

count7
/111/

count5
/101/

X='1'
A<='1';B<='1';C<='1'
X='1'
X='0'

X='0'
count6
/110/

A<='1';B<='1';C<='0'

A<='1';B<='0';C<='0'

X='0'

A<='1';B<='0';C<='1'
Se escribe el código VHDL en el nuevo proyecto
Divisorreloj
libraryieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entitydivisorrelojis
port(
clkin: in std_logic;
reset: in std_logic;
clkout: outstd_logic
);
enddivisorreloj;
architectureclkdiv of divisorrelojis
signal q: std_logic_vector(23 downto 0);
begin
process(clkin, reset)
begin
ifreset='1' then
q <= x"000000";
elsifclkin'event and clkin ='1' then
q <= q + 1;
endif;
endprocess;
clkout<= q(23);
endclkdiv;
Contador3bit
libraryieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entitycontadorconrelojis
port(
CLK50M, UPDOWN, reset: in std_logic;
anodo7seg: outstd_logic_vector(3 downto 0);
display:outstd_logic_vector(6 downto 0));
endcontadorconreloj;
architectureArq_contadorconreloj of contadorconrelojis
componentdivisorreloj
port(
clkin: in std_logic;
reset: in std_logic;
clkout: outstd_logic);
--modifique algunos cosas por mi reloj, si
pongo el del pdf modificar CLK, pulsoout
endcomponent;
componentcounter
port(
clk, X: in std_logic;
A,B,C: outstd_logic);
endcomponent;
component BCD_A_7Seg
port(
BCD: in std_logic_vector(3 downto 0);
Seg: outstd_logic_vector(6 downto 0));
endcomponent;
signal CLK1: std_logic;
signal B: std_logic_vector(3 downto 0);
begin
B(3) <= '0';
anodo7seg
<=
"1110";
U1: divisorreloj
portmap(clkin => CLK50M, reset =>reset, clkout => CLK1);
U2: counter
portmap(clk => CLK1, X => UPDOWN, A => B(2), B => B(1), C=>B(0));
U3: BCD_A_7Seg
portmap (BCD => B, Seg =>display );
endArq_contadorconreloj;
bcd7seg
libraryieee;
use ieee.std_logic_1164.all;
entity BCD_A_7Seg is
port(BCD: in std_logic_vector (3 downto 0);
seg : outstd_logic_vector(6 downto 0));
end BCD_A_7Seg;
architecture BCD_A_7Seg of BCD_A_7Seg is
begin
DecodificadorProc: process (BCD) -- corre el proceso si la entrada BCD cambia.
begin
case BCD is
-- Catodo valor bajo
-- abcdefg
when "0000" =>seg<= "0000001";
when "0001" =>seg<= "1001111";
when "0010" =>seg<= "0010010";
when "0011" =>seg<= "0000110";
when "0100" =>seg<= "1001100";
when "0101" =>seg<= "0100100";
when "0110" =>seg<= "0100000";
when "0111" =>seg<= "0001111";
when "1000" =>seg<= "0000000";
when "1001" =>seg<= "0000100";
when "1010" =>seg<= "1110010";
when "1011" =>seg<= "1100110";
when "1100" =>seg<= "1011100";
when "1101" =>seg<= "0110100";
when "1110" =>seg<= "1110000";
whenothers =>seg<= "1111111";
end case;
endprocess;
end BCD_A_7Seg;

--llamaremos seg provisionalmente

Observaciones y conclusiones:
El programa se realizó con algunas dificultades porque se cambiaron algunos nombres del
proyecto original, pero después de detectarse los errores se realizaron las correcciones y
terminamos la práctica satisfactoriamente.

Reporte vhdl7

  • 1.
    SEP DGEST INSTITUTO TECNOLÓGICO SNEST DE MATAMOROS DEPARTAMENTO DE INGENIERÍAELÉCTRICA Y ELECTRÓNICA Diseño Digital con VHDL Equipo: Alumno(s): Núm. de control: Mario Arturo Cruz Colunga 11260077 Miguel Angel Fierros Peña 11260081 Hermenegildo Martínez de la Cruz 11260095 Jorge Alejandro Reyes Torres 11260108 H. MATAMOROS, TAM. 16 de Octubre del 2013
  • 2.
    Practica 7 Objetivo: Esta prácticaimplementará un contador de 3 bits descendente/ascendente usando el AldecHDL y máquinas de estado finito. Marco teórico: Un contador ascendente/descendente (up/down) Es aquel capaz de procesar en cualquier dirección a lo largo de una cierta secuencia. Un contador ascendente/descendente, algunas veces también denominado contador bidireccional, puede tener cualquier secuencia de estados especificada. Un contador binario de 3 bits que avanza en modo ascendente a través de la secuencia (0,1,2,3,4,5,6,7) y que luego pueda invertirse para recorrer la secuencia en sentido contrario (7,6,5,4,3,2,1,0) es un ejemplo de un modo de operación secuencial ascendente/descendente. Máquina de estados Se denomina máquina de estados finitos (FSM por finitestate machine) si el conjunto de estados de la máquina es finito, este es el único tipo de máquinas de estados que podemos modelar en un computador en la actualidad; debido a esto se suelen utilizar los términos máquina de estados y máquina de estados finitos de forma intercambiable. Sin embargo un ejemplo de una máquina de estados infinitos sería un computador cuántico esto es debido a que los Qubit que utilizaría este tipo de computadores toma valores continuos, en contraposición los bits toman valores discretos (0 ó 1). Otro buen ejemplo de una máquina de estados infinitos es una Máquina universal de Turing la cual se puede definir teóricamente con una "cinta" o memoria infinita. La representación de una máquina de estados se realiza mediante un Diagrama de estados, sin embargo también es posible utilizar un Diagrama de flujo. Material: Laptop Kit spartan3e Software aldec HDL, xilinx ISE, adept.
  • 3.
    Procedimiento: Se crea nuevoproyecto en aldec HDL Se crea un diagrama de estados Entity : counter Architecture: counter_arch C X B clk A Sreg0 clk ce No clock enable X='1' count2 /010/ A<='0';B<='1';C<='0' X='1' count1 /001/ X='0' X='0' A<='0';B<='0';C<='1' count3 /011/ A<='0';B<='1';C<='1' X='1' X='0' X='0' count0 /000/ X='1' X='1' count4 /100/ A<='0';B<='0';C<='0' X='1' X='0' count7 /111/ count5 /101/ X='1' A<='1';B<='1';C<='1' X='1' X='0' X='0' count6 /110/ A<='1';B<='1';C<='0' A<='1';B<='0';C<='0' X='0' A<='1';B<='0';C<='1'
  • 4.
    Se escribe elcódigo VHDL en el nuevo proyecto Divisorreloj libraryieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entitydivisorrelojis port( clkin: in std_logic; reset: in std_logic; clkout: outstd_logic ); enddivisorreloj; architectureclkdiv of divisorrelojis signal q: std_logic_vector(23 downto 0); begin process(clkin, reset) begin ifreset='1' then q <= x"000000"; elsifclkin'event and clkin ='1' then q <= q + 1; endif; endprocess; clkout<= q(23); endclkdiv;
  • 5.
    Contador3bit libraryieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; useieee.std_logic_unsigned.all; entitycontadorconrelojis port( CLK50M, UPDOWN, reset: in std_logic; anodo7seg: outstd_logic_vector(3 downto 0); display:outstd_logic_vector(6 downto 0)); endcontadorconreloj; architectureArq_contadorconreloj of contadorconrelojis componentdivisorreloj port( clkin: in std_logic; reset: in std_logic; clkout: outstd_logic); --modifique algunos cosas por mi reloj, si pongo el del pdf modificar CLK, pulsoout endcomponent; componentcounter port( clk, X: in std_logic; A,B,C: outstd_logic); endcomponent; component BCD_A_7Seg port( BCD: in std_logic_vector(3 downto 0); Seg: outstd_logic_vector(6 downto 0)); endcomponent; signal CLK1: std_logic; signal B: std_logic_vector(3 downto 0); begin B(3) <= '0'; anodo7seg <= "1110"; U1: divisorreloj portmap(clkin => CLK50M, reset =>reset, clkout => CLK1); U2: counter portmap(clk => CLK1, X => UPDOWN, A => B(2), B => B(1), C=>B(0)); U3: BCD_A_7Seg portmap (BCD => B, Seg =>display ); endArq_contadorconreloj;
  • 6.
    bcd7seg libraryieee; use ieee.std_logic_1164.all; entity BCD_A_7Segis port(BCD: in std_logic_vector (3 downto 0); seg : outstd_logic_vector(6 downto 0)); end BCD_A_7Seg; architecture BCD_A_7Seg of BCD_A_7Seg is begin DecodificadorProc: process (BCD) -- corre el proceso si la entrada BCD cambia. begin case BCD is -- Catodo valor bajo -- abcdefg when "0000" =>seg<= "0000001"; when "0001" =>seg<= "1001111"; when "0010" =>seg<= "0010010"; when "0011" =>seg<= "0000110"; when "0100" =>seg<= "1001100"; when "0101" =>seg<= "0100100"; when "0110" =>seg<= "0100000"; when "0111" =>seg<= "0001111"; when "1000" =>seg<= "0000000"; when "1001" =>seg<= "0000100"; when "1010" =>seg<= "1110010"; when "1011" =>seg<= "1100110"; when "1100" =>seg<= "1011100"; when "1101" =>seg<= "0110100"; when "1110" =>seg<= "1110000"; whenothers =>seg<= "1111111"; end case; endprocess; end BCD_A_7Seg; --llamaremos seg provisionalmente Observaciones y conclusiones: El programa se realizó con algunas dificultades porque se cambiaron algunos nombres del proyecto original, pero después de detectarse los errores se realizaron las correcciones y terminamos la práctica satisfactoriamente.