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 las luces rojas en las dos intersecciones están todas 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 encendido 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 de 0 a 15;
señal Disp_Decode: std_logic_vector(7 abajo a 0);
señal SEC1, SEC10: rango de enteros de 0 a 9; p> Dirección de la señal: rango entero de 0 a 15;
señal Clk_Count1: std_logic_vector(9 downto 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'evento y Clk='1') entonces
p>
if(Clk_Count1lt; 1000) entonces
Clk_Count1lt;=Clk_Count1 1;
else
Clk_Count1lt;="0000000001";
finalizar si;
finalizar si
finalizar el proceso;
Clk1Hzlt; (Clk1Hz, Rst)
comenzar
si (Rst='0') entonces
SEC1lt;=0;
SEC10lt; =2;
Dir_Flaglt;='0';
elsif(Clk1Hz'event and Clk1Hz='1') entonces
if(SEC1=0) entonces
SEC1lt;=9;
si(SEC10=0) entonces
SEC10lt;=1;
si no
SEC10lt;=SEC10-1;
terminar si;
else
SEC1lt;=SEC1-1;
finalizar si;
si(SEC1=0 y SEC10=0) entonces
Dir_Flaglt;=no Dir_Flag;
finalizar si;
finalizar si;
finalizar el proceso
proceso(Clk1Hz, Rst)
comenzar
si(Rst='0') entonces
R1lt;='1';
G1lt;='0';
R2lt;='1';
G2lt;='0';
else --operación normal
if(SEC10gt;0 o SEC1gt;3) entonces
if(Dir_Flag='0 ') luego --tráfico lateral
R1lt;='0';
G1lt;='1';
R2lt;='1';
G2lt;='0'
más
R1lt;='1';
G1lt;='0';
R2lt;='0';
G2lt;='1'
fin si;
else
if(Dir_Flag='0') entonces --tráfico lateral
R1lt;='0';
G1lt;='0' ;
R2lt;='1';
G2lt;='0'
else
R1lt;='1'; ;
G1lt;='0';
R2lt;='0';
G2lt;='0';
finalizar si
finalizar si
finalizar si
finalizar el proceso
proceso(Clk1Hz)
comenzar
si(SEC10gt; 0 o SEC1gt; 3) entonces
Y1lt;='0';
Y2lt;='0'; p>
p>
elsif(Dir_Flag='0') entonces
Y1lt;=Clk1Hz;
Y2lt;='0';
else
p>
Y1lt;='0';
Y2lt;=Clk1Hz;
finaliza
finalizar proceso;
proceso(Dir_Flag)
comenzar
si(Dir_Flag='0') entonces --horizontal
Dirección ;=10;
else --vertical
Direcciónlt;=11;
finalizar si;
finalizar proceso;
profesional
cess(SEG_SEL)
comenzar
caso (SEG_SEL 1) es
cuando "000"=gt;Disp_Templt;=Direction;
cuando "001"=gt;Disp_Templt;=Dirección;
cuando "010"=gt;Disp_Templt;=SEC10;
cuando "011"=gt;Disp_Templt;=SEC1 ;
cuando "100"=gt;Disp_Templt;=Dirección;
cuando "101"=gt;Disp_Templt;=Dirección;
cuando "110" =gt;Disp_Templt;=SEC10;
cuando "111"=gt;Disp_Templt;=SEC1;
finalizar caso
finalizar proceso;
procesar(Clk)
comenzar
si(Clk'event y Clk='1') entonces --escanear acumulación
SEG_SELlt;= SEG_SEL 1;
Displaylt; =Disp_Decode;
finalizar si
finalizar el proceso
(Disp_Temp) - mostrar conversión;
comenzar
caso Disp_Temp es
cuando 0=gt;="00111111" --'0'
cuando 1=gt; Disp_Decodelt;="00000110"; --'1'
cuando 2=gt; Disp_Decodelt;="01011011"; --'2'
cuando 3= gt;Disp_Decodelt;="01001111"; --'3'
cuando 4=gt; Disp_Decodelt;="01100110"; --'4'
cuando 5=gt; Disp_Decodelt;="01101101"; --'5'
cuando 6=gt; Disp_Decodelt;="01111101"; --'6'
cuando 7=gt; ="00000111"; --'7'
cuando 8=gt; Disp_Decodelt;="01111111"; --'8'
cuando 9=gt; Disp_Decodelt;="01101111"; --'9'
cuando 10=gt;="01001000"; > cuando 11=gt; Disp_Decodelt;="00010100"; --'||'
cuando otros=gt; Disp_Decodelt;="00000000"; --Destrucción total
caso;
finalizar el proceso
finalizar el comportamiento