0% found this document useful (0 votes)
263 views14 pages

Parking Control System - VHDL

Parking control system in language VHDL for implementing in FPGA
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF or read online on Scribd
0% found this document useful (0 votes)
263 views14 pages

Parking Control System - VHDL

Parking control system in language VHDL for implementing in FPGA
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF or read online on Scribd
You are on page 1/ 14
Informe de Laboratorio 2 Implementacién de Control de Estacionamiento en FPGA utilizando Maquinas de Estado Crescitelli, A. Maximiliano Introduccion a la Mierofabrieacion y FPGA — Instituto Balseiro 1 de Septiembre de 2014 1 INTRODUCCION Con el objetivo de aplicar los conocimientos adquiridos en el diseiio y sintetizacién de maquinas de estado en una FPGA, se desarroll un circuito que permite tener un conteo de la’cantidad de vehiculos que hay dentro de un estacionamiento. Para detectar el ingreso y egreso de vehiculos se utilzan dos sensores, los cuales se simulan utilzando dos interruptores del kit de desarrollo, El conteo se muestra en un display de 7 segmentos. Por razones de tiempo no se aleanzé a impkmentar el circuito para contar hasta 9999 utiizando los 4 displays que disponia el kit, por lo cual el contador solo lega hasta el nimero F (en hexadecimal). ‘Tampoco se realizé el control para evitar contar nimeros negatives. Si bien puede realizarse con bos interruptores, es un caso que no podria darse en la vida real, dado que el contador comienza en cero, y no es posible que egresen mis vehiculos de los que ingresaron, En ka siguiente secciin se describe el disefio del circuito, con sus correspondientes bloques, y el cédigo realizado. En la seccidn 3 se hablara sobre las simulaciones que se hicieron para testear el circuito. 2 ESTRUCTURA DEL CIRCUITO Para realizar el contador de vehicules se dividis el trabajo encinco médulos que realizan distinas tareas para desacoplarlas partes y poder reutiizarlas en el futuro como médulos individuales. Cada sensor entra a un médulo anti-rebote el cual fue provisto por la eitedra, para amortiguar el rebote producido por cada interruptor. Una vez que se tienen las salidas de los sensores limpias, las mismas entranal médulo que controla la entrada y salida de vehiculos al estacionamiento, Este es el modulo que se desarrolls para este trabajé yal cual se le dari el mayor énfasis. EI mismo, posee una méquina de estados que entrega como Salida. dos Seffales que controlan el contador, ya sea para incrementar o decrementar la cuenta. ‘Como contador se utilizé un médulo creado previamente, el cual, en su salida, entrega el conteo en forma hexadecimal, que luego es convertido a7 segmentos con el médulo implementado en practicas anteriores. Cémo el médulo que controla el ingreso 0 egreso de vehicubos al estacionamiento, de ahora en mis méxlulo “parking”, es el nico que tuvo que disefiarse en esta préctica, se omiten la explicacion, el e6digo, y las simulaciones de los médulos restantes. 2.1. Médulo Parking Para controlar el ingreso 0 egreso de vehiculos se cuenta con dos sensoreso lasers, separados por una cierta distancia, Cuando un vehiculo ingresa corta el haz. del primer laser, y luego del segundo. En el caso del egreso funciona de la misma manera pero en sentido inverso. Se consideran los casos en que un vehiculo solo corta un lisery luego retrocede. En dichos casos el conteo no debe cambiar. En la figura I se muestra un esquema de lo {que se considera un ingreso (0 un egreso) normal. Sensor @ Sensor 1 Sensor 9 Sensor 1 Sensor © Sensor 1 Sensor 6 Sensor 1 Sensor @ Sensor 2 atin g oo o CL J} iC) d (a) e) vebseute } } C bo § 8 Figura 1. Secuencia de corte de los dos sensores en un ingreso vehicular (0 egreso con los sensores invertidos) Para realizar el control de entrada y salida con los sensores se diseflé una méquina de estado. La misma utiliza dos entradas “a” y “b” correspondientes al “sensor0™ y “sensor!” respectivamente y dos salidas de Moore llamadas “counter_enable” e “incremento”. En la tabla 1 se muestran ls diferentes acciones que se realizan segin las posibles combinaciones de las salidas de la méquina de estado mencionada, counter_enabl| incremento ‘Accién 0 0 No cuenta 0 0 ‘No cuenta 1 1 Manda sefial para incrementar el contadoren una unidad 1 0 Manda sefial para decrementar el contador una unidad. Tabla I. Accin que ejecuta el contador segiin la salida de la méquina de estado del médulo parking. La méquina de estado que se implement6, considerando también las situaciones en que el vehiculo pasa por alguno de los sensores pero no terminar de eruzar ambos, se muestra en la figura 2 Figura 2, Maquina de estado implementada para el médulo parking, Cada circunferencia muestra en la parte superior el nombre del estado y en la parte inferior ls salidas. El primer digo corresponde al counter_enable y el segundo al incremento. Se tienen seis estados intermedios para legar a incrementar o decrementar el contador. Con dichos estados se simula la secueneia de activaciéin de los sensores, y es posible controlar que no se active el contador si el vehiculo no cruza efectivamente ambos sensores. Las sefiales de entrada que activan cada transicién se muestran en las flechas, donde las formas a’ y b’ se utiizan para denotar cada variable de forma negada. A continuacién se muestra el ¢6 igo del médulo parking. Los detalles se incluyen en los comentarios del eédigo. Library IEEE; vse TEEE.STD_LOGEC_1164.aLL; entity parking is Puertes ~ parking ~ por ( elk, reset: in stdlogics a, br in st_logicy ~-Bntradas de los sensores. count_enable out std_logic; --activa el contador. incremento: out std_logic --bandera para increment. end parking; - AQUITECTURA - parking ~ avehitecture Rehavioral of parking is --creo las senales correspondlentes 2 la maquina de estados type statestype is (50, 51, 52, 53, 64, 55, 86, entrada, salidal; signal state-reg, state_next: statesType; begin ~ Registre de estado actual process(clk, reset) begin is(zeset="1") then state_reg <- 30; -- s0 es el estado inicial elsif (rising_edge(elk)) then atate_vag <- state_next; —camhic de estado an los flancos ascendantas end if; end process; — usgica del proximo Estado —— process(state_reg, ay b) begin state_next <= state_reg; --Valor por defecte: case atate_eeg is 20 when 90 if (a = "1" and b="0") then state_next < al; elsit (a= 10" and be '1') chen state_next < ad; end ify sl when al ~ be (a= Mit and b= 1") then statenext < 92; elsif a= ‘0* and b= 0") then state next < 0; 58 59 50 61 52 53 6a 55 66 67 58 69 70 an R 73 va 75 16 n 78 79 20 a1 32. 83 24 85. 86 ar 38 29 30 21 92 93 94 35 26 97 98 99 100 101 102 203 104 105 106 107 108 109 110 a 112 113, 14 end if - 52 — when 52 Sf [a= "0! and & = 11") then state next <- 937 elsif (a= "1% and b = '0*) then atate_next <= al; end if; - 53 when 53 if (a= '0' and b = '0*) then state_next <= entrada; elsif (a= "It and b= "1") then state next <= 827 end if; sf when s4 if (a= '0' and b = '0*) then state next <= 90; elsif {a= "1! and b= '1") then state_next <= 05; end if; =5 when 85 =) if (a- '0' and b= '1*) then state_next <- sd; elsif (a= '1* and b= '0") then state next <= 96; end ifs =6 when 96 —) if (a= "1" and b= '1*) then state_next <= 95; elsif {a = '0* and b= '0') then state next <= salida; end ifs entrada — ‘Cuando se encuentra en el estado de entrada, simplemente cuenta un vehiculo y vuelve al estado inicial luago de un clock sin esperar un camble de variables de entrada. when entrada -> state next <= 90; ealida Cuando se encuentra en 21 estado de salida de un vehiculo, decrementa un vehiculo y vuelve al estado inicial luego de un clock sin esperar un cambio de variables de entrada. 115 hen salida => 116 state_next <- 30; 417 ua end cases 19 120 end process; a2t 122 Salidas (Moore) 123 124 ocass (state_reg) begin 125 126 case state_reg is 127 =-Count_enable representa la entrada "en" del 128 “Incremento representa la ent 123 Cuando count_enable vale 1, entonces si incremento 120 “vale 1 incrementa una unsdad el contador, sino si 231 --incremento vale 0, decrementa una unidad ¢1 mismo. 132 133, when 80 | s1 | 52 | 83 | s41 85 | 96 134 count_enable <= '0'; 135 ineremento <> "0's 136 137 “-cuando esta en el estado de entrada cuenta un vehicule 138 nhen entrada => 133 count_enable <= '1'; 140 ineremento <> "1; a4, uaz --cuando esta en el estado de salida decrementa un vehicu 143 nhen salida => 14a count_enable <= "1"; 145 incremento <= '0 146 147 end cases 143 aaa end process; 150 151 and Behavioral; 2.2. Médulo Top. Este midulo es el que se encarga de interconectar al esto. El mismo tiene en sus entradas fos dos sensores de vehiculos llamados sensor0 y sensorl, que pueden tomar ls valores légicos | 0 0 segtin el vehiculo esté cortando el paso del kiser 0 ‘no, Ademis, por ser un circuit secuencial se tienen como entradas al midulo una seial de clock y un reset. A la salda se tiene un vector de 8 bits que se comresponde con la salida del conversor hexadecimal a 7 segmentos, y ademis, tiene una salida de 4 bits Hamada “an” , la cual se utiliza para activar uno de los cuatro displays que posee la FPGA utiliada enestetrabajo. En ba figura 3 se muestra un diagrama en bloges del Médulo Top. HexTo7Seq =] debounce_unitd HexTo7Seg_unit debounce_unitt xST_VCC Top Figura 3. Diagrama en blogues de! médulo Top A continuacidn se expone el eédigo, con los respectivos detalles en los comentarios del mismo. au 22 23 24 25 26 27 28 29 30 3L 32 33 34 35. 36 a 38 39) 40 4a 42 43 44 45 46 a0 48 49 50 SL 52 53. 34 55 56. Library IEEE use IEEE, STD_LOGIC_1164.ALL; use IEEE.NUMBRIC_STD.ALL; entity Top is --Cantidad de bits que tendra el contador .En este caso cuento hasta 15 en --Hexadecimal. generic(N: integer := 4); - PUERTOS - TOP ~- port ( clk, reset: sensor0, sensorl =-Salida del contador de autos dentro del parking area codificado para los in std_logics in sta_logic; --entradas de los sensores =-7 segmentos y el punto decimal sseq: out std_logic_vector(7 downto 0}; =-Vector de habilitacion de los displays de la an: out std_logic_vecter(3 downto 0) iy end Top: -RQUITECTURA - TOP ~ architecture Behavioral of Top is Signals ~ constant ceros: std_logic_yector(N-1 downto 0):=(others=>'0'); --Senales que sirven como buffer para interconectar las salidas --de los distintos modulos, con la salida del modulo Top. --sensores debouncea signal about0: std_logicy signal aboutl: etd Logie; =-Salidas del parking para activar contador. signal count_enablel: std_icgic; --entrada "en" del contador signal incrementol: std_logic; --entrada "up" del contador --contee en binarie signal contador: std_logic_vector(N-1 downto 0); --cables al aize de entradas que no uso. signal null0, nulll: std_logie; Componentes: = HexTovseq component HexTo7Seg is port ( hexa: in std_logic vector (3 downto 0); dp: in std_logic; seg: out std_logic_vector(7 downto 0) 57 58 59 60 61 62 63 64 65 66 67 68 68 0 n 2 3 " 5 16 n " 9 20 a 2 aa 8a as 86 2 38 9 30 9a 92 93 94 95 96 97 98 99 100 101 102 103 104 105, 106 107 108 109 rety 1a 112 113 uM end component; component db_fam is port ( elk, reset: in sta logics sw: in std_logicy db: out std_Logic ds end component; - univ_bin_counter component univ_bin counter ie generic (N: integer := 4); port ( elk, reset: in std_logics syn_clr, load, en, up: in std_logicy dz in std_logic_vector(N-1 downto 0); max_tick, min_tick: out std logics gz Sut std_logic_vector (N-1 downto 0) ds end component; parking ~ component parking is port ( elk, reset: in sta_logics a, b: in std_logic; ~-Entradas de los sensores (a = sensor0, b = sensori). count_enable: out std_logicy ~-activa el contador. incremento: out std_logic -~incrementa o decrementa el contador » end component; begin - Instancias a Modulos ~ Colocacion de modulos dentro del Top y mapeo de puertos --unidadad conversor de hexadecimal a 7 Segnentoe HexTo7Seq_unit: HexTo?Seg --Para el display 0 port map(hexa => contador, dp => '1", sseg => sseg)y --Unidadad Antirrebote para el sensor 0 Gebounce_unit0: db_fen port map(clk => clk, reset reset, sw => sensor0, db => db0ut0); --Unidadad Antirrebote para el sensor 1 debounce_unitl: db_fsm port map(clk => elk, reset => reset, ew => sensorl, db -> about); --Unidadad Parking (Maquina de estado) Parking_unit: parking port map(clk => clk, reset abouto, b about, aia count_enable => count_enablel, incremento => incrementol); 115, 16 --Unidadad Contador uy Counter_unit: univ_bin_counter us generic map (N => 4) 19) port map(clk => clk, reset => reset, syniclr => '0', load => '0", 120 d => ceros, max_tick => null0, min tick => nulll, 421 en => count_enablel, up =» incrementol, q => contador); 122 123 124 ans" 7 ~-Apago todos los displays y dejo solo encendido el priemro. 125 126 end Behavioral; 3 SIMULACIONES, Para poder testear la respuesta del médulo disefiado (parking), se realizaron simulaciones. para todos los posibles casos de ingresos y egresos que pueden darse. Luego se intent6 realizar una simulaciin sobre el médulo Top para cevaluar la integracién final pero no pudo ser concretada con éxito, Se encontraron falas en la respuesta del anti- rebote. Se eree que las mismas son debidas a errores en la programacion de las sefiakes de clock en las simulaciones, ya que, una vez en la FPGA el funcionamiento era correcto. ‘Acontinuacién se expone el e6digo de las simulaciones del médulo parking. Los detalles y los casos evaluados se comentan en el mismo c6dio. 1 LIBRARY ieee; 2 USE iece.std_logic_1164.ALLy 4 5 ENIUIY Paieing teat 19 6 END Parking Test; 8 ARCHITECTURE behavior OF Parking_Test 1S 20 COMPONENT parking ~ - a a2 coMponeNr parking 3 PORT( aa elk + IN std_logies a5 reset : IN std_logicy 16 af IN std looiss a7 bt IN std_logicg ae count_enable : OUP std_loaiey as incremento : QUT ata logic 20 ds a1 END COMPONENT; 22 23 24 - 25 signal clk : stdlogic + 26 signal reset 1 ssa logis 27 signal a: stdlogic i= "0"; 28 signal b: stdlogic i= '0"7 29 a0 - outputs aa signal eount_enable : std_logicy 32 signal incremento : std_logicy 33 aa ~ Clock period definition ~ - as constant elk period + time := 2 ney a7 BEGIN 38 39 40 a 42 a aa 45 46 a7 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 6a 65 66 67 68 69 70 n 2 73 mM 15 76 ” 78 19 20 al 82 83 ea 85 86 87 88 89 90 oa 22 93 oa Instantiate the Unit Under Test (UUT) wut: parking PORT MAP ( clk => clk, reset => reset, cownt_Snable => count_enable, ineremente => Incvemento Proceso de Clock elk_process :process begin clk <= 10"; wait for clk period/2; clk <- "1"; wait for clk_period/2; end proces: Proceso Estimulo ~ stimproc: process begin --tnicializo eenales reset <= 10"; caso 1 Ingresoe de vehiculos. Se evalua el caso de un ingreso normal el cual se concreta luego de que se apaga el segundo sensor D. Ademas se evaluan los tres posibles casos en que el aute comienza a entrar pero luego retrocede, es decir, ea detectado por el primer sensor y/o por el segundo, pero no terminar de ‘pasar por el segundo 1.1 Ingreso normal. La secuencia de los estades de los sensores es: “> ab! -> ab -> ath -> a'bt as 104; b abt -> atb! a <9 10"; b ce 107 wait until falling edge (elk) ¢ a <0 18; Doce 1047 wait until falling edge (elk); a <0 109; bce 1047 wait until falling_edge (elk) 5 assert (count_enable = '0" and ineremente <= 10") report “Fallé 1a secuencia 1.2 de intento de ingreso" severity failures 25 96 7 98 99 100 101 102 103 104 103 105 107 108, 109 aio un a2 3 4 aus, 16 17 11a 13 120 12k 122 123 12a 125, 126 127 128 129 130 asi 132 133 134 135 136 137 138 133 140 aan 142 143 14a 145, 146 147 148. 149 150 151 152 ass 15a 155, --1.3 Intente de ingreso. La secuencia de los estados de los “-sensores eet ab’ —> ab! > ab -> ab! —> at’ as 10%; b co 10%; wait until falling edge(elk)s ase 14; bso 104; wait until falling edge(elk}s ae 1%; bce '1'; wait until falling edge (elk); ase 14; b <= 10%; wait until falling edge elk); ae 10%; bce 10%; wait until falling edgedelk); assert (count_enable = ‘0 and ineremente <= '0") report "Fallé la secuencia 1,3 de intento de ing severity failure; “-L.4 Intente de ingreso. La secuencia de los estados de los “-sensores ee: a'b! -> ab! -> ab -> a'b > ab -> ab! -> atb! a <7 1047 bso 104; wait until falling edge(elk)s ase 14; bce 10%; wait until falling edge(elk}s ase; bce t1t; wait until falling edge (elk); a <= 10"; b <= ‘14; walt until falling edge (elk); ace tlt; bce 114) wait until falling edge(eik)} a <= '1'; b <= 1047 walt until Falling edge (elk); a <= '0'; b <= 10%; wait until falling edge(elk) 7 assert (count_enable = '0" and incremento <= 10") report "Fall6 a secue: severity failures @ 1.4 de intento de ingreso" - caso 2 ~ Eqresos de vehiculos. Se evalua el caso de un egreso normal el cual se concreta luego de que se apaga el sensor "a". Ademas se evaluan los tres posibles casos en que el aute comlenza a egrecar pero luego retrocede, es decir, es detectado por el segundo sensor y/o por el segundo, pero no termina de pasar por el 2.1 Egreso Normal. La secuencia de los estados de los sengores es: a'b! -> a'b-» ab -> ab! -> a'b? a <= 10"; b <= 10%} wait until falling_edgeteik); a <= 10"; b <= 1%; wait until falling edge(cik) aso tlt; b < ‘14; wait until falling_edge(elk) ; aco '1'; bce 10%; wait until falling edge(cik); a <= 10"; b <= "0%; wait until falling edgetcik); assert (count_enable = '1' and incremento <= '0") report "Fallé la secuencia de Egreso" severity failure; =-2.2 Intento de egreso. La secuencia de los estados de los --sensores es: a'b! -> a'b -> a'b! a <0 101; b < 04; wait until falling_edgetelk) a <= 101; <= 14; wait until falling edge (elk) as 101; b < 10%} wait until falling_edge(elk) assert (count_enable = '0' and ineremente <= 10") report "Fallé la secuencia 2.2 de intento de severity failure; severity failure; 156 Intento de eqreso. La secuencia de los estados de los as? --sensores €: a'b! -> a'b -> ab -> a'b —> a'b! 158 159 a a'b -> ab -> ab! —> ab > a'b > ato! in 172 b <= 10"; wait until falling edge (elky; 173 b c= '1'; wait until falling edge (elk; 4 b