Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
1
Aplicación de máquinas de estado
.
-Diseñar en VHDL cada una de las partes al estado dos o el estado cargar registros, el pulsador
necesarias para la implementación del trabajo y debe de estar activo y el igual no importa en cual estado
diseñar un diagrama de bloques general. esté, en el estado dos o cargar registro los habilitadores
de los registros están activos, ya que el valor de A y de
-Utilice una tarjeta Digilent (Nexys) para la
B, los cuales describen el número desde donde empieza
implementación final. y termina el conteo, respectivamente, se busca que sean
-Utilice Vivado para la implementación del cargados en los registros paralelos-paralelos,. Para
trabajo. pasar al estado tres o carga contador el estado del
-Debe realizar la entrada al sistema desde los pulsador y del igual no importa, en este estado la única
DIPSW de la tarjeta y desde un pulsador de la salida activa es el load del contador, ya que en este
tarjeta. estado se carga como tal el valor del dato en el
contador. Para finalizar esta máquina de estados, al
-Debe realizar la operación de la máquina de
pasar al estado cuatro el estado del pulsador y del igual
estados basado en un reloj cuya frecuencia sea de tampoco importan, en este estado en este estado se
1Hz. evalúa cómo se encuentra el igual, es decir se comparan
-Los valores inicial y final se deben almacenar en los dos números hasta que sean iguales para poder
registros Paralelo/Paralelo y ambos deben comenzar nuevamente con la máquina de estados, acá
visualizarse en display 7 segmentos. se habilita el contador cuando A y B sean iguales.
-El valor actual (estado presente) del contador A partir de este diseño se busca implementarlo en una
FPGA el cual se describe como desarrollo de la práctica.
debe visualizarse en un display 7 segmentos.
-El valor del estado presente de la máquina de
estados debe verse también en un display 7
4 DESARROLLO DE LA PRÁCTICA
segmentos.
El desarrollo de esta práctica se realizó en VIVADO,
utilizando la tarjeta de programación Basys, lo primero
que se realizó en la programación fue el componente de
3 DISEÑO DE LA SOLUCIÓN DEL la máquina de estado de la figura 2, a partir de la lógica
PROBLEMA no discreta se habilita o deshabilita las salidas con “0” o
“1”, en todo este proceso se tienen en cuenta dos
señales que se crearon con el fin de identificar el estado
Para dar solución al problema lo primero que se hizo fue presente y el estado futuro descrito anteriormente, y
pensar en los posibles estados que se pudieran también un reset para poder inicializar la máquina
presentar, para ello, se diseñó la máquina de estados cuando fuera conveniente.
mostrada en la figura 2, la cual describe una Previamente se creó el flip-flop tipo D, tomando como
implementación tipo Moore, en el cual las salidas solo base el documento suministrado por el profesor,
dependen de los estados. teniendo cuatro entradas y una salida, siendo D,
CLEAR, CLK y el habilitador las entradas y Q la
respectiva salida, se tuvo en cuenta el CLEAR de este
para poder tener un reset para poder digitar valores
nuevos de los dos datos cargados. El contador
programable también se creó con el documento
suministrado por el profesor, teniendo como entradas a
el load, el habilitador el reset, el reloj, el registro y D, y
como salida Q, teniendo en cuenta un ciclo para poder
generar el conteo del número inicial al final.
Seguido a esto se creó el comparador, el cual sólo tiene
un ciclo para que pueda generar la salida en cero o en
uno según sea necesario, ya que cuando A y B son igual
la salida (Y) debe de ser “1” o sino un “0”.
Luego se creó el divisor, teniendo en cuenta que la
Basys tiene un reloj interno de 100MHz y por esto el
rango para la creación de este estuvo entre 0 y 50MHz.
Figura 2. Máquina de estados El resultado de toda esta programación se evidencia en
las figuras 2, 3, 4, 5 y 6, en las cuales se evidencia el
En este caso, la máquina de estados cuenta con cuatro contador, el dígito A, el B y el estado en el que se
entradas y cinco salidas. El pulsador y el igual son las encuentra respectivamente en los displays, para el
entradas, mientras que las salidas, son los dos ejemplo A fue el número “A” y B el número “2”.
habilitadores de los registros, el habilitador del contador,
el load del mismo y el número del estado. Como primer
estado de la máquina, es decir en reposo, el pulsador
está inactivo y el estado del igual no importa, con
respecto a las salidas todas están inactivas. Para pasar
2
Aplicación de máquinas de estado
.
5 CONCLUSIONES
La implementación de un diagrama de bloques
es fundamental para el desarrollo de cualquier
trabajo que requiera una lógica operativa y de
control
Una máquina de estados permite desarrollar un
orden determinado a la ejecución de diferentes
acciones
Es importante aprender a crear flip-flops de
cualquier tipo (D,T, JK, SR), ya que por medio de
estos se pueden construir diferentes elementos
que requieran de un reloj o contador.
6 REFERENCIAS
Figura 4. Estado “3”.
[1]Cdn.usc.edu.co, 2019. [Online]. Available:
http://cdn.usc.edu.co/files/LABORATORIOS/GUIAS/INGENI
ERIA/INGENIERIA%20EN%20SISTEMAS/CIRCUITOS%20
DIGITALES%20II/LOGICA%20DE%20CONTROL.pdf.
[Accessed: 28- Jan- 2019].
3
Aplicación de máquinas de estado
.
APÉNDICE 1
Apéndice 2
4
Aplicación de máquinas de estado
.
Apéndice 3
DIVISOR
entity divisor is
Port ( clk_D : in STD_LOGIC;
clk_1 : inout STD_LOGIC);
end divisor;
begin
process(clk_D) --divisor
begin
if (clk_D'event and clk_D='1') then
if(Divisor = 50000000)then
Divisor<=0;
CLKo <= not CLKo;
else
Divisor <= Divisor + 1;
end if;
end if;
end Process;
clk_1<=CLKo;
end Behavioral;
VISUALIZACIÓN DINÁMICA
entity VIS_BIN_4DIG is
Port ( clkb:in STD_LOGIC;
CLR: IN STD_LOGIC;
BIN2 : inout STD_LOGIC_VECTOR (1 downto 0));
end VIS_BIN_4DIG;
architecture Behavioral of VIS_BIN_4DIG is
signal Divisor :INTEGER RANGE 0 TO 200000;
signal se: std_logic;
SIGNAL PULSOn : STD_LOGIC;
SIGNAL BINn : STD_LOGIC_VECTOR (1 downto 0);
begin
BIN2<=BINn;
process(clkb,CLR,Divisor) --divisor
begin
if (clkb'event and clkb='1') then
if(Divisor = 200000)then
Divisor<=0;
se <= not se;
else
Divisor <= Divisor + 1;
end if;
end if;
PULSOn<=se;
end Process;
process (PULSOn)
begin
if (PULSOn' event and PULSOn='1') then
if BINn="11" OR CLR = '1' then BINn<="00";
else
5
Aplicación de máquinas de estado
.
BINn<=BINn+1;
end if;
end if;
end process;
end Behavioral;
MÁQUINAS DE ESTADO
entity Registros is
port(reset: in std_logic;
clk: in std_logic;
Puls: in std_logic;
igual: in std_logic;
HPP1: inout std_logic;
HPP2: inout std_logic;
HCONT: inout std_logic;
N_estado: inout STD_LOGIC_VECTOR(3 downto 0);
Lcont: inout std_logic);
end Registros;
architecture behavioral of Registros is
TYPE ESTADOS IS (D0,D1,D2,D3);
SIGNAL E_PRE,E_FUT:ESTADOS;
BEGIN
PROCESS(E_PRE,Puls,reset,igual)
begin
case E_PRE is
when D0 =>
HCONT<='0';
LCONT<='0';
N_estado<="0000";
if Puls='1' then
HPP1<='1';
HPP2<='1';
E_FUT<=D1;
else
E_FUT<= D0;
HPP1<='0';
HPP2<='0';
end if;
when D1 =>
if reset='0' then
HPP1<='1';
HPP2<='1';
HCONT<='0';
LCONT<='0';
N_estado<="0001";
E_FUT<=D2;
else
N_estado<="0000";
E_FUT<=D0;
end if;
when D2=>
if reset='0' then
HPP1<='0';
HPP2<='0';
HCONT<='0';
LCONT<='1';
N_estado<="0010";
E_FUT<=D3;
else
N_estado<="0000";
6
Aplicación de máquinas de estado
.
E_FUT<=D0;
end if;
when D3 =>
if reset='0' then
HPP1<='0';
HPP2<='0';
LCONT<='0';
N_estado<="0011";
if igual = '0' then
HCONT<='1';
E_FUT<=D3;
else
N_estado<="0000";
E_FUT<=D0;
HCONT<='0';
end if;
else
E_FUT<=D0;
end if;
end CASE;
end process;
process(clk)
begin
if(clk'event and clk='0')then
E_PRE<=E_FUT;
end if;
end process;
end behavioral;
FLIP-FLOP
entity FFD is
Port ( D : in STD_LOGIC_VECTOR (3 downto 0);
CLEAR : in STD_LOGIC;
CLK : in STD_LOGIC;
habilitador:in std_logic;
Q : out STD_LOGIC_VECTOR (3 downto 0));
end FFD;
end Behavioral;
CONTADOR PROGRAMABLE
7
Aplicación de máquinas de estado
.
entity CONTADOR is
Port ( load : in STD_LOGIC;
hab : in STD_LOGIC;
reset : in STD_LOGIC;
clk : in STD_LOGIC;
regB: in std_logic_vector(3 downto 0);
D : in STD_LOGIC_VECTOR (3 downto 0);
Q : out STD_LOGIC_VECTOR (3 downto 0));
end CONTADOR;
Q<=conteo;
end Behavioral;
COMPARADOR
entity comparador is
port (
A: in std_logic_vector(3 downto 0);
B: in std_logic_vector(3 downto 0);
Y: inout std_logic);
end comparador;
architecture behavioral of comparador is
begin
process(A,B)
begin
if A=B then
Y<='1';
else
Y<='0';
end if;
end process;
end behavioral;
SIETE SEGMENTOS
entity Seven_Segments is
Port ( BCD : in STD_LOGIC_VECTOR (3 downto 0);
rsts: in std_logic;
SAL7SEG: out STD_LOGIC_VECTOR (6 downto 0));
8
Aplicación de máquinas de estado
.
end Seven_Segments;
begin
process (BCD,rsts)
BEGIN
if rsts='1' then
SAL7SEG<="0000001";
else
case BCD is
when "0000" => SAL7SEG <= "0000001"; -- 0
when "0001" => SAL7SEG<= "1001111"; -- 1
when "0010" => SAL7SEG <= "0010010"; -- 2
when "0011" => SAL7SEG <= "0000110"; -- 3
when "0100" => SAL7SEG <= "1001100"; -- 4
when "0101" => SAL7SEG <= "0100100"; -- 5
when "0110" => SAL7SEG <= "0100000"; -- 6
when "0111" => SAL7SEG <= "0001111"; -- 7
when "1000" => SAL7SEG <= "0000000"; -- 8
when "1001" => SAL7SEG <= "0000100"; -- 9
when "1010" => SAL7SEG <= "0001000"; -- A
when "1011" => SAL7SEG <= "1100000"; -- B
when "1100" => SAL7SEG <= "0110001"; -- C
when "1101" => SAL7SEG <= "1000010"; -- D
when "1110" => SAL7SEG <= "0110000"; -- E
when others => SAL7SEG <= "0111000"; -- F
end case;
end if;
END PROCESS;
end Behavioral;
MAIN
entity MAIN is
Port (A: in std_logic_vector(3 downto 0);
B: in std_logic_vector(3 downto 0);
reloj: in std_logic;
btn_reset: in std_logic;
btn_cargar: in std_logic;
seg: out STD_LOGIC_VECTOR(6 downto 0);
displays: out STD_LOGIC_VECTOR(3 downto 0));
end MAIN;
component divisor is
Port ( clk_D : in STD_LOGIC;
clk_1 : inout STD_LOGIC);
end component divisor;
component comparador is
port (
A: in std_logic_vector(3 downto 0);
B: in std_logic_vector(3 downto 0);
Y: inout std_logic);
end component comparador;
component CONTADOR is
Port ( load : in STD_LOGIC;
9
Aplicación de máquinas de estado
.
hab : in STD_LOGIC;
reset : in STD_LOGIC;
clk : in STD_LOGIC;
regB: in std_logic_vector(3 downto 0);
D : in STD_LOGIC_VECTOR (3 downto 0);
Q : out STD_LOGIC_VECTOR (3 downto 0));
end component CONTADOR;
component VIS_BIN_4DIG is
Port ( clkb:in STD_LOGIC;
CLR: IN STD_LOGIC;
BIN2 : inout STD_LOGIC_VECTOR (1 downto 0));
end component VIS_BIN_4DIG;
component FFD is
Port ( D : in STD_LOGIC_VECTOR (3 downto 0);
CLEAR : in STD_LOGIC;
CLK : in STD_LOGIC;
habilitador:in std_logic;
Q : out STD_LOGIC_VECTOR (3 downto 0));
end component FFD;
component Registros is
port(reset: in std_logic;
clk: in std_logic;
Puls: in std_logic;
igual: in std_logic;
HPP1: inout std_logic;
HPP2: inout std_logic;
HCONT: inout std_logic;
N_estado: inout STD_LOGIC_VECTOR(3 downto 0);
Lcont: inout std_logic);
end component Registros;
component Seven_Segments is
Port ( BCD : in STD_LOGIC_VECTOR (3 downto 0);
rsts: in std_logic;
SAL7SEG: out STD_LOGIC_VECTOR (6 downto 0));
end component Seven_Segments;
signal s_clk:std_logic;
signal sigual: std_logic;
signal sHPP1: std_logic;
signal sHPP2: std_logic;
signal slcont: std_logic;
signal shcont: std_logic;
signal sreg1:std_logic_vector(3 downto 0);
signal sreg2:std_logic_vector(3 downto 0);
signal scontador: std_logic_vector(3 downto 0);
signal vis: STD_LOGIC_VECTOR(1 downto 0);
signal display_sel: STD_LOGIC_VECTOR(3 downto 0);
signal sseg :std_logic_vector(3 downto 0);
SIGNAL sestado: std_logic_vector(3 downto 0);
begin
divisor_1HZ: divisor PORT MAP (
clk_D=> reloj,
clk_1=> s_clk );
maquina: Registros PORT MAP (reset=> btn_reset,
clk=> s_clk,
Puls=>btn_cargar,
igual=>sigual,
HPP1=>sHPP1,
10
Aplicación de máquinas de estado
.
HPP2=>sHPP2,
Hcont=>shcont,
N_estado=>sestado,
Lcont=>slcont);
reg1: FFD PORT MAP (D=>A,
CLK=>s_clk,
CLEAR=>btn_reset,
habilitador=>sHPP1,
Q=>sreg1);
reg2: FFD PORT MAP (D=>B,
CLK=>s_clk,
CLEAR=>btn_reset,
habilitador=>sHPP2,
Q=>sreg2);
contador_programable: contador PORT MAP (load=>slcont,
hab=>shcont,
reset=>btn_reset,
clk=>s_clk,
regB => sreg2,
D=>sreg1,
Q=>scontador);
Visualizacion: VIS_BIN_4DIG PORT MAP (clkb=>reloj,
CLR=>btn_reset,
BIN2=>vis);
process(vis,display_sel)
begin -- selección del display
case vis is
when "00" =>
display_sel <= "1110"; -- display 0
when "01" =>
display_sel <= "1101"; -- display 1
when "10" =>
display_sel <= "1011"; -- display 2
when others =>
display_sel <= "0111"; -- display 3
end case;
-- mostrar digitos
case display_sel is
when "1110" =>
sseg <= sreg2; -- 0
when "1101" =>
sseg <= sreg1; -- 1
when "1011" =>
sseg<= scontador; -- 2
when others =>
sseg <= sestado;
end case;
end process;
end Behavioral;
11
Aplicación de máquinas de estado
.
12