Diseño de semáforo vhdl

1 Propósito experimental

1. Comprender los patrones de encendido y apagado de los semáforos.

2. Aprenda cómo funcionan los controladores de semáforo.

3. Familiarizado con la programación en lenguaje VHDL y comprender las soluciones de optimización en el diseño real.

2 Requisitos de hardware

1. Una caja de experimentos EDA/SOPC.

Tres principios experimentales

Hay muchas formas de mostrar semáforos, como intersecciones, cruces en T, etc., y existen muchos requisitos de visualización diferentes para la misma intersección, como como intersecciones, si el automóvil solo necesita viajar en dirección este-oeste y norte-sur, será muy simple, pero si el automóvil puede girar a la izquierda y a la derecha, será más complicado. Este experimento solo se centra en lo más simple. situaciones de tráfico recto norte-sur y este-oeste.

Para completar este experimento, primero debes comprender las reglas de iluminación y extinción de los semáforos. Este experimento requiere el uso de diodos emisores de luz en el módulo de semáforo de la caja experimental, es decir, tres LED rojos, amarillos y verdes. Según las normas de tráfico de las personas, "deténgase en el semáforo en rojo, avance en el semáforo en verde y recuerde en el semáforo en amarillo". Las reglas de iluminación y extinción de los semáforos son: el estado inicial es que todas las luces rojas en las dos intersecciones están encendidas, luego las luces verdes en la intersección este-oeste están encendidas, las luces rojas en la intersección norte-sur están encendidas , y el tráfico está abierto en dirección este-oeste. Después de un retraso, las luces verdes en la intersección este-oeste están apagadas. La luz amarilla comienza a parpadear. Después de parpadear varias veces, la luz roja en la intersección este-oeste se enciende y, al mismo tiempo, se enciende la luz verde en la intersección norte-sur y el tráfico comienza a abrirse en dirección norte-sur. la luz verde en la intersección norte-sur se apaga y la luz amarilla comienza a parpadear. Después de parpadear varias veces, cambie a la dirección de la intersección este-oeste y repita el proceso anterior.

En el experimento, se utilizan dos tubos digitales cualesquiera de los ocho tubos de siete segmentos para mostrar la hora. El tiempo de apertura de East-West Road y North-South Road se establece en 20 segundos. La hora en el tubo digital siempre muestra 19, 18, 17...2, 1, 0, 19, 18... Cuando el tiempo de visualización es inferior a 3 segundos, la luz amarilla en la dirección del tráfico parpadea.

Cuatro contenidos experimentales

La tarea para completar este experimento es diseñar un controlador de semáforo simple. La pantalla del semáforo utiliza el módulo de semáforo de la caja experimental y cualquiera de los siete. -Tubos de código de segmento. Dos para mostrar. El reloj del sistema selecciona el reloj de 1 KHz del módulo de reloj. El reloj de luz amarilla debe ser de 2 Hz. La hora del tubo de código de siete segmentos se muestra como un pulso de 1 Hz, es decir, disminuye una vez cada 1 segundo. el tiempo de visualización es inferior a 3 segundos, la luz amarilla en la dirección del tráfico comienza con Parpadeos a una frecuencia de 2Hz. Utilice el botón S1 para restablecer el sistema.

Cinco pasos experimentales

Los pasos experimentales para completar el controlador de semáforo son los siguientes:

1. Primero abra el software Quartus II, cree un nuevo proyecto y cree un nuevo archivo VHDL.

2. Escribe programas VHDL según tus propias ideas.

3. Compile y simule el programa VHDL que escribió.

4. Una vez que la simulación sea correcta, de acuerdo con la tabla de comparación de pines en el Apéndice 1, vincule los pines FPGA correspondientes al reloj, la pantalla de código de siete segmentos y el LED del módulo de semáforo utilizado en el experimento y luego vuelva a compilarlo.

5. Utilice el cable de descarga para descargar el archivo soft correspondiente a la FPGA a través de la interfaz JTAG.

6. Observe si el funcionamiento del controlador del semáforo cumple con los requisitos experimentales.

Nota: este experimento requiere la reutilización de pines

-------------------------- --- ----------------------------------------- --- ---

biblioteca ieee;

usa ieee.std_logic_1164.all;

usa ieee.std_logic_arith.all;

usa ieee .std_logic_unsigned.all;

---------------------------------- ---- ------------------------------

la entidad exp18 es

puerto( Clk : en std_logic; --entrada de reloj

Rst: en std_logic; --reset de entrada

R1,R2: fuera std_logic; --salida de luz roja

Y1,Y2: salida std_logic; --salida de luz amarilla

G1,G2: salida std_logic; --salida de luz verde

Pantalla: salida std_logic_vector(7 abajo a 0); Salida de visualización del tubo de código de siete segmentos

SEG_SEL: buffer std_logic_vector(2 abajo a 0) --Controlador de escaneo de tubo de código de siete segmentos

end exp18); ;

------------------------------------------ --- --------------------

El comportamiento arquitectónico de exp18 es

señal Disp_Temp : rango de enteros 0 a 15;

señal Disp_Decode: std_logic_vector(7 abajo a 0);

señal SEC1,SEC10: rango de enteros 0 a 9;

señal Dirección: rango de números enteros de 0 a 15;

señal Clk_Count1: std_logic_vector(9 hasta 0); --Un contador de división de frecuencia que genera un reloj de 0,5 Hz

señal Clk1Hz: std_logic;

señal Dir_Flag : std_logic --Indicador de dirección

comenzar

proceso(Clk)

comenzar

si (Clk'event y Clk='1') entonces

si(Clk_Count1<1000) entonces

Clk_Count1<=Clk_Count1+1;

else

Clk_Count1<="0000000001";

finalizar si;

finalizar si;

finalizar proceso;

Clk1Hz<=Clk_Count1(9);

procesar(Clk1Hz,Rst)

comenzar

si(Rst='0') entonces

SEC1<=0;

SEC10<=2;

Dir_Flag<='0';

elsif(Clk1Hz'event y Clk1Hz= '1') entonces

si(SEC1=0) entonces

SEC1<=9;

si(SEC10=0) entonces

SEC10<=1;

más

SEC10<=SEC10-1;

terminar si;

más

SEC1<=SEC1-1;

terminar si;

si(SEC1=0 y SEC10=0) entonces

Dir_Flag<=no Dir_Flag;

finalizar si;

finalizar si;

finalizar proceso;

proceso(Clk1Hz,Rst)

comenzar

si(Rst='0') entonces

R1<='1';

G1<='0';

R2<='1';

G2<='0';

else --Operación normal

if(SEC10>0 o SEC1>3) entonces

si(Dir_Flag='0') entonces --paso lateral

R1<='0';

G1<=' 1';

R2<='1';

G2<='0'

más

R1<='; 1';

G1<='0';

R2<='0';

G2<='1';

terminar si;

else

if(Dir_Flag= '0') luego --tráfico lateral

R1<='0';

G1<='0';

R2<='1' ;

G2<='0';

más

R1<='1';

G1<='0' ;

R2<='0';

G2<='0';

finalizar si;

finalizar si;

finalizar si;

finalizar proceso;

proceso(Clk1Hz)

comenzar

si(SEC10>0 o SEC1>3) entonces

Y1<='0';

Y2<='0';

elsif(Dir_Flag='0') entonces

Y1<=Clk1Hz;

Y2<='0';

else

Y1<='0'; p>

Y2<=Clk1Hz;

finalizar si

finalizar proceso;

proceso(Dir_Flag)

comenzar

if(Dir_Flag='0') entonces --horizontal

Dirección<=10;

else --vertical

Dirección< =11;

finalizar si;

finalizar proceso;

proceso(SEG_SEL)

comenzar

caso (SEG_SEL+1) es

cuando "000"=>Disp_Temp<=Direction;

cuando "001"=>Disp_Temp<=Direction;

cuando "010"=>Disp_Temp<=SEC10;

cuando

"011"=>Disp_Temp<=SEC1;

cuando "100"=>Disp_Temp<=Dirección;

cuando "101"=>Disp_Temp<=Dirección;

cuando "110"=>Disp_Temp<=SEC10;

cuando "111"=>Disp_Temp<=SEC1;

finaliza

fin; proceso;

proceso(Clk)

comenzar

si(Clk'event y Clk='1') entonces --scan acumulación

SEG_SEL<=SEG_SEL+1;

Mostrar<=Disp_Decode;

finalizar si;

finalizar proceso;

procesar( Disp_Temp) --Mostrar conversión

comenzar

caso Disp_Temp es

cuando 0=>Disp_Decode<="00111111" --'0'

cuando 1=>Disp_Decode<="00000110"; --'1'

cuando 2=>Disp_Decode<="01011011"; --'2'

cuando 3=>Disp_Decode<="01001111"; --'3'

cuando 4=>Disp_Decode<="01100110"; --'4'

cuando 5=> Disp_Decode<="01101101"; --'5'

cuando 6=>Disp_Decode<="01111101"; --'6'

cuando 7=>Disp_Decode<=" 00000111"; --'7'

cuando 8=>Disp_Decode<="01111111"; --'8'

cuando 9=>Disp_Decode<="01101111"; - -'9'

cuando 10=>Disp_Decode<="01001000"; --'='

cuando 11=>Disp_Decode<="00010100"; --'|| '

cuando otros=>Disp_Decode<="00000000"; --destrucción total

finaliza el caso;

finaliza el proceso

fin beha

ve;