基于FPGA 交通灯控制器的设计
要求:1)在十字路口的两个方向上各设一组红绿灯显示的顺序是:其中一个方向是绿,黄,红灯。另一个方向是红 绿 黄灯。
2)设置一组数码管,以倒计时的方式显示。允许通行或禁止通行的时间。其中绿灯 黄灯 红灯的持续时间分别是20S .5S.25S.
3)当各条路中任意一条出现特殊情况如消防车,救护车或其他需要特殊放行的车辆时候个方向上均是红灯亮。倒计时停止且数字灯闪烁,当特殊运行状态传完的时候控制器恢复原状态,继续正常运行。
源程序:
(1)输出模块:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ledshow IS
PORT(
clk,urgen : IN STD_LOGIC;
state : IN STD_LOGIC_VECTOR(1 DOWNTO 0);
sub,set1,set2 : IN STD_LOGIC;
r1,g1,y1,r2,g2,y2 : OUT STD_LOGIC;
led1,led2 : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END ledshow;
ARCHITECTURE a OF ledshow IS
SIGNAL count1,count2 : STD_LOGIC_VECTOR(7 DOWNTO 0); ――1和2路的计数器
SIGNAL setstate1,setstate2 : STD_LOGIC_VECTOR(7 DOWNTO 0);――1和2路计数器的初值
SIGNAL tg1,tg2,tr1,tr2,ty1,ty2 : STD_LOGIC; ――指示灯的临时变量
BEGIN
led1<="00000000" WHEN urgen='1' AND clk='0' ELSE count1;――显示输出
led2<="00000000" WHEN urgen='1' AND clk='0' ELSE count2;
tg1<='1' WHEN state="00" AND urgen='0' ELSE '0'; ――考虑到紧急情况的输出
ty1<='1' WHEN state="01" AND urgen='0' ELSE '0';
tr1<='1' WHEN state(1)='1' OR urgen='1' ELSE '0';
tg2<='1' WHEN state="10" AND urgen='0' ELSE '0';
ty2<='1' WHEN state="11" AND urgen='0' ELSE '0';
tr2<='1' WHEN state(1)='0' OR urgen='1' ELSE '0';
setstate1<= "01000000" WHEN state="00" ELSE ――各个状态的初始值
"00000101" WHEN state="01" ELSE
"01000101" ;
setstate2<= "01000000" WHEN state="10" ELSE
"00000101" WHEN state="11" ELSE
"01000101" ;
label2:
PROCESS (sub)
BEGIN
IF sub'event AND sub='1' THEN
IF set2='1' THEN
count2<=setstate2;
ELSIF count2(3 DOWNTO 0)="0000" THEN count2<=count2-7; ELSE count2<=count2-1; END IF;
――十六进制转换成十进制
g2<=tg2; ――同步化
r2<=tr2;
y2<=ty2;
END IF;
END PROCESS label2;
label1:
PROCESS (sub)
BEGIN
IF sub'event AND sub='1' THEN
IF set1='1' THEN
count1<=setstate1;
ELSIF count1(3 DOWNTO 0)="0000" THEN count1<=count1-7; ELSE count1<=count1-1; END IF;
――十六进制转换成十进制
g1<=tg1; ――同步化
r1<=tr1;
y1<=ty1;
END IF;
END PROCESS label1;
END a;
(2)控制模块:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ledcontrol IS
PORT(
reset,clk,urgen : IN STD_LOGIC;
state : OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
sub,set1,set2 : OUT STD_LOGIC);
END ledcontrol;
ARCHITECTURE a OF ledcontrol IS
SIGNAL count : STD_LOGIC_VECTOR(6 DOWNTO 0);
SIGNAL subtemp: STD_LOGIC;
BEGIN
sub<=subtemp AND (NOT clk) ; ――将电平型信号变为脉冲型,即高电平时输出一个脉冲
statelabel:
PROCESS (reset,clk)
BEGIN
IF reset='1' THEN ――系统复位
count<="0000000";
state<="00";
ELSIF clk'event AND clk='1' THEN
IF urgen='0' THEN count<=count+1;subtemp<='1';ELSE subtemp<='0';END IF;
――经过脉冲电平变换后,使得正常状态时,正常减计数,紧急状态下停止计数
IF count=0 then state<="00";set1<='1';set2<='1';
ELSIF count=40 then state<="01";set1<='1';
ELSIF count=45 THEN state<="10";set1<='1';set2<='1';
ELSIF count=85 THEN state<="11";set2<='1';
ELSIF count=90 THEN count<="0000000"; ELSE set1<='0'; set2<='0';END IF;
END IF; ――控制流程
END PROCESS statelabel;
END a;