软件:Quartus
语言:VHDL
代码功能:
十字路口交通灯控制器的VHDL设计(每班21号以后的单号)
设计要求:利用硬件描述语言和FPGA器件,设计实现一个由一条主干道和一条支干道的汇合点形成的十字交叉路口的交通灯控制器,具体要求如下:
(1)主、支干道各设有一个绿、黄、红指示灯,两个显示数码管。
(2)在主干道和支干道的两个方向上各设有一组绿、黄、红交通灯,其中一个方向是绿灯、黄灯、红灯,另一个方向是红灯、绿灯、黄灯。
(3)数码管以倒计时的方式显示允许通行或禁止通行的时间,主干道每次放行40s60s70s,支干道每次放行20s30s40s50s,在每次由亮绿灯变成亮红灯的转换过程中要亮5s的黄灯作为过渡,并进行减计时显示,时钟信号由实验箱上50MHz分频得到1H。
(4)设置交主干道优先通行电路(选做
各放行定时器的实体名为:XXX放行时间,XXX为自己姓名的首字母。
任务学号对应:21、23、25号选(70150);27、29、31选(60140)33、35、37-选(5030);39、41、43选(40120)。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
1. 工程文件
2. 程序文件
3. 程序编译
4. RTL图
5. 仿真图
整体仿真图
分频模块
红绿灯控制模块
上图显示了主路和支路的红绿灯以及对应的倒计时
数码管显示模块
上图仿真了主路数码管显示10,支路数码管显示18
部分代码展示:
LIBRARY?ieee; ???USE?ieee.std_logic_1164.all; ???USE?ieee.std_logic_unsigned.all; --控制模块 ENTITY?QJP_6040_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?QJP_6040_RGY; ARCHITECTURE?behave?OF?QJP_6040_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?<=?"00111100";--主路绿灯60s ???Y1_time?<=?"00000101";--主路黄灯5s ???G2_time?<=?"00101000";--支路绿灯40s ???Y2_time?<=?"00000101";--支路黄灯5s ???--?Drive?referenced?outputs ???R1?<=?R1_temp;--红 ???G1?<=?G1_temp;--绿 ???Y1?<=?Y1_temp;--黄灯 ???R2?<=?R2_temp;--红 ???G2?<=?G2_temp;--绿 ???Y2?<=?Y2_temp;--黄灯 ??? ???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; ??? ???--控制南北方向交通灯 ???PROCESS?(clk_1) ???BEGIN ??????IF?(clk_1'EVENT?AND?clk_1?=?'1')?THEN ?????????IF?(state?=?"011")?THEN ????????????G2_temp?<=?'1'; ?????????ELSE ????????????G2_temp?<=?'0'; ?????????END?IF; ?????????IF?(state?=?"100"?)?THEN ????????????Y2_temp?<=?'1'; ?????????ELSE ????????????Y2_temp?<=?'0'; ?????????END?IF; ?????????IF?(state?=?"001"?OR?state?=?"010")?THEN ????????????R2_temp?<=?'1'; ?????????ELSE ????????????R2_temp?<=?'0'; ?????????END?IF; ??????END?IF; ???END?PROCESS;
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=528