名稱:基于VHDL語言的交通信號(hào)燈Quartus仿真
軟件:Quartus
語言:VHDL
代碼功能:
基于VHDL語言的交通信號(hào)燈
具體要求:
設(shè)計(jì)一個(gè)十字路口的交通燈控制器,控制A,B兩條交叉道路上的車輛通行,東西方向?yàn)橹鞲傻繟,南北方向?yàn)楦备傻繠。
具體要求如下:
1、每條道路設(shè)一組信號(hào)燈,每組信號(hào)燈有紅、黃、綠3個(gè)燈組成,綠燈表示允許通過,紅燈表示禁止通行,黃燈表示該車道上已過停車線的車輛繼續(xù)通行,未過停車線的車輛停止通行。
2、主干道通行40秒,南北通行時(shí)間為20秒。
3、每次變換通行車道之前,要求黃燈先亮5s,才能變換通行車道。黃燈亮?xí)r,要求每秒閃爍一次。
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
演示視頻:
設(shè)計(jì)文檔:
1. 工程文件
2. 程序文件
3. 程序編譯
4. RTL圖
5. 仿真圖
整體仿真圖
分頻模塊
50分頻為1Hz
紅綠燈控制模塊
數(shù)碼管顯示模塊
數(shù)碼管顯示倒計(jì)時(shí)
部分代碼展示:
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;--復(fù)位 ??????R1???????:?OUT?STD_LOGIC;--紅綠燈信號(hào) ??????G1???????:?OUT?STD_LOGIC;--紅綠燈信號(hào) ??????Y1???????:?OUT?STD_LOGIC;--紅綠燈信號(hào) ??????R2???????:?OUT?STD_LOGIC;--紅綠燈信號(hào) ??????G2???????:?OUT?STD_LOGIC;--紅綠燈信號(hào) ??????Y2???????:?OUT?STD_LOGIC;--紅綠燈信號(hào) ??????SMG1?????:?OUT?STD_LOGIC_VECTOR(7?DOWNTO?0);--輸出數(shù)碼管顯示數(shù) ??????SMG2?????:?OUT?STD_LOGIC_VECTOR(7?DOWNTO?0)--輸出數(shù)碼管顯示數(shù) ???); END?RGY; ARCHITECTURE?behave?OF?RGY?IS ????SIGNAL??G1_time??:?STD_LOGIC_VECTOR(7?DOWNTO?0);--對(duì)應(yīng)燈時(shí)間 ????SIGNAL??Y1_time??:?STD_LOGIC_VECTOR(7?DOWNTO?0);--對(duì)應(yīng)燈時(shí)間 ????SIGNAL??G2_time??:?STD_LOGIC_VECTOR(7?DOWNTO?0);--對(duì)應(yīng)燈時(shí)間 ????SIGNAL??Y2_time??:?STD_LOGIC_VECTOR(7?DOWNTO?0);--對(duì)應(yīng)燈時(shí)間??? ???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);--正計(jì)時(shí) ????SIGNAL??Y1_BCD???:??STD_LOGIC_VECTOR(7?DOWNTO?0);--正計(jì)時(shí) ????SIGNAL??R1_BCD???:??STD_LOGIC_VECTOR(7?DOWNTO?0);--正計(jì)時(shí) ????SIGNAL??G2_BCD???:??STD_LOGIC_VECTOR(7?DOWNTO?0);--正計(jì)時(shí) ????SIGNAL??Y2_BCD???:??STD_LOGIC_VECTOR(7?DOWNTO?0);--正計(jì)時(shí) ????SIGNAL??R2_BCD???:??STD_LOGIC_VECTOR(7?DOWNTO?0);--正計(jì)時(shí) BEGIN --設(shè)置時(shí)間,可自行修改時(shí)間, --主路紅燈時(shí)間等于支路綠燈加黃燈 --支路紅燈時(shí)間等于主路綠燈加黃燈 ???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";--異步復(fù)位 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";--//計(jì)時(shí)到后切換下一狀態(tài) ??????????????????G1_cnt?<=?"00000001"; ???????????????END?IF; ????????????WHEN?"010"?=>--主路黃燈 ???????????????IF?(Y1_cnt?<?Y1_time)?THEN ??????????????????state?<=?"010"; ??????????????????Y1_cnt?<=?Y1_cnt?+?"00000001"; ???????????????ELSE ??????????????????state?<=?"011";--計(jì)時(shí)到后切換下一狀態(tài) ??????????????????Y1_cnt?<=?"00000001"; ???????????????END?IF; ????????????WHEN?"011"?=>--支路綠燈 ???????????????IF?(G2_cnt?<?G2_time)?THEN ??????????????????state?<=?"011"; ??????????????????G2_cnt?<=?G2_cnt?+?"00000001"; ???????????????ELSE ??????????????????state?<=?"100";--計(jì)時(shí)到后切換下一狀態(tài) ??????????????????G2_cnt?<=?"00000001"; ???????????????END?IF; ????????????WHEN?"100"?=>--支路黃燈 ???????????????IF?(Y2_cnt?<?Y2_time)?THEN ??????????????????state?<=?"100"; ??????????????????Y2_cnt?<=?Y2_cnt?+?"00000001"; ???????????????ELSE ??????????????????state?<=?"001";--計(jì)時(shí)到后切換下一狀態(tài) ??????????????????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;
點(diǎn)擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=598