名称:多功能交通灯控制系统VHDL十字路口红绿灯倒计时DE2-115开发板(代码在文末下载)
软件:Quartus II
语言:VHDL
代码功能:
要求设计一个多功能交通灯控制系统。并进行软件仿真与硬件实现。要求做到:
(1)主干道绿灯亮时,支干道红灯亮,反之亦然,两者交替允许通行,主干道每次放行60s,支干道每次放行45s.每次由绿灯变为红灯的过程中,黄灯亮3S作为过渡;
(2)能实现正常的倒计时显示功能;
(3)能实现总体清零功能:计数器由初始状态开始计数,对应状态的指示灯亮
(4)能实现特殊状态的功能显示:进入特殊状态时,东西、南北路口均显示红灯状态
(5)在任何一个时刻,有一盏灯亮而且只有一盏灯亮。否则发出故障信号,提醒相关人员去维修。
本代码的通行时间可以设置,如下代码修改即可:
--主、支干道均有车时,两者交替允许通行, --主干道每次放行60秒,支干道每次放行45秒, --设立60秒、45秒计时、显示电路 --设置时间,可自行修改时间, --主路红灯时间等于支路绿灯加黄灯 --支路红灯时间等于主路绿灯加黄灯 ???G1_time?<=?"00111100";--主路绿灯60s ???Y1_time?<=?"00000011";--主路黄灯3s ???G2_time?<=?"00101101";--支路绿灯45s ???Y2_time?<=?"00000011";--支路黄灯3s
要求学生有一定的模拟及数字电子技术知识,对VHDL语言比较熟悉,有一定的动手能力
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
本代码已在DE2-115开发板验证,开发板如下,其他开发板可以修改管脚适配:
演示视频:
设计文档:
1. 工程文件
2. 程序文件
3. 管脚分配
4. 程序编译
5. RTL图
6. 仿真图
整体仿真图
分频模块仿真图
交通灯控制模块
显示模块
部分代码展示:
LIBRARY?ieee; ???USE?ieee.std_logic_1164.all; USE?ieee.std_logic_unsigned.all; --交通灯 ENTITY?Traffic_Light_Control?IS ???PORT?( ??????clk?????:?IN?STD_LOGIC;--50Mhz reset_n?:?IN?STD_LOGIC;--复位 control?:?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;--高电平亮,支路黄灯 alarm???:?OUT?STD_LOGIC;--故障提示 ??????HEX0????:?OUT?STD_LOGIC_VECTOR(6?DOWNTO?0);--数码管0 ??????HEX1????:?OUT?STD_LOGIC_VECTOR(6?DOWNTO?0);--数码管1 ??????HEX2????:?OUT?STD_LOGIC_VECTOR(6?DOWNTO?0);--数码管2 ??????HEX3????:?OUT?STD_LOGIC_VECTOR(6?DOWNTO?0)--数码管3 ???); END?Traffic_Light_Control; ARCHITECTURE?behave?OF?Traffic_Light_Control?IS --分频模块 COMPONENT?CLOCK?IS--?Divide?50MHz?to?1Hz GENERIC(D?:?INTEGER?:=?50000000);--仿真时改小为500加快仿真速度,实际上板验证时改为50000000 ???PORT(CLK:?IN?STD_LOGIC; ?????????DAV:?OUT?STD_LOGIC); ???END?COMPONENT; --显示模块 ???COMPONENT?HEX?IS ??????PORT?( ?????????clk?????:?IN?STD_LOGIC; ?????????SMG_1???:?IN?STD_LOGIC_VECTOR(7?DOWNTO?0); ?????????SMG_2???:?IN?STD_LOGIC_VECTOR(7?DOWNTO?0); ?????????HEX0????:?OUT?STD_LOGIC_VECTOR(6?DOWNTO?0); ?????????HEX1????:?OUT?STD_LOGIC_VECTOR(6?DOWNTO?0); ?????????HEX2????:?OUT?STD_LOGIC_VECTOR(6?DOWNTO?0); ?????????HEX3????:?OUT?STD_LOGIC_VECTOR(6?DOWNTO?0) ??????); ???END?COMPONENT; ??? --交通灯控制模块 ???COMPONENT?RGY?IS ??????PORT?( ?????????clk_1???:?IN?STD_LOGIC; clk???:?IN?STD_LOGIC; reset_n?:?IN?STD_LOGIC;--复位 control?:?IN?STD_LOGIC;----特殊功能 ?????????G1_time?:?IN?STD_LOGIC_VECTOR(7?DOWNTO?0); ?????????Y1_time?:?IN?STD_LOGIC_VECTOR(7?DOWNTO?0); ?????????G2_time?:?IN?STD_LOGIC_VECTOR(7?DOWNTO?0); ?????????Y2_time?:?IN?STD_LOGIC_VECTOR(7?DOWNTO?0); ?????????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?COMPONENT; ??? ??? ???SIGNAL?clk_1??????:?STD_LOGIC; ???SIGNAL?SMG1???????:?STD_LOGIC_VECTOR(7?DOWNTO?0); ???SIGNAL?SMG2???????:?STD_LOGIC_VECTOR(7?DOWNTO?0); ??? ???SIGNAL?R1_led?????:?STD_LOGIC; ???SIGNAL?G1_led?????:?STD_LOGIC; ???SIGNAL?Y1_led?????:?STD_LOGIC; ??? ???SIGNAL?R2_led?????:?STD_LOGIC; ???SIGNAL?G2_led?????:?STD_LOGIC; ???SIGNAL?Y2_led?????:?STD_LOGIC; ??? ???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?led1_cnt????:?STD_LOGIC_VECTOR(1?DOWNTO?0); SIGNAL?led2_cnt????:?STD_LOGIC_VECTOR(1?DOWNTO?0); ??? ???SIGNAL?HEX0_SIG?:?STD_LOGIC_VECTOR(6?DOWNTO?0); ???SIGNAL?HEX1_SIG?:?STD_LOGIC_VECTOR(6?DOWNTO?0); ???SIGNAL?HEX2_SIG?:?STD_LOGIC_VECTOR(6?DOWNTO?0); ???SIGNAL?HEX3_SIG?:?STD_LOGIC_VECTOR(6?DOWNTO?0); BEGIN --每条路led计数 ???led1_cnt<=('0'&?R1_led)?+?('0'&?G1_led)?+?('0'&?Y1_led); led2_cnt<=('0'&?R2_led)?+?('0'&?G2_led)?+?('0'&?Y2_led); --判断是否有2个以上灯亮,若有输出1 alarm<='1'?when(led1_cnt?>?"01"?)?or?(led2_cnt?>?"01")?else?'0'?; ???HEX0?<=?HEX0_SIG; ???HEX1?<=?HEX1_SIG; ???HEX2?<=?HEX2_SIG; ???HEX3?<=?HEX3_SIG; ???R1?<=?R1_led;--主路红灯 ???G1?<=?G1_led;--主路绿灯 ???Y1?<=?Y1_led;--主路黄灯 ???R2?<=?R2_led;--支路红灯 ???G2?<=?G2_led;--支路绿灯 ???Y2?<=?Y2_led;--支路黄灯 ??? --分频到1hz??? ???U_CLOCK?:?CLOCK ??????PORT?MAP?( ?????????clk??=>?clk, ?????????dav??=>?clk_1 ??????); --主、支干道均有车时,两者交替允许通行, --主干道每次放行60秒,支干道每次放行45秒, --设立60秒、45秒计时、显示电路 --设置时间,可自行修改时间, --主路红灯时间等于支路绿灯加黄灯 --支路红灯时间等于主路绿灯加黄灯 ???G1_time?<=?"00111100";--主路绿灯60s ???Y1_time?<=?"00000011";--主路黄灯3s ???G2_time?<=?"00101101";--支路绿灯45s ???Y2_time?<=?"00000011";--支路黄灯3s ??? ??? ?--交通灯控制模块?? ???U1?:?RGY ??????PORT?MAP?( ?????????clk_1????=>?clk_1, clk????=>?clk, reset_n=>reset_n, ?????????control??=>?control, ?????????R1???????=>?R1_led, ?????????G1???????=>?G1_led, ?????????Y1???????=>?Y1_led, ????????? ?????????R2???????=>?R2_led, ?????????G2???????=>?G2_led, ?????????Y2???????=>?Y2_led, ????????? ?????????G1_time??=>?G1_time, ?????????Y1_time??=>?Y1_time, ?????????G2_time??=>?G2_time, ?????????Y2_time??=>?Y2_time, ????????? ?????????SMG1?????=>?SMG1,--数码管显示 ?????????SMG2?????=>?SMG2--数码管显示 ??????); ??? ???--数码管显示模块 ???U3?:?HEX ??????PORT?MAP?( ?????????clk????=>?clk, ?????????SMG_1??=>?SMG1,--数码管数据显示 ?????????SMG_2??=>?SMG2,--数码管数据显示 ????????? ?????????HEX0???=>?HEX0_SIG,--低电平亮 ?????????HEX1???=>?HEX1_SIG,--低电平亮 ?????????HEX2???=>?HEX2_SIG,--低电平亮 ?????????HEX3???=>?HEX3_SIG--低电平亮 ??????); ??? END?behave;
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=263