📄 交通灯.txt
字号:
自己用VHDL语言写的交通灯控制器,在实验板上能运行,可以应付老师的检查了2006-10-16 19:55:00
1
推荐题目要求:1.主、支路无车时主干路“绿”;
2.若主、支路均有车时,主干路绿45S,支路绿25S,绿灯结束时黄灯亮5S;
3.主、支路传感器信号用按键传递,高电平表示有车。
设计程序清单如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY jtd IS
PORT (clk,msensor,ssensor : IN STD_LOGIC;
mr,mg,sr,sg : OUT STD_LOGIC ; --,showbt
showbt : OUT STD_LOGIC_VECTOR (1 DOWNTO 0); --显示位控制
mmy,ssy : BUFFER STD_LOGIC;
show : OUT STD_LOGIC_VECTOR (6 DOWNTO 0)
); --show : OUT STD_LOGIC_VECTOR (6 DOWNTO 0)
END jtd ;
ARCHITECTURE one OF jtd IS
TYPE state_type IS (A,B,C,D);
SIGNAL state : state_type;
SIGNAL secclk,yellowsec,my,sy : STD_LOGIC;
SIGNAL showclk : STD_LOGIC_VECTOR (1 DOWNTO 0); --后加,LED显示时钟
SIGNAL showdata1,showdata0 : INTEGER RANGE 0 TO 45;
SIGNAL datasignal : INTEGER RANGE 0 TO 9;
BEGIN
getclk: PROCESS ( clk )
VARIABLE clkcount : INTEGER RANGE 0 TO 2; --LED位扫描信号
VARIABLE sclk : INTEGER RANGE 0 TO 600; --秒信号
VARIABLE yellowcou : INTEGER RANGE 0 TO 200; --黄灯闪烁信号
BEGIN
IF clk'EVENT AND clk = '1' THEN
clkcount := clkcount + 1;
sclk := sclk + 1;
yellowcou := yellowcou + 1;
IF clkcount = 2 THEN
showclk <= showclk + '1';
END IF;
IF sclk = 600 THEN
secclk <= '1';
ELSE secclk <= '0';
END IF;
IF yellowcou = 200 THEN
yellowsec <= '1';
ELSE yellowsec <= '0';
END IF;
END IF;
END PROCESS getclk;
jtdp: PROCESS (secclk)
VARIABLE cnt : INTEGER RANGE 0 TO 45;
VARIABLE nclr : BIT; --nclr低电平计数器清零
BEGIN
IF ( secclk'EVENT AND secclk = '1' ) THEN
IF nclr = '0' THEN cnt := 0; --同步清零
ELSE cnt := cnt + 1; --如果nclr不等于零,则计数
END IF;
--END IF;记住
CASE state IS
WHEN A => mr <= '0'; my <= '0'; mg <= '1'; --A状态,主干道绿灯mg亮
sr <= '1'; sy <= '0'; sg <= '0'; showdata1 <= 45 - cnt; showdata0 <= 50 -cnt;
IF ( msensor AND ssensor ) = '1' THEN
IF cnt = 45 THEN
state <= B; nclr := '0';
ELSE state <= A; nclr := '1'; --继续状态A
END IF;
ELSIF (ssensor AND (NOT msensor)) = '1' THEN --若只有之路有车
state <= B; nclr := '0';
ELSE state <= A; nclr := '1'; --继续A状态
IF cnt = 45 THEN cnt := 0; nclr := '0'; --防止计数超过45
END IF;
END IF;
WHEN B => mr <= '0'; my <= '1'; mg <= '0'; --B状态,主干道黄灯my亮
sr <= '1'; sy <= '0'; sg <= '0'; showdata1 <= 5 - cnt; showdata0 <=5 - cnt;
IF cnt = 5 THEN
state <= C; nclr := '0';
ELSE state <= B; nclr := '1';
END IF;
WHEN C => mr <= '1'; my <= '0'; mg <= '0'; --C状态,之路绿灯sg亮
sr <= '0'; sy <= '0'; sg <= '1'; showdata1 <= 30 - cnt; showdata0 <= 25 - cnt;
IF ( msensor AND ssensor ) = '1' THEN
IF cnt = 25 THEN
state <= D; nclr := '0';
ELSE state <= C; nclr := '1';
END IF;
ELSIF ssensor = '0' THEN --若之路无车
state <= D; nclr := '0'; --则为D状态
ELSE
state <= C; nclr := '1';
IF cnt = 25 THEN
cnt := 0; nclr := '0';
END IF;
END IF;
WHEN D => mr <= '1'; my <= '0'; mg <= '0'; --D状态,之路黄灯sy亮
sr <= '0'; sy <= '1'; sg <= '0'; showdata1 <= 5 - cnt; showdata0 <= 5 - cnt;
IF cnt = 5 THEN
state <= A; nclr := '0';
ELSE
state <= D; nclr := '1';
END IF;
END CASE;
END IF;
END PROCESS jtdp;
showp1: PROCESS ( showclk )
VARIABLE data1,data0,data2,data3 : INTEGER RANGE 0 TO 9;
BEGIN
IF showdata1 >= 50 THEN --主路计数显示
data1 := 5; data0 := showdata1 - 50;
ELSIF showdata1 >= 40 THEN
data1 := 4; data0 := showdata1 - 40;
ELSIF showdata1 >= 30 THEN
data1 := 3; data0 := showdata1 - 30;
ELSIF showdata1 >= 20 THEN
data1 := 2; data0 := showdata1 - 20;
ELSIF showdata1 >= 10 THEN
data1 := 1; data0 := showdata1 - 10;
ELSE data1 := 0; data0 := showdata1;
END IF;
IF showdata0 >= 50 THEN
data3 := 5; data2 := showdata0 - 50;
ELSIF showdata0 >= 40 THEN
data3 := 4; data2 := showdata0 - 40;
ELSIF showdata0 >= 30 THEN
data3 := 3; data2 := showdata0 - 30;
ELSIF showdata0 >= 20 THEN
data3 := 2; data2 := showdata0 - 20;
ELSIF showdata0 >= 10 THEN
data3 := 1; data2 := showdata0 - 10;
ELSE data3 := 0; data2 := showdata0;
END IF;
CASE showclk IS
WHEN "00" => showbt <= "00"; datasignal <= data2;
WHEN "01" => showbt <= "01"; datasignal <= data3;
WHEN "10" => showbt <= "10"; datasignal <= data0;
WHEN "11" => showbt <= "11"; datasignal <= data1;
WHEN OTHERS => NULL;
END CASE;
END PROCESS;
showp2: PROCESS ( datasignal )
BEGIN
CASE datasignal IS
WHEN 0 => show <= "0111111";
WHEN 1 => show <= "0000110";
WHEN 2 => show <= "1011011";
WHEN 3 => show <= "1001111";
WHEN 4 => show <= "1100110";
WHEN 5 => show <= "1101101";
WHEN 6 => show <= "1111101";
WHEN 7 => show <= "0000111";
WHEN 8 => show <= "1111111";
WHEN 9 => show <= "1101111";
WHEN OTHERS => NULL;
END CASE;
END PROCESS showp2;
yellow: PROCESS (yellowsec)
BEGIN
IF yellowsec'EVENT AND yellowsec ='1' THEN
IF my = '1' THEN
mmy <= not mmy;
END IF;
IF sy = '1' THEN
ssy <= not ssy;
END IF;
END IF;
END PROCESS;
END one;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -