软件:Quartus
语言:VHDL
代码功能:
基于VHDL语言的交通信号灯
具体要求:
设计一个十字路口的交通灯控制器,控制A,B两条交叉道路上的车辆通行,东西方向为主干道A,南北方向为副干道B。
具体要求如下:
1、每条道路设一组信号灯,每组信号灯有红、黄、绿3个灯组成,绿灯表示允许通过,红灯表示禁止通行,黄灯表示该车道上已过停车线的车辆继续通行,未过停车线的车辆停止通行。
2、主干道通行40秒,南北通行时间为20秒。
3、每次变换通行车道之前,要求黄灯先亮5s,才能变换通行车道。黄灯亮时,要求每秒闪烁一次。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
1. 工程文件
2. 程序文件
3. 程序编译
4. RTL图
5. 仿真图
整体仿真图
分频模块
50分频为1Hz
红绿灯控制模块
数码管显示模块
数码管显示倒计时
部分代码展示:
LIBRARY?ieee; ???USE?ieee.std_logic_1164.all; ???USE?ieee.std_logic_unsigned.all; --控制模块 ENTITY?RGY?IS ???PORT?( ??????clk_1????:?IN?STD_LOGIC; clk????:?IN?STD_LOGIC; reset??:?IN?STD_LOGIC;--复位 ??????R1???????:?OUT?STD_LOGIC;--红绿灯信号 ??????G1???????:?OUT?STD_LOGIC;--红绿灯信号 ??????Y1???????:?OUT?STD_LOGIC;--红绿灯信号 ??????R2???????:?OUT?STD_LOGIC;--红绿灯信号 ??????G2???????:?OUT?STD_LOGIC;--红绿灯信号 ??????Y2???????:?OUT?STD_LOGIC;--红绿灯信号 ??????SMG1?????:?OUT?STD_LOGIC_VECTOR(7?DOWNTO?0);--输出数码管显示数 ??????SMG2?????:?OUT?STD_LOGIC_VECTOR(7?DOWNTO?0)--输出数码管显示数 ???); END?RGY; ARCHITECTURE?behave?OF?RGY?IS ????SIGNAL??G1_time??:?STD_LOGIC_VECTOR(7?DOWNTO?0);--对应灯时间 ????SIGNAL??Y1_time??:?STD_LOGIC_VECTOR(7?DOWNTO?0);--对应灯时间 ????SIGNAL??G2_time??:?STD_LOGIC_VECTOR(7?DOWNTO?0);--对应灯时间 ????SIGNAL??Y2_time??:?STD_LOGIC_VECTOR(7?DOWNTO?0);--对应灯时间??? ???SIGNAL?state????:?STD_LOGIC_VECTOR(2?DOWNTO?0)?:=?"000"; ???SIGNAL?G1_cnt???:?STD_LOGIC_VECTOR(7?DOWNTO?0)?:=?"00000001"; ???SIGNAL?Y1_cnt???:?STD_LOGIC_VECTOR(7?DOWNTO?0)?:=?"00000001"; ???SIGNAL?G2_cnt???:?STD_LOGIC_VECTOR(7?DOWNTO?0)?:=?"00000001"; ???SIGNAL?Y2_cnt???:?STD_LOGIC_VECTOR(7?DOWNTO?0)?:=?"00000001";?? ???--?Declare?intermediate?signals?for?referenced?outputs ???SIGNAL?R1_temp?:?STD_LOGIC:='0'; ???SIGNAL?G1_temp?:?STD_LOGIC:='0'; ???SIGNAL?Y1_temp?:?STD_LOGIC:='0'; ???SIGNAL?R2_temp?:?STD_LOGIC:='0'; ???SIGNAL?G2_temp?:?STD_LOGIC:='0'; ???SIGNAL?Y2_temp?:?STD_LOGIC:='0'; ????SIGNAL??G1_BCD???:??STD_LOGIC_VECTOR(7?DOWNTO?0);--正计时 ????SIGNAL??Y1_BCD???:??STD_LOGIC_VECTOR(7?DOWNTO?0);--正计时 ????SIGNAL??R1_BCD???:??STD_LOGIC_VECTOR(7?DOWNTO?0);--正计时 ????SIGNAL??G2_BCD???:??STD_LOGIC_VECTOR(7?DOWNTO?0);--正计时 ????SIGNAL??Y2_BCD???:??STD_LOGIC_VECTOR(7?DOWNTO?0);--正计时 ????SIGNAL??R2_BCD???:??STD_LOGIC_VECTOR(7?DOWNTO?0);--正计时 BEGIN --设置时间,可自行修改时间, --主路红灯时间等于支路绿灯加黄灯 --支路红灯时间等于主路绿灯加黄灯 ???G1_time?<=?"00101000";--主路绿灯40s ???Y1_time?<=?"00000101";--主路黄灯5s ???G2_time?<=?"00010100";--支路绿灯20s ???Y2_time?<=?"00000101";--支路黄灯5s ???--?Drive?referenced?outputs ???R1?<=?R1_temp;--红 ???G1?<=?G1_temp;--绿 ???Y1?<=?Y1_temp?and?clk_1;--黄闪烁 ???R2?<=?R2_temp;--红 ???G2?<=?G2_temp;--绿 ???Y2?<=?Y2_temp?and?clk_1;--黄闪烁 ??? ???PROCESS?(clk_1,reset) ???BEGIN if(reset='1')THEN state?<=?"001";--异步复位 elsIF?(clk_1'EVENT?AND?clk_1?=?'1')?THEN ?????????CASE?state?IS ????????????WHEN?"001"?=>--主路绿灯 ???????????????IF?(G1_cnt?<?G1_time)?THEN ??????????????????state?<=?"001"; ??????????????????G1_cnt?<=?G1_cnt?+?"00000001"; ???????????????ELSE ??????????????????state?<=?"010";--//计时到后切换下一状态 ??????????????????G1_cnt?<=?"00000001"; ???????????????END?IF; ????????????WHEN?"010"?=>--主路黄灯 ???????????????IF?(Y1_cnt?<?Y1_time)?THEN ??????????????????state?<=?"010"; ??????????????????Y1_cnt?<=?Y1_cnt?+?"00000001"; ???????????????ELSE ??????????????????state?<=?"011";--计时到后切换下一状态 ??????????????????Y1_cnt?<=?"00000001"; ???????????????END?IF; ????????????WHEN?"011"?=>--支路绿灯 ???????????????IF?(G2_cnt?<?G2_time)?THEN ??????????????????state?<=?"011"; ??????????????????G2_cnt?<=?G2_cnt?+?"00000001"; ???????????????ELSE ??????????????????state?<=?"100";--计时到后切换下一状态 ??????????????????G2_cnt?<=?"00000001"; ???????????????END?IF; ????????????WHEN?"100"?=>--支路黄灯 ???????????????IF?(Y2_cnt?<?Y2_time)?THEN ??????????????????state?<=?"100"; ??????????????????Y2_cnt?<=?Y2_cnt?+?"00000001"; ???????????????ELSE ??????????????????state?<=?"001";--计时到后切换下一状态 ??????????????????Y2_cnt?<=?"00000001"; ???????????????END?IF; ????????????WHEN?OTHERS?=> ???????????????state?<=?"001"; ?????????END?CASE; ??????END?IF; ???END?PROCESS; ??? ???--控制东西方向交通灯 ???PROCESS?(clk_1) ???BEGIN ??????IF?(clk_1'EVENT?AND?clk_1?=?'1')?THEN ?????????IF?(state?=?"001")?THEN ????????????G1_temp?<=?'1'; ?????????ELSE ????????????G1_temp?<=?'0'; ?????????END?IF; ?????????IF?(state?=?"010")?THEN ????????????Y1_temp?<=?'1'; ?????????ELSE ????????????Y1_temp?<=?'0'; ?????????END?IF; ?????????IF?(state?=?"011"?OR?state?=?"100")?THEN ????????????R1_temp?<=?'1'; ?????????ELSE ????????????R1_temp?<=?'0'; ?????????END?IF; ??????END?IF; ???END?PROCESS;
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=598
阅读全文
550