名称:东西,南北两个方向交通灯设计VHDL代码Quartus仿真
软件:Quartus
语言:VHDL
代码功能:
功能需求
该交通灯控制器要求能显示十字路口东西、南北两个方向的红、黄、绿灯的指示状态。用两组红、黄、绿三种颜色的灯分别作为东西、南北两个方向的红、黄、绿灯。变化规律如下:
(1)东西绿灯亮、南北红灯亮;
(2)东西黄灯亮、南北红灯亮;
(3)东西红灯亮、南北绿灯亮;
(4)东西红灯亮、南北黄灯亮;
(5)东西绿灯亮、南北红灯亮;
(6)依次循环执行……
南北方向是主干道车道,东西方向是支干道车道,要求两条交叉道路上的车辆交替运行,主干道每次通行时间设为30s、支干道每次通行时间设为20s,时间可设置修改。
在绿灯转为红灯时,要求黄灯先亮5s,才能变换运行车道。
要求交通灯控制器具有异步复位功能,在复位信号使能时,能够实现交通灯的自动复位,并要求所有交通灯的状态变化在时钟信号上升沿处。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
1. 工程文件
2. 程序文件
3. 程序编译
4. RTL图
5. 仿真图
整体仿真图
分频模块
红绿灯控制模块
数码管显示模块
部分代码展示:
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);--倒计时时间 ??????SMG2???:?IN?STD_LOGIC_VECTOR(7?DOWNTO?0);--倒计时时间 ??????SEG??:?OUT?STD_LOGIC_VECTOR(7?DOWNTO?0);--数码管段选 ??????SEL???:?OUT?STD_LOGIC_VECTOR(2?DOWNTO?0)--数码管位选 ???); 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);--转为int类型 ???SMG2_int<=Conv_Integer(SMG2);--转为int类型 ???SMG1_ten?<=?SMG1_int?/?10;--时间十位 ???SMG1_one?<=?SMG1_int-?SMG1_ten?*10;--时间个位 ???SMG2_ten?<=?SMG2_int?/?10;--时间十位 ???SMG2_one?<=?SMG2_int-?SMG2_ten?*10;--时间个位 ??? ???PROCESS?(clk) ???BEGIN ??????IF?(clk'EVENT?AND?clk?=?'1')?THEN ???????????geshu?<=?geshu?+?"0000000000000001";?--扫描那个管子的指示位 ??????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;--时间个位 ?????????WHEN?"01"?=> ????????????SEL?<=?"001"; ????????????display_data?<=??SMG1_one;--时间十位 ?????????WHEN?"10"?=> ????????????SEL?<=?"010"; ????????????display_data?<=??SMG2_ten;--时间个位 ?????????WHEN?"11"?=> ????????????SEL?<=?"011"; ????????????display_data?<=??SMG2_one;--时间十位 ?????????WHEN?OTHERS?=> ??????END?CASE; ???END?PROCESS; ??? ???-------段选输出-- ???PROCESS?(display_data) ???BEGIN ??????CASE?display_data?IS--数字显示码 ?????????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;
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=542