You are on page 1of 18

Finite State Machine FSM

Ing. Yezid Almanza Pérez Electiva 1 Procesamiento Digital de Señales

• El ejercicio desarrollado a continuación.3. Corresponde al problema 5. 125. Chu. Pong P. esta propuesto en el libro FPGA PROTOTYPING BY EXAMPLES.5. pag. .

Se utilizan dos pares de fotosensores para monitorear la actividad de los carros como se muestra en la figura. la luz es bloqueada y la salida correspondiente es asegurada a ‘1’. las señales a y b son “00”). e. inc y dec. la secuencia siguiente indica que un carro entra al estacionamiento. Cuando un objeto esta entre el foto transmisor y el foto receptor. e. las cuales incrementa y decrementa el contador cuando se aseguran.. Verifique la operación del contador de ocupación. Diseñe un contador de ocupación de estacionamiento como sigue: 1.. Derive el código HDL para el FSM 3. a y b.CONTADOR DE OCUPACIÓN DE ESTACIONAMIENTO • Considere un estacionamiento con una sola puerta de entrada y salida. – Inicialmente. – El sensor a es desbloqueado (i. ambos sensores están desbloqueados (i. podemos determinar si un carro esta entrando o saliendo o un peatón esta pasando. Por ejemplo. – Ambos sensores están bloqueados (i. las señales a y b son “11”). Diseñe un contador con dos señales de control. y dos señales de salida. respenctivamente. e. – El sensor a es bloqueado (i. – Ambos sensores llegan a estar desbloqueados (i. . 2. las señales a y b son “01”).e. las señales a y b son “00”).. enter y exit. e.. Las señales enter y exit se aseguran en un ciclo de reloj cuando un carro entra y un ciclo de reloj cuando un carro sale del estacionamiento. las señales a y b son “10”). Para monitorear los eventos de 2 sensores. Derive el código HDL 4. Use dos pushbottons con atirebote para la operación mímica de las dos entradas de sensores. Diseñe un FSM con dos señales de entrada. Combine el contador y el FSM y el circuito de multiplexación de LED.

Diagrama de estados 10 01 00 10 B 10 11 A 00 10 01 00 11 01 C D 01 11 .

Binario a 7 segmentos Salida BCD U. Contador de autos Salida del contador de 8 bits Paquete. Bcd D.Bloque principal del estacionamiento Paquete. Bcd Señales adicionales CLOCK y RESET SA SB FSM de entrada-salida y contador 7 0 Convertidor de binario a BCD Instancia 1 Sensor_A FSM DB 4 Sensor_B FSM DB Instancia 2 4 4 Multiplexación BCD a 7 segmentos a b c d e f g ánodo 0 ánodo 1 ánodo 2 ánodo 3 DB: Circuito antirebote . Bcd C.

END DPLDRV. DIGITO0 : IN STD_LOGIC_VECTOR (3 DOWNTO 0). --Digito del display de las decenas DIGITO2 : IN STD_LOGIC_VECTOR (3 DOWNTO 0). --Digito del display de las centenas -DIGITO3 : IN INTEGER RANGE 0 TO 8.Entidad DPLDRV (Multiplexadora de Display) Código aportado por Adrian Costa Ospino ENTITY DPLDRV IS PORT ( CLK50M : IN STD_LOGIC. --Digito del display de las unidades DIGITO1 : IN STD_LOGIC_VECTOR (3 DOWNTO 0). DPL_SEG : INOUT STD_LOGIC_VECTOR (0 TO 7) ). . --Digito del display de las millar DPL_ENABLE : INOUT STD_LOGIC_VECTOR (3 DOWNTO 0).

END PROCESS. BEGIN DPL_ENABLE <= "1110" WHEN (POS_DISPLAY = 0) ELSE "1101" WHEN (POS_DISPLAY = 1) ELSE "1011" WHEN (POS_DISPLAY = 2) ELSE "0111".Arquitectura DPLDRV Código aportado por Adrian Costa Ospino ARCHITECTURE BEHAVIORAL OF DPLDRV IS SIGNAL DIGITO : INTEGER RANGE 0 TO 15:=0. . DPL_SEG <= "0000001" WHEN (DIGITO=0) ELSE "1001111" WHEN (DIGITO=1) ELSE "0010010" WHEN (DIGITO=2) ELSE "0000110" WHEN (DIGITO=3) ELSE "1001100" WHEN (DIGITO=4) ELSE "0100100" WHEN (DIGITO=5) ELSE "0100000" WHEN (DIGITO=6) ELSE "0001111" WHEN (DIGITO=7) ELSE "0000000" WHEN (DIGITO=8) ELSE "0000100" WHEN (DIGITO=9) ELSE "1111111". SIGNAL POS_DISPLAY : INTEGER RANGE 0 TO 3:=0. END BEHAVIORAL. PROCESS (CLK50M) BEGIN IF (CLK50M'EVENT AND CLK50M='1') THEN DELAY <= DELAY+1. END IF. END IF. DIGITO <= DIGITO0 WHEN (POS_DISPLAY = 0) ELSE DIGITO1 WHEN (POS_DISPLAY = 1) ELSE DIGITO2 WHEN (POS_DISPLAY = 2) ELSE DIGITO3. IF ( DELAY="11111111111111" ) THEN POS_DISPLAY <= POS_DISPLAY+1. SIGNAL DELAY : STD_LOGIC_VECTOR (13 DOWNTO 0).

db : inout STD_LOGIC). 120. 121 • entity DB_FSM is Port ( clk : in STD_LOGIC. Pong P. .Entidad DB_FSM (Máquina de estados finitos para el antirebote) Tomado del libro FPGA PROTOTYPING BY EXAMPLES. sw : in STD_LOGIC. end DB_FSM. Pag. Chu.

end if. signal state_reg. -. end process. Begin process (clk) begin if (clk'event and clk = '1') then q_reg <= q_next. Pong P. signal q_reg. . end if.next state logic q_next <= q_reg + 1.Arquitectura DB_FSM (Máquina de estados finitos para el antirebote) Tomado del libro FPGA PROTOTYPING BY EXAMPLES. wait0_2.state register process (clk) begin if (clk'event and clk = '1') then state_reg <= state_next. signal m_db: std_logic. Pag.output db m_db <= '1' when q_reg = 0 else '0'. wait0_3). q_next: unsigned(N-1 downto 0). -.24 ms. 120. one. end process. wait0_1. wait1_2. -. -. 121 architecture Behavioral of DB_FSM is constant N: integer:= 19. state_next: eg_state_type := zero. wait1_1. type eg_state_type is (zero.2^N * 20 ns = 10. wait1_3. Chu.

end if. end if. end if.process (state_reg. else if m_db = '1' then state_next <= zero. end if. if sw = '0' then state_next <= wait1_1. else if m_db = '1' then state_next <= one. end if. sw. end if. when one => db <= '1'. when wait0_3 => db <= '1'. end Behavioral. end if. . when wait1_3 => if sw = '0' then state_next <= zero. else if m_db = '1' then state_next <= wait0_3. if sw = '1' then state_next <= one. else if m_db = '1' then state_next <= wait1_2. else if m_db = '1' then state_next <= wait1_3. end case. when wait0_2 => db <= '1'. when wait0_1 => db <= '1'. end if. end if. end if. end process. m_db) begin state_next <= state_reg. case state_reg is when zero => if sw = '1' then state_next <= wait1_1. when wait1_2 => if sw = '0' then state_next <= zero. end if. end if. if sw = '1' then state_next <= one. db <= '0'. end if. if sw = '1' then state_next <= one. else if m_db = '1' then state_next <= wait0_2. end if. when wait1_1 => if sw = '0' then state_next <= zero.

sens_a : in STD_LOGIC. sens_b : in STD_LOGIC. end CuentaAutos_vhd. Yezid Almanza Pérez entity CuentaAutos_vhd is Port ( rst : in STD_LOGIC. cuenta : inout STD_LOGIC_VECTOR (7 DOWNTO 0) ). . clk : in STD_LOGIC.Entidad CuentaAutos_vhd (FSM que reconoce la entrada o salida de autos) Código desarrollado por Ing.

begin Antirebote_1: entity work. edo_c. contact<=cont .DB_FSM(behavioral) port map (sw => Sens_A. signal cont. state_aux <= edo_a. edo_d). end if. state_prev. signal sensor_A.DB_FSM(behavioral) port map (sw => Sens_B. edo_b. . contact: STD_LOGIC_VECTOR(7 downto 0):=(others=> '0'). RST) begin if(RST='1') then state_act <= edo_a. db=>sensor_B ). elsif (clk'event and clk='1') then state_act <= state_sig. Yezid Almanza Pérez architecture Behavioral of CuentaAutos_vhd is type estados is (edo_a. contact <= (others => '0'). sensor_B: STD_LOGIC.Arquitectura CuentaAutos_vhd (FSM que reconoce la entrada o salida de autos) Código desarrollado por Ing. state_sig. Antirebote_2: entity work. state_aux: estados := edo_a. -. clk => clk. state_aux <=state_prev. clk => clk.state register process (clk. db=>sensor_A ). end process. signal state_act.

elsif (state_aux = edo_b) then cont <= contact . . elsif (state_aux = edo_a and sensor_a = 'H' and sensor_b = 'H') then state_sig <= edo_c. end if. sensor_b. state_aux. Yezid Almanza Pérez process (state_act.Arquitectura CuentaAutos_vhd (FSM que reconoce la entrada o salida de autos) Código desarrollado por Ing. if (sensor_a = 'H' and sensor_b = 'L') then state_sig <= edo_b. sensor_a. elsif (state_aux = edo_c and sensor_a = 'L' and sensor_b = 'L') then state_sig <= edo_a. elsif (sensor_a = 'L' and sensor_b = 'H') then state_sig <= edo_d. state_prev <= edo_c. state_prev <= edo_a. elsif (state_aux = edo_c and sensor_a = 'H' and sensor_b = 'L') then state_sig <= edo_b.1. state_prev <= edo_b. state_prev <= edo_a. contact) begin case state_act is when edo_a => if (state_aux = edo_d) then cont <= contact + 1. when edo_b => if (state_aux = edo_a and sensor_a = 'H' and sensor_b = 'L') then state_sig <= edo_b. else state_sig <= edo_a. else state_sig <= edo_a. cont <= contact. end if. state_prev <= edo_a. state_prev <= edo_b. else cont <= contact. end if.

Yezid Almanza Pérez when edo_c => if (state_aux = edo_b and sensor_a = 'H' and sensor_b = 'H') then state_sig <= edo_c. end if. cont <= contact. cont <= contact. state_prev <= edo_b. cuenta <= cont. elsif (state_aux = edo_d and sensor_a = 'H' and sensor_b = 'H') then state_sig <= edo_c. elsif (state_aux = edo_a and sensor_a = 'L' and sensor_b = 'H') then state_sig <= edo_d. state_prev <= edo_d. . end Behavioral. state_prev <= edo_a. state_prev <= edo_a. else state_sig <= edo_a. state_prev <= edo_c. elsif (state_aux = edo_c and sensor_a = 'L' and sensor_b = 'L') then state_sig <= edo_a. else state_sig <= edo_a. end process. state_prev <= edo_c. elsif (state_aux = edo_a and sensor_a = 'H' and sensor_b = 'H') then state_sig <= edo_c. elsif (state_aux = edo_d and sensor_a = 'H' and sensor_b = 'L') then state_sig <= edo_b. end case. state_prev <= edo_c. state_prev <= edo_d.Arquitectura CuentaAutos_vhd (FSM que reconoce la entrada o salida de autos) Código desarrollado por Ing. end if. when edo_d => if (state_aux = edo_c and sensor_a = 'L' and sensor_b = 'H') then state_sig <= edo_d. elsif (state_aux = edo_b and sensor_a = 'L' and sensor_b = 'H') then state_sig <= edo_d. state_prev <= edo_a. state_prev <= edo_d.

Entidad BYTE2BCD (Convierte un byte a código BCD) Código aportado por Adrian Costa Ospino ENTITY BYTE2BCD IS PORT ( BYTE : INOUT STD_LOGIC_VECTOR (7 DIGITO0 : INOUT STD_LOGIC_VECTOR DIGITO1 : INOUT STD_LOGIC_VECTOR DIGITO2 : INOUT STD_LOGIC_VECTOR END BYTE2BCD. (3 DOWNTO 0). DOWNTO 0). (3 DOWNTO 0). (3 DOWNTO 0)). .

-. DU5 <= DU4(2 DOWNTO 0)&BYTE(0). -. DU3 <= DU2(2 DOWNTO 0)&BYTE(2) WHEN ( (DU2(2 DOWNTO 0)&BYTE(2))<5 ) ELSE DU2(2 DOWNTO 0)&BYTE(2)+3.DIGITO2 <= CONV_INTEGER(DC0). . DD0 <= '0'&DU0(3)&DU1(3)&DU2(3) WHEN ( (DU0(3)&DU1(3)&DU2(3))<5 ) ELSE '0'&DU0(3)&DU1(3)&DU2(3)+3. SIGNAL DC0 : STD_LOGIC_VECTOR( 3 DOWNTO 0 ). DD2 <= DD1(2)&DD1(1)&DD1(0)&DU4(3). DU1 <= DU0(2 DOWNTO 0)&BYTE(4) WHEN ( (DU0(2 DOWNTO 0)&BYTE(4))<5 ) ELSE DU0(2 DOWNTO 0)&BYTE(4)+3. -DIGITO3 <= CONV_INTEGER(PRBDATA). DIGITO2 <= DC0. DIGITO1 <= DD2. --DECENAS.DIGITO1 <= CONV_INTEGER(DD2). SIGNAL DD2 : STD_LOGIC_VECTOR( 3 DOWNTO 0 ).Arquitectura BYTE2BCD Código aportado por Adrian Costa Ospino ARCHITECTURE BEHAVIORAL OF BYTE2BCD IS SIGNAL DU0 : STD_LOGIC_VECTOR( 3 DOWNTO 0 ). DC0 <= '0'&'0'&DD0(3)&DD1(3). DU0 <= '0'&BYTE(7 DOWNTO 5) WHEN (BYTE(7 DOWNTO 5)<5) ELSE '0'&BYTE(7 DOWNTO 5)+3. SIGNAL DU4 : STD_LOGIC_VECTOR( 3 DOWNTO 0 ). END BEHAVIORAL.DIGITO0 <= CONV_INTEGER(DU5). DU4 <= DU3(2 DOWNTO 0)&BYTE(1) WHEN ( (DU3(2 DOWNTO 0)&BYTE(1))<5 ) ELSE DU3(2 DOWNTO 0)&BYTE(1)+3. DD1 <= DD0(2)&DD0(1)&DD0(0)&DU3(3) WHEN ( (DD0(2)&DD0(1)&DD0(0)&DU3(3))<5 ) ELSE DD0(2)&DD0(1)&DD0(0)&DU3(3)+3. SIGNAL DU1 : STD_LOGIC_VECTOR( 3 DOWNTO 0 ). DIGITO0 <= DU5. SIGNAL DU3 : STD_LOGIC_VECTOR( 3 DOWNTO 0 ). BEGIN --UNIDADES. SIGNAL DD1 : STD_LOGIC_VECTOR( 3 DOWNTO 0 ). DU2 <= DU1(2 DOWNTO 0)&BYTE(3) WHEN ( (DU1(2 DOWNTO 0)&BYTE(3))<5 ) ELSE DU1(2 DOWNTO 0)&BYTE(3)+3. SIGNAL DU2 : STD_LOGIC_VECTOR( 3 DOWNTO 0 ). SIGNAL DU5 : STD_LOGIC_VECTOR( 3 DOWNTO 0 ). -. --CENTENAS. SIGNAL DD0 : STD_LOGIC_VECTOR( 3 DOWNTO 0 ).

segmentos: out STD_LOGIC_VECTOR (0 to 7) ). Yezid Almanza Pérez • entity Estacionamiento is Port ( rst: in STD_LOGIC. end Estacionamiento. clk: in STD_LOGIC.Entidad Estacionamiento (Integración completa) Código desarrollado por Ing. . SB : in STD_LOGIC. Led: out STD_LOGIC_VECTOR (7 downto 0). SA : in STD_LOGIC. anodos: out STD_LOGIC_VECTOR (3 downto 0).

Segmentos => Seg). Yezid Almanza Pérez architecture Behavioral of Estacionamiento is Signal C : STD_LOGIC_VECTOR (7 downto 0). Signal AComun : STD_LOGIC_VECTOR (3 downto 0). sens_a => SA.Arquitectura Estacionamiento (Integracion completa) por Ing. anodos <= AComun. end Behavioral. sens_b => SB. segmentos <= Seg. clk=> clk. . cuenta => C ). Signal Seg : STD_LOGIC_VECTOR (7 downto 0). CLK => clk. Led <= C. Enable =>AComun. Begin FSM: CuentaAutos_vhd port map (rst => rst. Deco7seg: Binario2Display port map (Byte => C.