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> 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;