名稱:東西,南北兩個(gè)方向交通燈設(shè)計(jì)VHDL代碼Quartus仿真
軟件:Quartus
語(yǔ)言:VHDL
代碼功能:
功能需求
該交通燈控制器要求能顯示十字路口東西、南北兩個(gè)方向的紅、黃、綠燈的指示狀態(tài)。用兩組紅、黃、綠三種顏色的燈分別作為東西、南北兩個(gè)方向的紅、黃、綠燈。變化規(guī)律如下:
(1)東西綠燈亮、南北紅燈亮;
(2)東西黃燈亮、南北紅燈亮;
(3)東西紅燈亮、南北綠燈亮;
(4)東西紅燈亮、南北黃燈亮;
(5)東西綠燈亮、南北紅燈亮;
(6)依次循環(huán)執(zhí)行……
南北方向是主干道車道,東西方向是支干道車道,要求兩條交叉道路上的車輛交替運(yùn)行,主干道每次通行時(shí)間設(shè)為30s、支干道每次通行時(shí)間設(shè)為20s,時(shí)間可設(shè)置修改。
在綠燈轉(zhuǎn)為紅燈時(shí),要求黃燈先亮5s,才能變換運(yùn)行車道。
要求交通燈控制器具有異步復(fù)位功能,在復(fù)位信號(hào)使能時(shí),能夠?qū)崿F(xiàn)交通燈的自動(dòng)復(fù)位,并要求所有交通燈的狀態(tài)變化在時(shí)鐘信號(hào)上升沿處。
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
演示視頻:
設(shè)計(jì)文檔:
1. 工程文件
2. 程序文件
3. 程序編譯
4. RTL圖
5. 仿真圖
整體仿真圖
分頻模塊
紅綠燈控制模塊
數(shù)碼管顯示模塊
部分代碼展示:
LIBRARY?ieee; ???USE?ieee.std_logic_1164.all; ???USE?ieee.std_logic_unsigned.all; ???USE?ieee.std_logic_arith.all; --顯示模塊 ENTITY?display?IS ???PORT?( ??????clk??:?IN?STD_LOGIC;--50MHz ??????SMG1????:?IN?STD_LOGIC_VECTOR(7?DOWNTO?0);--倒計(jì)時(shí)時(shí)間 ??????SMG2???:?IN?STD_LOGIC_VECTOR(7?DOWNTO?0);--倒計(jì)時(shí)時(shí)間 ??????SEG??:?OUT?STD_LOGIC_VECTOR(7?DOWNTO?0);--數(shù)碼管段選 ??????SEL???:?OUT?STD_LOGIC_VECTOR(2?DOWNTO?0)--數(shù)碼管位選 ???); END?display; ARCHITECTURE?behavioral?OF?display?IS ??? ???SIGNAL?SMG1_ten??:?INTEGER?:=?0;? ???SIGNAL?SMG1_one??:?INTEGER?:=?0;? ???SIGNAL?SMG2_ten?:?INTEGER?:=?0;? ???SIGNAL?SMG2_one?:?INTEGER?:=?0;? SIGNAL?SMG1_int??:?INTEGER?:=?0;? SIGNAL?SMG2_int??:?INTEGER?:=?0; ??? ???SIGNAL?display_data??:?INTEGER?:=?0;? ???SIGNAL?select_num????:?STD_LOGIC_VECTOR(31?DOWNTO?0)?:=?"00000000000000000000000000000000"; ???SIGNAL?geshu?????????:?STD_LOGIC_VECTOR(15?DOWNTO?0)?:=?"0000000000000000"; BEGIN ???SMG1_int<=Conv_Integer(SMG1);--轉(zhuǎn)為int類型 ???SMG2_int<=Conv_Integer(SMG2);--轉(zhuǎn)為int類型 ???SMG1_ten?<=?SMG1_int?/?10;--時(shí)間十位 ???SMG1_one?<=?SMG1_int-?SMG1_ten?*10;--時(shí)間個(gè)位 ???SMG2_ten?<=?SMG2_int?/?10;--時(shí)間十位 ???SMG2_one?<=?SMG2_int-?SMG2_ten?*10;--時(shí)間個(gè)位 ??? ???PROCESS?(clk) ???BEGIN ??????IF?(clk'EVENT?AND?clk?=?'1')?THEN ???????????geshu?<=?geshu?+?"0000000000000001";?--掃描那個(gè)管子的指示位 ??????END?IF; ???END?PROCESS; ??? ??? ???PROCESS?(geshu)--位選切換 ???BEGIN ??????CASE?geshu(5?downto?4)?IS---仿真將geshu(15?downto?14)改為geshu(5?downto?4) ?????????WHEN?"00"?=> ????????????SEL?<=?"000"; ????????????display_data?<=??SMG1_ten;--時(shí)間個(gè)位 ?????????WHEN?"01"?=> ????????????SEL?<=?"001"; ????????????display_data?<=??SMG1_one;--時(shí)間十位 ?????????WHEN?"10"?=> ????????????SEL?<=?"010"; ????????????display_data?<=??SMG2_ten;--時(shí)間個(gè)位 ?????????WHEN?"11"?=> ????????????SEL?<=?"011"; ????????????display_data?<=??SMG2_one;--時(shí)間十位 ?????????WHEN?OTHERS?=> ??????END?CASE; ???END?PROCESS; ??? ???-------段選輸出-- ???PROCESS?(display_data) ???BEGIN ??????CASE?display_data?IS--數(shù)字顯示碼 ?????????WHEN?0?=> ????????????SEG?<=not"11000000"; ?????????WHEN?1?=> ????????????SEG?<=?not"11111001"; ?????????WHEN?2?=> ????????????SEG?<=?not"10100100"; ?????????WHEN?3?=> ????????????SEG?<=?not"10110000"; ?????????WHEN?4?=> ????????????SEG?<=?not"10011001"; ?????????WHEN?5?=> ????????????SEG?<=?not"10010010"; ?????????WHEN?6?=> ????????????SEG?<=?not"10000010"; ?????????WHEN?7?=> ????????????SEG?<=?not"11111000"; ?????????WHEN?8?=> ????????????SEG?<=?not"10000000"; ?????????WHEN?9?=> ????????????SEG?<=?not"10010000"; ?????????WHEN?OTHERS?=> ??????END?CASE; ???END?PROCESS; ??? ??? END?behavioral;
點(diǎn)擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=542